ksnk / scaner
Scaner 工具
Requires
- php: >=7.0
- ext-curl: *
Requires (Dev)
- phpunit/phpunit: ^4.8.35 || ^5.7 || ^6.4 || ^7.0
README
项目的主要目的是为网站上的应用程序调试和维护提供一个舒适的环境。为此,除了系统内核外,还安装了一个目标场景,其中描述了所有必要的操作。
以下是系统内核中一些类的描述。
Autoload
支持PSR-0的静态类。与竞争对手相比,主要优势是紧凑和通用。支持在phar中运行和扫描类,无论是在文件系统(优先级)还是在phar内部。如果存在,将自动连接到composer的autoload。
\Autoload::map(['\\Ksnk\\scaner' => '']);
在搜索文件时,所有具有此前缀的类都将被搜索为没有此前缀的类。
\Autoload::register(['~/libs/template', '~/template']);
添加搜索文件的目录
方法
-
register(...) - 参数 - 目录数组,其中将启动搜索。同时启动autoload加载器。
\Autoload::register(['~/libs/template', '~/template']); -
map - 参数 - 关联数组
类=>无扩展名文件名\Autoload::map(['\\Ksnk\\scaner' => '']); -
find - 根据文件名搜索。在文件系统中搜索,然后是phar(如果有)。如果以
~符号开头,则替换为系统索引目录。 (索引常量INDEX_DIR或autoload.php文件所在的目录)
示例
Autoload::register(array('~/core', '~/libs', '~')); - 添加目录,常量~替换为在INDEX_DIR中定义的目录。如果没有定义常量,则使用包含autoload.php的目录。
Autoload::map(array('xSphinxDB'=>'xDatabaseLapsi')); - 初始化类xSphinxDB时将包含文件xDatabaseLapsi.php。
Scaner
扫描器旨在对文本进行简单的解析。分析对象可以是字符串或文件名。
扫描器方法
-
found - 逻辑属性。在每次搜索后设置。在搜索结果中找到了某些内容或没有。
-
finish - 分析文本的长度。对于handle类型的文本,不设置。
-
position(int) - 将光标设置在文本中的指定位置。
-
newbuf(string) - 新文本作为字符串
-
newhandle(string|handle) - 新文本作为文件名或打开的handle
-
getResult - 获取最后一次扫描的结果。
-
scan (reg/pattern,[N,Name,...]) 方法将正则表达式或字符串应用于文本,从当前光标位置开始搜索。如果搜索成功,则光标移动到最后一个找到的字符串的最后一个字符。如果使用正则表达式,则在搜索结果中将写入正则表达式捕获组中指定的值。如果使用字符串,则结果将包含包含子字符串的整个字符串。
-
syntax - 简单的语法分析。例如,分析标签属性。
$scaner->scan('~<link~si')->until('~>~si')->syntax([ 'tag' => '\w+', 'value' => '(?:"[^"]*"|\'[^\']*\'|[^\'">]*)' ], '~:tag:=:value:(?<fin>)~sm', function ($line) use (&$link) { if($line['tag']=='rel') $link['rel']=trim($line['value'],'"\''); if($line['tag']=='href') $link['href']=trim($line['value'],'"\''); return true; }); $scaner->until();
JobList
JobList 是一个类,用于存储任务列表并按顺序执行它。
任务通常以类-脚本的形式编写。
为每个脚本文件创建一个数据存储区域。对于脚本,数据存储区域透明地恢复和保存。作为Joblist(讨论)的属性可用。在执行脚本时,在创建任务列表时,数据存储区域被重置。整个脚本的输出通过标准输出函数保存到这个区域,如果没有立即将输出发送给客户端,则将其输出到控制台。
JL自身(在控制台或web应用程序中显式执行命令)可以启动某个脚本方法。之后,脚本可以将新任务添加到其中,并指定参数。
事件系统
脚本可以在暂停以等待用户输入参数(提示)时暂停。脚本对用户事件做出反应 - 暂停/重置脚本。
可以执行以下任务,可以保存 JL 并从保存中恢复它。任务保存和恢复使用常规的 JSON 序列化。每个任务都是原子的,不能被中断。这意味着所有任务都应该快速执行。特别是,这意味着如果任务确实需要长时间执行,则该任务应有机会再次添加到相同的 JobList。
JL 方法
- store/load,参数 - 存储资源的名称
- appendJob(array(class,method), paramlist) - 向列表添加新任务。每个参数必须是可序列化的
- append_scenario (callable, paramlist) - 从现有场景添加新方法。
- donext(timeInSeconds) - 继续执行任务,直到耗尽指定的秒数。
Task
JobList 中插入的是特殊的函数作为任务。
场景文件
场景文件格式
场景文件是一个或多个具有特殊标记的文件,这些标记自动构建用于输入参数和调用类函数的表单元素。
场景类描述中必须包含 tags 标签
/**
* Class xparcer_scenario
* @tags ~debug
*/
标签可以用逗号分隔,类中定义的表单将在包含这些标签的所有部分中显示。在标签名称前可以指定 ~ - 在这种情况下,该标签不会显示在场景菜单中,但可以通过在命令行中明确指定来访问场景。
每个具有 do_ 前缀的场景函数都必须有完整的 phpDocs 样式描述,否则在自动构建表单时将被忽略。
/**
* Тестировать
* @param string $a :radio[1:one|3:two|4:four|5:five] 1-й параметр
* @param $b
* @param int|string $c :select[one|3:two|4:four|five] 3-й параметр
* @param array $d :checkbox[1:да|2:заодно и удалить] Полностью?
*/
function do_test0($a,$b,$c=4,$d=array()){
...
在参数描述块之前必须描述函数,该描述将在表单描述中显示。每个参数都可以用类型描述符进行扩展定义,它以冒号 : 开头,然后是类型名称,后面可以跟方括号中的附加参数。在形式描述符之后可以跟元素说明。如果没有说明,则使用参数名称。在描述附加值时 - 1:one 参数 1 接受的值,如果值不存在 - 值将与其说明相匹配。
-
radio
:radio[1:one|3:two|4:four|5:five] 第一个参数- 将生成具有在方括号中列出的元素的 HTML 单选按钮元素。参数值将根据用户的选择为 1、3、4 或 5 中的一个,每个单选按钮的说明将为one two...。 -
select
:select[one|3:two|4:four|five] 第三个参数- 将生成具有在方括号中列出的元素的 HTML 下拉列表元素。参数值将根据用户的选择为one、3、4 或five中的一个,每个元素的说明将为one two...。 -
checkbox
:checkbox[1:是|2:同时删除] 完全删除?- 将生成具有在方括号中列出的元素的复选框元素。参数值将是选择值的数组。 -
file
:file[*.xml|*.yml] 选择文件将生成下拉列表,列出项目根目录中的所有xml和yml文件,并具有上传文件的功能。如果文件不存在,可以创建它并确保可以重写。该字段支持 Windows 浏览器的 Drag&drop。函数接收到系统中的完整文件名。 -
textarea - 将生成用于输入长字符串的 textarea 元素,支持换行。
-
files -
:files 选择文件用于上传多个文件的字段。与 file 类似,但参数以数组形式传递给函数。
控制台应用程序
任何场景函数的执行都通过命令行启动
php index.php x3::master 1234,101
将调用场景 x3 中的 do_master 函数(如果存在多个具有该标签的函数,则调用第一个)。其参数将是 1234、101。
php index.php x3_scenario.master 1234,101
将调用场景 x3_scenario 中的 do_master 函数。
函数名称之后是参数块,其格式在下面描述。
如果函数参数未在地址栏或交互模式下指定,则需要将参数输入到控制台。参数输入可以通过逗号分隔,并指定参数名称。
1234,101
result:101,responce:1234
"1234", result:101
参数由逗号分隔,每个参数可以具有名称。在这种情况下,它将被放置在参数数组中的正确位置。每个参数值可以放在单引号或双引号内。如果值不在引号内,则忽略前导和尾随空格。在引号内的值可以使用反斜杠来转义引号字符。
Web应用程序(默认场景)
Web应用程序是一个名为default的场景。如果没有重新定义常量DEFAULT_SCENARIO,它将是活动的。
该类同时实现了Main接口,具有构造函数和route、do_Default方法。它定义了应用程序的模板和逻辑。
场景模板包含菜单 - 所有场景套件标签的列表,以及显示当前标签的页面。在页面上显示该标签所有表单的名称和选定的表单。
该模板用于Web应用程序调用。它允许启动任何场景的系统中的任何函数。
支持控制台工作模式,该模式支持从命令行启动任何场景的任务。
每个Web客户端启动自己的场景脚本版本,不与同时执行的其他客户端版本交叉,除非共享公共资源 - 文件和数据库。这是通过在特定于每个客户端的特殊区域中保存客户端数据来实现的(目前为具有会话名称的json文件)。
单次调用场景函数。
测试代码作为具有正确doc_type格式描述的类-场景方法插入,方法名为do_***。之后可以从标准Web应用程序窗口或控制台调用具有该名称的函数。在这种情况下,可以指定必要的参数。
函数的所有输出,通过标准的PHP输出运算符如echo实现,都将放入控制台输出区域。
长时间执行。
长时间执行是通过顺序执行场景函数来实现的。在执行过程中,可以通过Joblist方法添加其他任务以执行。通常 - 同一场景(append_scenario)或另一场景(append)的函数。添加的任务将由JobList按正常顺序执行。
所有顺序执行的场景函数的输出都将发送到控制台输出区域。如果执行在Web模式下进行,将停止执行并通过ajax通过浏览器继续。对于控制台执行,也进行类似的操作,但仅在控制台设置最大PHP脚本执行时间时。
交互式应用程序(主/文本冒险游戏)
具有交互式功能的程序(游戏/问答)。在此模式下,场景具有停止并请求用户反应的能力,同时保留场景页面输出模式。该模式可以确定在处理该场景时在Web应用程序窗口中需要输出哪些场景表单。
重构历史
- 如果在队列中的第一个帖子之后发现任务,则任务将在达到超时前中断,并建议客户快速发送iframe请求以完成剩余的任务列表。(尚未完成...目前我对这一行动的意义表示怀疑)