反向Javascript模板语言

反向Javascript模板语言,javascript,templating,Javascript,Templating,是否有类似于模板引擎(la Mustache.js)的东西可以“反向”进行模板生成 这意味着我提供呈现的html和模板文件,通过引擎运行它,并从中获取数据(比如JSON结构) 我意识到这是一种可以用“屏幕抓取库”来完成的事情,但是我从来没有见过一个屏幕抓取库使用胡子样式的模板(不管这些模板叫什么) 通用解决方案不存在。例如,您永远无法反转以下模板:{{foo}{{{bar}},因为无法找到第一个胡子在哪里停止,第二个胡子在哪里开始 例如: html: 'hello world!' templat

是否有类似于模板引擎(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,因此它们都是有效的反转

但是,如果您为模板制定一些规则,就可以做到不含糊

规则:

  • 两个胡子永远不能碰(如上所述)
  • 胡子内容的开头永远不能与胡子后面的第一个文本部分相同(或者我们找不到胡子的结尾)
  • 节中的第一个文本部分不能与节后的第一个文本部分相同(或者我们找不到节的结尾)
  • 最好不要使用richtext{{{}}mustache(它可以包含任何内容,因此反向匹配意味着它可以匹配文档的其余部分)
  • 这些规则对于纯文本似乎有很大的限制,但是对于xml和html,它们工作得非常好(如果您只对元素和属性内容感兴趣的话)。例如,如果您只使用纯文本{{}胡须,那么规则二从来都不是问题

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

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

      {{{#列表}
    • {{item}}
    • {{/list}
    但是在之前添加另一个
  • 会使模板模糊不清(规则3)

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



    我找到了使用另一个模板系统的解决方案:。它似乎也有同样的限制。

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

    一个很好的特性是,您可以添加更多模板,它将并行检查所有模板,并选择可以提取最多字段的模板


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

    如果使用ruby,nokogiri很好地解决了这个问题,尽管它并不完全是您所描述的。还有一个名为Scrapemark的旧python库,它基本上就是这样做的。