spip-remix / compiler
SPIP 模板编译器
5.0.x-dev
2024-04-09 18:41 UTC
Requires
- php: >=8.2
Requires (Dev)
- phpunit/phpunit: ^11.0
- symfony/var-dumper: ^7.0
This package is auto-updated.
Last update: 2024-09-09 19:29:17 UTC
README
模板编译器。
原则
编译器是一个管道,它将模板转换为发送给用户的页面。
管道是一系列依次执行的步骤(阶段
或中间件
),并逐步转换有效负载
。这是一种复合设计模式。
编译器的当前入口点(SPIP4.2及以下版本)大致是recuperer_fond(...)
函数。
大致来说,新管道替换了evaluer_fond()
函数和pipeline('recuperer_fond', ...)
函数调用。
为了确保向上兼容,此函数的主体可以如下所示:
/** * @deprecated 5.0 */ function recuperer_fond($fond, $contexte = [], $options = [], string $connect = '') { static $c = null; if (is_null($c)) { new Compilo; } // ...code... $page = [ 'texte' => '', 'erreur' => '', 'invaldeurs' => [], ]; $squelette = file_get_content($f = find_in_path($fond.'.html')); $payload = [ 'page' => $f, 'squelette' => $squelette, 'contexte' => array_merge($contexte, $options, ['connect' => $connect]) ]; $payload = $c($payload); $page['texte'] = $payload['page']; // ...code... return [ 'args' => [/* ... f($payload) ...*/], 'page' => $page, ]; }
有效负载
编译器的有效负载如下:
page
:请求的页面名称- 编译器不处理在调用编译器之前已处理过的SPIP操作
- 最好的办法是将调用编译器视为对虚拟操作
page
的调用,其中page
参数的值为默认的sommaire
。
- 最好的办法是将调用编译器视为对虚拟操作
page
在PHP中对应于HTTP请求中的$_GET['page']
内容、CLI命令的参数或任何其他事件总线参数。page
的值是1级缓存的标识符- 例如:
prive/liste/auteurs
- 编译器不处理在调用编译器之前已处理过的SPIP操作
- 模板:模板的字符串表示
- 在调用编译器之前,通过逻辑独立的方式将
page
与根据该逻辑从文件中获取的内容进行匹配。
- 在调用编译器之前,通过逻辑独立的方式将
- 属性:随着过程的进行而丰富的一组可选参数集合
- 例如:
var_mode
、debut_xxx
等参数
- 例如:
- 脚本:在过程中,有效负载将丰富为对编译结果的引用
- 渲染:在过程中,有效负载将丰富为渲染结果
步骤
编译器的步骤如下:
- 将来自文本文件的字符串进行转换。
- 查找与有效负载页面关联的缓存。
- 如果缓存不存在或无效(即:自上次转换以来模板文件已更改、或其ttl已过期、或强制计算)
- 检测SPIP语法元素(未转换的文本、标签、循环、动态包含)
- 构建抽象语法树(AST)
- 从AST生成脚本
- 缓存(1级)
- 否则,从缓存中读取脚本
- 如果缓存不存在或无效(即:自上次转换以来模板文件已更改、或其ttl已过期、或强制计算)
- 返回脚本
- 查找与有效负载页面关联的缓存。
- 执行转换后的脚本
- 查找与脚本、上下文等关联的缓存
- 如果缓存不存在或无效(脚本已更改等)
- 评估转换后的脚本
- 缓存(2级)
- 否则,从缓存中读取渲染结果
- 如果缓存不存在或无效(脚本已更改等)
- 返回页面及其元数据
- 查找与脚本、上下文等关联的缓存