xp-forge/handlebars

XP Framework 的 Handlebars

v9.4.0 2024-03-24 14:28 UTC

README

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

为 XP Framework 实现的 Handlebars 模板语言

use com\handlebarsjs\HandlebarsEngine;

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

模板化

模板可以从文件系统加载。以下代码加载并转换了模板 src/main/handlebars.handlebars

use com\handlebarsjs\{HandlebarsEngine, FilesIn};

$engine= (new HandlebarsEngine())->withTemplates(new FilesIn('src/main/handlebars'));
$transformed= $engine->transform('hello', [
  'name' => 'World'
]);

支持的助手函数

以下助手函数是内置的

"if" 块

{{#if licence}}
  A licence is available
{{/if}}

{{#if licence}}
  A licence is available
{{else}}
  <em>Warning: No licence is available!</em>
{{/if}}

{{#if content}}
  Content
{{else if hub}}
  Hub
{{else}}
  Default
{{/if}}

"unless" 块

{{#unless licence}}
  <em>Warning: No licence is available!</em>
{{/unless}}

"with" 块

{{#with person}}
  Full name: {{firstName}} {{lastName}}
{{/with}}

"each" 块

<ul>
  {{#each students}}
    <li>Student's name: {{firstName}} {{lastName}}</li>
  {{/each}}
</ul>

所有上述块助手都支持 else 语句。

"log" 助手

{{log '"Hello", Frank\'s mother said.'}}
{{log 'No publishers for' category level="warn"}}

要启用日志记录,将闭包或 util.log.LogCategory 实例传递给引擎

use util\log\Logging;
use util\cmd\Console;

// Use a logger category:
$logger= Logging::named('trace')->toConsole();

// Or a closure:
$logger= function($args, $level) { Console::writeLine('[', $level, '] ', ...$args); };

$engine= (new HandlebarsEngine())->withLogger($logger);
$engine->render(...);

自定义助手函数

要添加自定义助手函数,使用 withHelpers() 并传递函数。以下代码生成 Hello WORLD

use com\handlebarsjs\HandlebarsEngine;

$engine= (new HandlebarsEngine())->withHelper(function($node, $context, $options) {
  return strtoupper($options[0]);
});
$transformed= $engine->render('Hello {{upper name}}', [
  'name' => 'World'
]);

传递的参数如下

  • node: 当前节点,一个 com.github.mustache.Node 实例
  • context: 当前上下文,一个 com.github.mustache.Context 实例
  • options: 解析后的选项传递,在上面的例子中是字符串 "World"(这是 name 解析到的结果)

进一步阅读

https://handlebars-lang.github.io/spec/