【发布时间】:2010-11-29 23:49:42
【问题描述】:
可以编译或还原 Jinja2 AST 的一部分吗?
例如,是否可以从 jinja2.environment 或 jinja2.compiler.generate 或从模板中提取的节点列表上的某个等效项调用函数或方法?
例如,给定一个模板y.html:
avant-tag
{% xyz %}
tag content {{ 3 + 5 }}
{% endxyz %}
apres-tag
还有一个扩展名y.py:
# -*- coding: utf-8 -*-
from jinja2 import nodes, Environment, FileSystemLoader
from jinja2.ext import Extension
class YExtension(Extension):
tags = set(['y'])
def __init__(self, environment):
super(YExtension, self).__init__(environment)
def parse(self, parser):
tag = parser.stream.next()
body = parser.parse_statements(['name:endy'], drop_needle=True)
return nodes.Const("<!-- slurping: %s -->" % str(body))
env = Environment(
loader = FileSystemLoader('.'),
extensions = [YExtension],
)
print env.get_template('x.html').render()
运行 python y.py 会产生预期的输出:
avant-tag
<!-- slurping: [Output(nodes=[TemplateData(data=u'\n tag-content '),
Add(left=Const(value=3), right=Const(value=5)),
TemplateData(data=u'\n ')])] -->
sous-tag
在parse 方法中,如何选择:
- 将
body编译成unicode(即tag-content 8);或者,或者 - 将
body还原为其原始来源(即tag-content {{ 3 + 5 }})。
作为背景问题,这个问题与之前的两个问题有关:
感谢您的阅读。
布赖恩
【问题讨论】:
标签: python jinja2 abstract-syntax-tree