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
方法では、次のいずれかを行うことができます。
- Unicodeにコンパイル
body
します(つまりtag-content 8
); または、代わりに - 元のソースに戻し
body
ます(つまりtag-content {{ 3 + 5 }}
)。
背景として、この質問は2つの以前の質問に関連しています。
読んでくれてありがとう。
ブライアン