Javascript模板语言相反

时间:2013-08-11 04:20:28

标签: javascript templating

是否有类似模板引擎(la Mustache.js)可以在“反向”进行模板操作?

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

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

2 个答案:

答案 0 :(得分:5)

不存在通用解决方案。例如。你永远不能反转以下模板:{{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 {{{}}}胡子(允许包含任何内容,因此反向匹配意味着它可以与文档的其余部分匹配)。
  5. 这些规则似乎对明文非常严格,但对于xml和html,它们的效果非常好(如果您只对元素和属性内容感兴趣)。如果你只使用明文{{}}胡须,那么规则二绝不是问题。

    以下模板可以颠倒,例如:

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

    但是添加另一个&lt; li&gt;就在&lt; / ul&gt;之前会使模板模糊不清(规则3)。

    我没有找到任何在线代码,所以我开始为此编写一个库。但到目前为止还没有完成,每次我都在努力,我发现了新的局限。只有真正简单的模板才能正常工作(我允许的唯一必须是{{}},{{#}}和{{/}}。


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

答案 1 :(得分:0)

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

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

输出采用JSON,并且可以选择将字段格式化为数字,日期,地址,嵌套格式或表格格式。