2010-11-29 12 views
2

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所与例えば

、方法、どのようにすることができます:

  1. コンパイルbodyユニコードtag-content 8);または代替として
  2. bodyを元のソースに戻します(つまり、tag-content {{ 3 + 5 }})。背景の問題として

、この質問は、前の2つの質問に関連する:

  1. Jinja2 compile extension after includes。そして
  2. Insert javascript at top of including file in Jinja 2

をお読みいただきありがとうございました。あなたはその時点で入手可能なコンテキストを持っていないので、

unicodeにコンパイルブライアン

答えて

1

parse()方法ではまだ不可能です。あなたはそれを周りにハックすることができますが、それはおそらく最善の方法ではないでしょう。

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

あなたは単に...非常に難しいが、コンテキストを用意して、そこにコンテキストを取得しません。)

オリジナルのソースを取得するために、しかし...ずっとハッキングなしで簡単に、しかし、ハッキングではありませんあなたは{% raw %}ノードからvalueなどのテキストを読むことができた後

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 

);あまりにも悪いことではありません。それ以降は必ずごみ箱に入れてください。そうしないとテンプレートに表示されません。

+0

ありがとうございます。私は私の質問に答えると思う。唯一残っている質問は、抽出された結果を環境に与える方法があるかどうかです。 –

+0

@Brian M. Hunt:どちらの文字列をどちらの方法でもレンダリングできるので問題ありません。 'Environment.from_string()'や 'Template(nodes)'を通常どおり返すことができます。 – Wolph

+0

ああそう!申し訳ありませんが、私は不明でした...唯一残っている質問は、抽出されたノード**(テキストではない)を環境に与えてレンダリングする方法があるかどうかです。 –

関連する問題