xp-forge / mustache
为 XP 框架实现的 Mustache 模板语言
v8.2.0
2024-03-24 12:35 UTC
Requires
- php: >=7.0.0
- xp-framework/core: ^12.0 | ^11.0 | ^10.0
- xp-framework/tokenize: ^9.0 | ^8.0
Requires (Dev)
- xp-forge/json: ^5.0 | ^4.0 | ^3.0 | ^2.0
- xp-framework/io-collections: ^10.0 | ^9.0 | ^8.0
- xp-framework/test: ^2.0 | ^1.0
This package is auto-updated.
Last update: 2024-08-24 13:27:06 UTC
README
为 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/