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) {