相反的Javascript模板语言

Javascript templating language in reverse

本文关键字:语言 Javascript      更新时间:2023-09-26

有没有类似于模板引擎(la Mustache.js)的东西可以在"反向"中进行模板化?

这意味着我提供了渲染的html和一个模板文件,通过引擎运行它,并从中获取数据(比如JSON结构)。

我意识到这是一种可以用"屏幕抓取库"来完成的事情,但我从未见过使用胡子风格模板(无论这些模板叫什么)的屏幕抓取库。

不存在通用解决方案。例如,您永远无法反转以下模板:{{foo}}{{bar}},因为无法找到第一个胡子停止和第二个胡子开始的位置。

例如:

html: 'hello world!'
template: '{{foo}}{{bar}}'
model: {
    foo: '',
    bar: 'hello world!'
}
model2: {
    foo: 'hello world!',
    bar: ''
}

model和model2都从模板中呈现完全相同的html,因此它们都是有效的反转。

但是,如果您为模板制定一些规则,就有可能做到这一点而不会产生歧义。

规则:

  1. 两个胡子永远不能碰(如上所述)
  2. 胡子内容的开头永远不能与胡子后面的第一个文本部分相同(或者我们找不到胡子的结尾)
  3. 节中的第一个文本部分不能与节后的第一个文字部分相同(或者我们找不到节的末尾)
  4. 最好不要使用richtext{{}}胡子(允许它包含任何内容,因此反向匹配意味着它可以匹配文档的其余部分)

这些规则似乎对明文有很大的限制,但对于xml和html,它们运行得很好(如果您只对元素和属性内容感兴趣)。例如,如果只使用明文{{}}胡子,则规则二永远不会成为问题。

以下模板可以在没有任何歧义的情况下反转,例如:

<div>
    <p>{{title}}</p>
    <ul>
        {{#list}}
            <li>{{item}}</li>
        {{/list}}
    </ul>
</div>

但是添加另一个<李>就在<ul>将使模板不明确(规则3)。

我还没有在网上找到任何可以做到这一点的代码,所以我已经开始为此编写一个库。但到目前为止,它还没有完成,每次我研究它时,我都会发现新的局限性。只有对于非常简单的模板,这还可以(我只允许使用{{}}}、{{#}}和{{/}}胡子)。


我使用另一个模板系统找到了一个解决方案:https://github.com/fabiomcosta/mootools-meio-template/tree/master.它似乎也有同样的局限性。

Parseur是一个反向模板引擎。它还包括一个模板编辑器来创建那些";反向";模板。当然,Parseur不能创造奇迹(见@blerik答案),但它可以重复地从类似的文档中提取数据。

一个很好的功能是,你可以添加更多的模板,它会并行检查所有模板,并选择一个可以提取最多字段的模板。

输出是JSON格式的,字段可以选择性地格式化为数字、日期、地址、嵌套甚至表格格式。