有没有类似模板引擎(la Mustache.js)的东西可以“反向”做模板?
这意味着我提供渲染的 html 和模板文件,通过引擎运行它,并从中获取数据(比如 JSON 结构)。
我意识到这是可以通过“屏幕抓取库”完成的事情,但我从未见过使用胡子样式模板(无论它们被称为什么)的屏幕抓取库。
有没有类似模板引擎(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,因此它们都是有效的反向。
但是,如果您为模板制定一些规则,则可以毫无歧义地做到这一点。
规则:
这些规则似乎对纯文本非常严格,但对于 xml 和 html,它们工作得很好(如果您只对元素和属性内容感兴趣)。例如,如果您只使用纯文本 {{}} 小胡子,则规则二绝不会成为问题。
例如,可以将以下模板反转而没有任何歧义:
<div>
<p>{{title}}</p>
<ul>
{{#list}}
<li>{{item}}</li>
{{/list}}
</ul>
</div>
但是在 </ul> 之前添加另一个 <li> 会使模板不明确(规则 3)。
我还没有在网上找到任何这样做的代码,所以我已经开始为此编写一个库。但到目前为止它还没有完成,每次我努力工作时,我都会发现新的限制。仅适用于非常简单的模板,这可以正常工作(我允许的唯一胡须是 {{}}、{{#}} 和 {{/}})。
我找到了使用另一个模板系统的解决方案:https ://github.com/fabiomcosta/mootools-meio-template/tree/master 。它似乎有相同的限制。
Parseur 是一个反向模板引擎。它还包括一个模板编辑器来创建那些“反向”模板。当然,Parseur 不能创造奇迹(参见@blerik 答案),但它可以从类似文档中重复提取数据。
一个不错的功能是您可以添加更多模板,它将并行检查所有模板并选择可以提取最多字段的模板。
输出采用 JSON 格式,字段可以选择格式化为数字、日期、地址、嵌套甚至表格格式。