我看到的Mustache的所有文档和示例都展示了如何使用哈希来填充模板。我有兴趣去另一个方向。EG,如果我有这个:
Hello {{name}}
胡子可以生成这个(伪代码):
tags = 'name'
我使用的是Mustache的PHP风格,但我对语言不太挑剔。我想做的是构建一个系统,让人们可以使用Mustache标签创建模板,另一个开发人员可以快速查看模板需要什么数据。这是Mustache可以做的事情吗,还是我必须做一些有趣的正则表达式魔术?
例如,您可以使用在nodejs上运行的Hogan.js,并使用scan
函数:
var template = "{{foo}}{{#bar}}{{baz}}{{/bar}}{{#array}}{{.}}{{/array}}"'
var parsedTree = Hogan.scan(template, '{{ }}');
它返回的是一个对象数组。每个对象条目都有两个要查找的键:n表示标记名称,标记代表标记类型。我不认为标记类型有明确的文档记录,但作为参考_v
意味着纯文本,#
是部分开始,/
是部分结束。
Mustache的parse
方法可以在JavaScript中使用,以获得给定模板中使用的标签树:
const template = "{{foo}}{{#bar}}{{baz}}{{/bar}}{{#array}}{{.}}{{/array}}"
const tokens = Mustache.parse(template)
console.log(JSON.stringify(tokens, null, 4))
这将产生以下结果:
[
[
"name",
"foo",
0,
7
],
[
"#",
"bar",
7,
15,
[
[
"name",
"baz",
15,
22
]
],
22
],
[
"#",
"array",
30,
40,
[
[
"name",
".",
40,
45
]
],
45
]
]
在@Sanjay的回答的基础上,我认为以下是人们可能想要的,因为它会递归地自己拉出所有的section标记。如果您希望它返回常规标签,而不是部分,请检查当前[0]是否==="名称"以识别其他标签:
const template = "{{foo}}{{#bar}}{{baz}}{{/bar}}{{#array}}{{.}}{{/array}}"
const tokens = filterTokens(Mustache.parse(template))
function filterTokens(toParse, tokens=[]){
for(let x=0; x<toParse.length; x++){
const current = toParse[x];
if(current[0] === '#' && !tokens.includes(current[1])){
tokens.push(current[1]);
if(toParse[4]){
tokens.concat(filterTokens(current[4], tokens));
}
}
}
return tokens;
}
我知道我对这个问题已经晚了,但我在Ruby中寻找如何做同样事情的建议时偶然发现了这个问题。既然我找到了一个适合我的解决方案,我想我会分享:
创建一个自定义渲染器,从Mustache子类化,并跟踪每个部分或上下文的请求。无论如何,您都希望/需要正常的渲染行为,因为您希望捕获从其他部分引用的上下文/部分。
在Ruby中,这真的很容易做到——希望它对PHP开发人员也有帮助。:)
我自己在Ruby中发现了这个,因为我在谷歌上找不到任何真正有用的东西。结果很简单:
Mustache.templateify("{{name}} was {{location}}").tags
这将返回一个标签名称数组:
["name", "location"]