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

时间:2014-10-02 14:27:11

标签: javascript handlebars.js metalsmith

我正在开发的项目使用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,将结果附加到content对象的file属性,然后解析一个把手模板将file.content注入其输出。所有这些和我希望有一个解决方案将把手或字符串插值放入降价处,这样markdown文件就可以访问模板可以访问的相同变量(显然config.json中的更多全局值而不是值与正在构造的文件对象相关联。)

2 个答案:

答案 0 :(得分:4)

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

对于解决方案,我最终在官方渲染之前运行预渲染。虽然代码不是把手,而是metalsmith-templates插件的一部分,here is the solution I used

这大致翻译为:

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

var x = Handlebars.compile(contentPassedToHandlebars.content)(contentPassedToHandlebars);
contentPassedToHandlebars.content = x;

Handlebars.compile(realTemplateSource)(contentPassedToHandlebars);

答案 1 :(得分:1)

或者使用它:

metalsmith-in-place

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

....
.use(inPlace(true))
.....

现在,如果你 写{{&gt;页脚}} 它会完成这项工作。