2

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方法では、次のいずれかを行うことができます。

  1. Unicodeにコンパイルbodyします(つまりtag-content 8); または、代わりに
  2. 元のソースに戻しbodyます(つまりtag-content {{ 3 + 5 }})。

背景として、この質問は2つの以前の質問に関連しています。

  1. インクルード後のJinja2コンパイル拡張機能; と
  2. Jinja2のインクルードファイルの先頭にJavaScriptを挿入します

読んでくれてありがとう。

ブライアン

4

1 に答える 1

1

parse()その時点で使用可能なコンテキストがないため、メソッドでユニコードにコンパイルすることはまだできません。もちろん、ハッキングすることはできますが、おそらく最善の方法ではないでしょう。

このparse()ステップは通常、html ファイルに対して 1 回だけ実行され、その後、解析されたバイトコードを使用してテンプレートをレンダリングすることに注意してください。解析ステップの結果は、与えられた環境でレンダリングできます。

そこに利用可能なコンテキストがなく、そこにコンテキストを取得することは...非常に困難です;)

ただし、元のソースを取得するには...ハッキングなしではそれほど簡単ではありませんが、ハッキングはそれほど悪くありません;)

class YExtension(Extension):
    tags = set(['y'])

    def preprocess(self, source, name, filename=None):
        # insert some code here that replaces '{% xyz %}foo bar{% endxyz %}'
        # with something like: '{% xyz %}foo bar{% raw %}foo bar{% endraw %}{% endxyz %}'
        return source

その後、テキストをノードvalueから読み取ることができます。{% raw %}その後、必ずゴミ箱に移動してください。そうしないと、テンプレートに表示されます。

于 2010-11-30T01:19:39.307 に答える