使用Python处理带有Ember.js标记的HTML

3
我有以下情况:
  1. 我们在服务器端使用web2py
  2. 我们提供一些ember.js页面
  3. 目前这些ember.js页面在iframe中,因为ember.js和web2py的模板{{}}标记冲突。这意味着我们不能轻松地混合web2py模板和ember.js模板。
  4. 所以我实现了helper类解决方案:class em(DIV)
  5. 现在我想处理原始的带有ember标记的html文件,并生成带有em标记的文件,将ember.js和web2py模板系统集成为一个协调的单元。

为此,我需要将ember.js文件中所有的{{XXX}}实例更改为{{=em('XXX')}},包括跨越多行的实例。我考虑使用正则表达式,但我想避免重新发明轮子(并且不得不处理奇怪的边角情况)

你能想到Python中通用的解析这些类型的模板的方法吗?这只是寻找开始和结束定界符({{}})并放置=em('XXX')处理换行符,并保留格式(即,如果有一些,则保留换行符)。

注意:这实际上不是特定于ember.js的;它可以适用于任何基于多行分隔符的模板系统。

2个回答

3

请注意,在 web2py 的 trunk 版本中(将在接下来的几天发布为 web2py 2.0),您现在可以指定模板的自定义分隔符——这样您就可以更改 web2py 分隔符,使其不再与 ember.js 分隔符冲突。例如,在模型文件中:

response.delimiters = ['{%', '%}']

在您的web2py模板中,您可以这样做:
{%=P('hello world')%}
<p>{{ember template code}}</p>
{%=P('{{ember template code generated by web2py}}')%}

这将产生:

<p>hello world</p>
<p>{{ember template code}}</p>
<p>{{ember template code generated by web2py}}</p>

请注意,每个请求都会设置response.delimiters,因此如果您不想在所有页面上更改web2py分隔符,而只想更改包含ember代码的页面,可以有条件地设置response.delimiters(通过在需要它的特定操作中设置它,或通过在模型文件中检查请求的控制器和/或函数)。例如,在模型文件中:

if request.function in ['action1', 'action2', 'action3']:
    response.delimiters = ['{%', '%}']

或在控制器中:

def action1():
    response.delimiters = ['{%', '%}']
    [etc.]

谢谢 Anthony。这看起来是一种有趣的方法。我在我的当前应用程序中看到你建议的问题是,我的许多web2py视图已经使用默认分隔符实现。如果我想扩展html文件(使用扩展指令),或以任何方式重用我的现有web2py模板,我会遇到麻烦。但是,与您建议的相同精神,也许可以(而不是使用em帮助程序类)为ember.js使用不同的分隔符(我没有ember.js遗留)。我不知道是否可配置,我会调查一下。 - blueFast
这确实是我最终采取的做法。目前运行良好。 - blueFast

0

也许值得尝试一种方法,即将所有的Ember.js内容保存在单独的文件中,并不与web2py模板混合。幸运的是,Ember.js很容易做到这一点。


请您详细说明一下吗?如果不想因为冲突的模板分隔符而遇到麻烦,您如何使用web2py来提供ember.js文件服务?我所知道的唯一实现方式是在iframe中提供ember.js。 - blueFast
Ember使用Handlebars.js进行模板处理。您可以预编译Handlebars模板,并通过<script src=""指令将它们作为常规JavaScript文件添加到web2py页面中。Ember.Handlebars.precompile()函数可用于模板预编译。 - s.ermakovich
我明白了。但是将web2py和ember.js混合使用可能会在未来成为一个问题。我无法预见是否会出现需要混合使用两种模板系统的特殊情况。 - blueFast
由你决定,但我更倾向于不要混合它们。这确实是应用程序的不同层。而且Ember.js层最终可以在web2py范围之外使用。 - s.ermakovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接