spip-remix/compiler

SPIP 模板编译器

5.0.x-dev 2024-04-09 18:41 UTC

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
  • 模板:模板的字符串表示
    • 在调用编译器之前,通过逻辑独立的方式将page与根据该逻辑从文件中获取的内容进行匹配。
  • 属性:随着过程的进行而丰富的一组可选参数集合
    • 例如:var_modedebut_xxx等参数
  • 脚本:在过程中,有效负载将丰富为对编译结果的引用
  • 渲染:在过程中,有效负载将丰富为渲染结果

步骤

编译器的步骤如下:

  • 将来自文本文件的字符串进行转换。
    • 查找与有效负载页面关联的缓存。
      • 如果缓存不存在或无效(即:自上次转换以来模板文件已更改、或其ttl已过期、或强制计算)
        • 检测SPIP语法元素(未转换的文本、标签、循环、动态包含)
        • 构建抽象语法树(AST)
        • 从AST生成脚本
        • 缓存(1级)
      • 否则,从缓存中读取脚本
    • 返回脚本
  • 执行转换后的脚本
    • 查找与脚本、上下文等关联的缓存
      • 如果缓存不存在或无效(脚本已更改等)
        • 评估转换后的脚本
        • 缓存(2级)
      • 否则,从缓存中读取渲染结果
    • 返回页面及其元数据