xp-forge/mustache

为 XP 框架实现的 Mustache 模板语言

v8.2.0 2024-03-24 12:35 UTC

README

Build status on GitHub XP Framework Module BSD Licence Requires PHP 7.0+ Supports PHP 8.0+ Latest Stable Version

为 XP 框架实现的 Mustache 模板语言

use com\github\mustache\MustacheEngine;

$transformed= (new MustacheEngine())->render(
  'Hello {{name}}',
  ['name' => 'World']
);

简介

从优秀的 Mustache man-page 开始阅读。

支持的功能

此实现支持当前 规范 的所有标准功能

  • 插值:`{{var}}`(`{{&var}}` 和未转义的三重大括号)以及点符号。默认情况下,缺失值将被空字符串替换。
  • 注释:`{{! comment }}`。注释将出现在解析树中,但在渲染时当然会被排除。
  • 定界符:`{{=@ @=}}` 将起始和结束定界符更改为 `@` 符号。支持任意长度的定界符。
  • 部分:`{{#section}}` 以及逆部分:`{{^section}}` 都受支持。
  • 部分:`{{> partial}}` 将从模板加载器加载名为 `partial.mustache` 的模板。
  • 隐式迭代器:写为 `{{.}}`,当前循环值将被选中。

可选的 lambdas 模块以及父上下文扩展(`../name`)也受支持。

lambda 函数

如果值是闭包,它将被调用,并将未处理的文本(不会执行插值!)传递给它

模板

{{# wrapped }}
  {{ name }} is awesome.
{{/ wrapped }}

数据

[
  'name'    => 'Willy',
  'wrapped' => function($text) {
    return '<b>'.$text.'</b>';
  }
];

输出

<b>Willy is awesome.</b>

扩展用法

传递的 $text 参数实际上是一个 com.github.mustache.Node 实例,但可以像文本一样处理,因为它重载了字符串转换。为了与它一起使用,可以使用给定的 com.github.mustache.Context 实例作为第二个参数调用节点的 evaluate() 方法

[
  'name'    => 'Willy',
  'wrapped' => function($node, $context) {
    return '<b>'.strtoupper($node->evaluate($context)).'</b>';
  }
]

模板加载

默认情况下,模板是从当前工作目录加载的。这可以通过向引擎传递模板加载器实例来更改

use com\github\mustache\{MustacheEngine, FilesIn};
use io\Folder;

$engine= new MustacheEngine();
$engine->withTemplates(new FilesIn(new Folder('templates')));
$transformed= $engine->transform('hello', ['name' => 'World']);

这将加载存储在文件 templates/hello.mustache 中的模板。此模板加载器也将用于部分。

模板也可以从类加载器加载,使用 com.github.mustache.ResourcesIn 并传递类加载器实例(例如,使用 ClassLoader::getDefault() 在所有类路径中搜索)

编译后的模板

如果您希望将变量应用到模板上多次,您可以通过预编译模板并稍后使用它们来加速此过程

use com\github\mustache\MustacheEngine;

$engine= new MustacheEngine();
$template= $engine->compile($template);

// Later on:
$result1= $engine->evaluate($template, $variables1);
$result2= $engine->evaluate($template, $variables2);

辅助函数

将辅助函数视为“无处不在”的上下文。它们通过 withHelper() 添加到引擎实例中,并将可在任何在实例上调用的渲染上下文中使用。

模板

{{# bold }}
  This is {{ location }}!
{{/ bold }}

调用

use com\github\mustache\MustacheEngine;

$engine= new MustacheEngine();
$engine->withHelper('bold', function($text) {
  return '<b>'.$text.'</b>';
});
$transformed= $engine->render($template, ['location' => 'Spartaaaaa']);

输出

<b>This is Spartaaaaa!</b>

使用对象

您还可以将实例方法用作辅助函数,例如。

// Declaration
class LocalizationHelpers {
  public function date($list, $context) {
    return $context->lookup($list->nodeAt(0)->name())->toString('d.m.Y');
  }

  public function money($list, $context) {
    // ...
  }
}

// Usage with engine instance
$engine->withHelper('local', new LocalizationHelpers());
{{#local.date}}{{date}}{{/local.date}}

规范符合性

此实现是否符合官方规范可以通过以下方式测试

$ curl -sSL https://github.com/mustache/spec/archive/master.zip -o master.zip
$ unzip master.zip && rm master.zip
$ xp test com.github.mustache.** -a spec-master/specs/