如何深度编译嵌套的手把内容



我正在进行的一个项目使用Handlebars.js模板系统。它读取内容,并在编译模板时在适当的地方注入内容:

<div class="content">
  <p>lorem ipsum</p>
  {{{ content }}}
</div>

在这种情况下,使用一个JS对象编译手把,该对象具有一个content属性,该属性是一个文本或HTML字符串(因此使用三方括号)。

然而,完全有可能的是,内容值(文本或HTML)也可能包括手柄插值代码:

var contentPassedToHandlebars = {
  content: '<p>{{ foobar }}</p>',
  foobar: 'foo'
};

它当前输出<p>{{ foobar }}</p>,但我想要得到的是<p>foo</p>

手柄是否有用于此嵌套内容的工具,或者是否需要自定义助手?({{{custom_parse content}}})?

关于这个问题的上下文

这种情况源于一个构建系统(metalsmith),该系统以markdown的形式读取文件,将它们转换为HTML,将结果附加到file对象的content属性,然后解析一个将file.content注入其输出的手把模板。所有这些,我希望有一个解决方案,可以在markdown中放置把手或字符串插值,这样markdown文件就可以访问模板可以访问的相同变量(显然,config.json中的全局值更多,而不是与正在构建的文件对象相关联的值)。

没有内置的方法可以做到这一点。您必须管理自己的预渲染过程或内部助手。

对于该解决方案,我最终在正式渲染之前运行了预渲染。虽然代码不是手柄,而是metalsmith-templates插件的一部分,但这里是我使用的解决方案。

大致翻译为:

var contentPassedToHandlebars = {
  content: '<p>{{ foobar }}</p>',
  foobar: 'foo'
};
var x = Handlebars.compile(contentPassedToHandlebars.content)(contentPassedToHandlebars);
contentPassedToHandlebars.content = x;
Handlebars.compile(realTemplateSource)(contentPassedToHandlebars);

或者使用这个:

金属史密斯到位

```
index.js
var inPlace = require('metalsmith-in-place')
....
.use(inPlace(true))
.....

现在,如果你写入{{>页脚}}它会完成工作的。

最新更新