8

有没有类似模板引擎(la Mustache.js)的东西可以“反向”做模板?

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

我意识到这是可以通过“屏幕抓取库”完成的事情,但我从未见过使用胡子样式模板(无论它们被称为什么)的屏幕抓取库。

4

2 回答 2

6

不存在通用解决方案。例如,您永远不能反转以下模板:{{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. 最好不要使用富文本 {{{}}} 小胡子(它允许包含任何内容,因此反向匹配意味着它可以匹配文档的其余部分)。

这些规则似乎对纯文本非常严格,但对于 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 。它似乎有相同的限制。

于 2013-10-09T12:26:52.683 回答
0

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

一个不错的功能是您可以添加更多模板,它将并行检查所有模板并选择可以提取最多字段的模板。

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

于 2020-08-24T18:45:18.030 回答