PHP salesforce/handlebars:是否支持 JS 风格的无哈希非块助手?
PHP salesforce/handlebars: are JS-style hashless non-block helpers supported?
salesforce/handlebars is a PHP parser and renderer for Javascript Handlebars 模板化。后者提供了两种helpers,大致是:
{{#block}}
helper, that receives and can manipulate this block and any {{variable}} inside.
The tag starts with a hash, it has opening and closing tags
{{/block}}
和
{{nonblockhelper usethis}}
现在,在 PHP Handlebars 中,就像在 Javascript 中一样,我可以注册一个块助手,例如“bold”,到 return [=19= 之间的封闭块] 标签:
{{#bold record.type}}
This text is bold, but only if record.type is "error".
{{/bold}}
创建一个名为“checked”的 non-block 助手,将选中的 属性 添加到复选框,以便
<input name="acheckbox" {{checked record.acheckbox}} />
可能会被渲染,当record = { acheckbox: true }
,喜欢
<input name="acheckbox" checked="checked" />
Javascript 帮助程序随时可用并且按预期工作。
我没能在 PHP salesforce/handlebars 中找到如何注册类似的助手。
在文档中提到了“内联”助手,这个例子
{{#upper title}}
也就是说,不兼容 与 Javascript 车把(我试过;它抛出语法错误,因为它找不到 /upper 结束标记它期望的)。
这对我来说似乎很奇怪,因为非块助手非常流行。另一方面,可能很少有人需要 相同的模板 才能在 PHP 和 Javascript 中工作,不幸的是,我确实如此。
我可以凑合使用块助手,它在Javascript和PHP中都有效:
{{#makechecked record.acheckbox}}
<input name="acheckbox" />
{{/makechecked}}
...但这看起来很尴尬,而且很浪费。 是我的C计划,但我认为应该是获得内联助手支持的某种方式。
所以我的问题是——在吗?.
好像没有。
另一方面,{{nonblock helper}}
的语法与 {{variable}}
的语法非常相似。
所以在Handlebars/Template.php
,在
private function variables
我可以添加自己的简单非块辅助逻辑。
private function variables(Context $context, $current, $escaped) {
$name = $current[Tokenizer::NAME];
$value = $context->get($name);
// If @data variables are enabled, use the more complex algorithm for handling the the variables otherwise
// use the previous version.
if ($this->handlebars->isDataVariablesEnabled()) {
if (substr(trim($name), 0, 1) == '@') {
$variable = $context->getDataVariable($name);
if (is_bool($variable)) {
return $variable ? 'true' : 'false';
}
return $variable;
}
} else {
// If @data variables are not enabled, then revert back to legacy behavior
if ($name == '@index') {
return $context->lastIndex();
}
if ($name == '@key') {
return $context->lastKey();
}
}
/* LS20211101 */
/* Check for non-block helpers {{{ */
// "Arguments" are subjected to a VERY simple parsing, with NO
// syntax check. Just simple variables (plus @index and @key)
// and strings between double quotes, parsed through
// dirty base64 glomping.
$words = preg_split('#\s+#', $name, 2, PREG_SPLIT_NO_EMPTY);
$code = $words[0];
if ($this->handlebars->hasHelper($code)) {
$return = call_user_func_array(
$this->handlebars->getHelper($words[0]),
[
$this, // First argument is this template
$context, // Second is current context
implode(
' ',
array_map(
function ($token) use ($context) {
if ('"' === substr($token, 0, 1)) {
return base64_decode($token);
}
// If @data variables are not enabled, then revert back to legacy behavior
if ($token == '@index') {
return $context->lastIndex();
}
if ($token == '@key') {
return $context->lastKey();
}
return $context->get($token);
},
preg_split(
'#\s+#',
preg_replace_callback(
'#"([^"]*)"#',
function ($matches) {
return '"' . base64_encode($matches[1]) . '"';
},
$words[1]
),
-1,
PREG_SPLIT_NO_EMPTY
)
)
), // Arguments
''
]);
if ($return instanceof String) {
return $this->handlebars->loadString($return)->render($context);
}
return $return;
}
/** }}} end */
if ($escaped) {
salesforce/handlebars is a PHP parser and renderer for Javascript Handlebars 模板化。后者提供了两种helpers,大致是:
{{#block}}
helper, that receives and can manipulate this block and any {{variable}} inside.
The tag starts with a hash, it has opening and closing tags
{{/block}}
和
{{nonblockhelper usethis}}
现在,在 PHP Handlebars 中,就像在 Javascript 中一样,我可以注册一个块助手,例如“bold”,到 return [=19= 之间的封闭块] 标签:
{{#bold record.type}}
This text is bold, but only if record.type is "error".
{{/bold}}
创建一个名为“checked”的 non-block 助手,将选中的 属性 添加到复选框,以便
<input name="acheckbox" {{checked record.acheckbox}} />
可能会被渲染,当record = { acheckbox: true }
,喜欢
<input name="acheckbox" checked="checked" />
Javascript 帮助程序随时可用并且按预期工作。
我没能在 PHP salesforce/handlebars 中找到如何注册类似的助手。
在文档中提到了“内联”助手,这个例子
{{#upper title}}
也就是说,不兼容 与 Javascript 车把(我试过;它抛出语法错误,因为它找不到 /upper 结束标记它期望的)。
这对我来说似乎很奇怪,因为非块助手非常流行。另一方面,可能很少有人需要 相同的模板 才能在 PHP 和 Javascript 中工作,不幸的是,我确实如此。
我可以凑合使用块助手,它在Javascript和PHP中都有效:
{{#makechecked record.acheckbox}}
<input name="acheckbox" />
{{/makechecked}}
...但这看起来很尴尬,而且很浪费。 是我的C计划,但我认为应该是获得内联助手支持的某种方式。
所以我的问题是——在吗?.
好像没有。
另一方面,{{nonblock helper}}
的语法与 {{variable}}
的语法非常相似。
所以在Handlebars/Template.php
,在
private function variables
我可以添加自己的简单非块辅助逻辑。
private function variables(Context $context, $current, $escaped) {
$name = $current[Tokenizer::NAME];
$value = $context->get($name);
// If @data variables are enabled, use the more complex algorithm for handling the the variables otherwise
// use the previous version.
if ($this->handlebars->isDataVariablesEnabled()) {
if (substr(trim($name), 0, 1) == '@') {
$variable = $context->getDataVariable($name);
if (is_bool($variable)) {
return $variable ? 'true' : 'false';
}
return $variable;
}
} else {
// If @data variables are not enabled, then revert back to legacy behavior
if ($name == '@index') {
return $context->lastIndex();
}
if ($name == '@key') {
return $context->lastKey();
}
}
/* LS20211101 */
/* Check for non-block helpers {{{ */
// "Arguments" are subjected to a VERY simple parsing, with NO
// syntax check. Just simple variables (plus @index and @key)
// and strings between double quotes, parsed through
// dirty base64 glomping.
$words = preg_split('#\s+#', $name, 2, PREG_SPLIT_NO_EMPTY);
$code = $words[0];
if ($this->handlebars->hasHelper($code)) {
$return = call_user_func_array(
$this->handlebars->getHelper($words[0]),
[
$this, // First argument is this template
$context, // Second is current context
implode(
' ',
array_map(
function ($token) use ($context) {
if ('"' === substr($token, 0, 1)) {
return base64_decode($token);
}
// If @data variables are not enabled, then revert back to legacy behavior
if ($token == '@index') {
return $context->lastIndex();
}
if ($token == '@key') {
return $context->lastKey();
}
return $context->get($token);
},
preg_split(
'#\s+#',
preg_replace_callback(
'#"([^"]*)"#',
function ($matches) {
return '"' . base64_encode($matches[1]) . '"';
},
$words[1]
),
-1,
PREG_SPLIT_NO_EMPTY
)
)
), // Arguments
''
]);
if ($return instanceof String) {
return $this->handlebars->loadString($return)->render($context);
}
return $return;
}
/** }}} end */
if ($escaped) {