【问题标题】:Javascript templating language in reverse逆向的Javascript模板语言
【发布时间】:2013-08-11 04:20:28
【问题描述】:

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

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

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

【问题讨论】:

  • 如果你使用 ruby​​,nokogiri 可以很好地解决这个问题,尽管它不是你所描述的
  • 还有一个名为 Scrapemark 的旧 Python 库,它基本上可以做到这一点。

标签: javascript templating


【解决方案1】:

不存在通用解决方案。例如。您永远不能反转以下模板:{{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>

但是在 之前添加另一个

  • 会使模板不明确(规则 3)。

    我没有在网上找到任何代码可以做到这一点,所以我已经开始为此编写一个库。但到目前为止它还没有完成,每次我努力工作时,我都会发现新的限制。仅适用于非常简单的模板,这可以正常工作(我允许的唯一胡须是 {{}}、{{#}} 和 {{/}})。


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

  • 【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-01-07
        • 2012-04-14
        • 2012-02-10
        • 1970-01-01
        • 2012-11-29
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多