Mustache:从模板中检索标签的列表/哈希



我看到的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"]

最新更新