Jinja2 ASTの一部をコンパイルまたは元に戻すことはできますか?Jinja2 ASTのサブセクションを編集する
例えば、jinja2.environment
またはjinja2.compiler.generate
などの関数またはメソッドを呼び出すことができますか、テンプレート内から抽出されたノードのリストで同等のものを呼び出すことはできますか?
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
結果実行:parse
で
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
をテンプレートy.html
所与例えば
、方法、どのようにすることができます:
- コンパイル
body
ユニコードtag-content 8
);または代替として body
を元のソースに戻します(つまり、tag-content {{ 3 + 5 }}
)。背景の問題として
、この質問は、前の2つの質問に関連する:
をお読みいただきありがとうございました。あなたはその時点で入手可能なコンテキストを持っていないので、
unicodeにコンパイルブライアン
ありがとうございます。私は私の質問に答えると思う。唯一残っている質問は、抽出された結果を環境に与える方法があるかどうかです。 –
@Brian M. Hunt:どちらの文字列をどちらの方法でもレンダリングできるので問題ありません。 'Environment.from_string()'や 'Template(nodes)'を通常どおり返すことができます。 – Wolph
ああそう!申し訳ありませんが、私は不明でした...唯一残っている質問は、抽出されたノード**(テキストではない)を環境に与えてレンダリングする方法があるかどうかです。 –