我正在进行的一个项目使用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))
.....
现在,如果你写入{{>页脚}}它会完成工作的。