3

Jinja2では、すべてのステートメントが完了しNodeた後にASTからのレンダリングを行うことは可能ですか?include

これは、より大きなパズルの解決策の重要な部分です。

コード例:

x.py

from jinja2 import nodes, Environment, FileSystemLoader
from jinja2.ext import Extension

class XExtension(Extension):
    tags = set(['x', 'get_x'])

    def __init__(self, environment):
        super(XExtension, self).__init__(environment)
        environment.extend(
            x = 0,
        )

    def parse(self, parser):
        tag = parser.stream.next()
        return getattr(self, "_%s" % str(tag))(parser, tag)

   def _get_x(self, parser, tag):
        """ Return the output """
        return nodes.Const(self.environment.x)

   def _x(self, parser, tag):
        """ Add an x """
        self.environment.x += 1
        return nodes.Const('<!-- Adding an X -->')

env = Environment(
    loader      = FileSystemLoader('.'),
    extensions  = [XExtension],
    )

template = env.get_template('x.html')
print template.render()

x.html

Xx {% x %} Xx {% x %}
{% include "y.html" %}
Xs xes: {% get_x %}

y.html

Yx {% x %}
Ys xes: {% get_x %}

出力は

Xx <!-- Adding an X --> Xx <!-- Adding an X -->
Yx <!-- Adding an X -->
Ys xes:3
Xs xes 2

Xs xesでXをカウントすることはどのように可能y.htmlでしょうか。これは、私が望み、期待する動作です。

言い換えると、_get_x()inから返されたテキストの解析またはフラット化を遅らせる方法はありx.htmlますか?

読んでいただきありがとうございます。

敬具、

ブライアン

4

1 に答える 1

3

Jinja2はテンプレートデータのストリーミングを行います。テンプレートは、メソッドによって実際のUnicode文字列に連結される小さな文字列のストリームへの命令に対して評価されますrender()generate()ただし、の代わりにを呼び出すことでストリームを取得することもできますrender()

いくつかの帯域内信号方式とストリームの後処理を使用すると、おそらくそのようなものを実装できる可能性がありますが、Jinja2の設計方法に反しているため、ひどく壊れて完全にサポートされない可能性があります。

于 2010-11-28T01:43:11.833 に答える