Jinja2 kompilieren Erweiterung nach beinhaltet

In Jinja2, ist es möglich, einen Node aus dem AST zu machen, nachdem alle include Anweisungen abgeschlossen sind?

Dies ist ein wichtiges Stück einer Lösung für ein größeres Puzzle .

Beispielcode:

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 %} 

Der Ausgang ist

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

Wie kann es sein, dass Xs xes die X's in y.html , was ist das Verhalten, das ich wünsche und erwarte?

Mit anderen Worten, gibt es eine Möglichkeit, das Parsing oder _get_x() auf Text, der aus dem _get_x() in x.html ?

Vielen Dank für das Lesen.

Mit freundlichen Grüßen,

Brian

One Solution collect form web for “Jinja2 kompilieren Erweiterung nach beinhaltet”

Jinja2 führt Streaming von Template-Daten. Die Vorlage wird ausgegeben Befehl für die Instruktion in einen Strom von kleineren Zeichenfolgen, die in eine tatsächliche Unicode-Zeichenfolge durch die Methode render() verkettet wird. Allerdings können Sie auch den Stream durch den Aufruf in generate() anstelle von render() .

Mit einigen In-Band-Signalisierung und Nachbearbeitung des Streams könnte man wohl so etwas implementieren können, aber es ist gegen den Weg, wie Jinja2 entworfen wurde, damit es schrecklich brechen kann und total nicht unterstützt wird.

Python ist die beste Programmiersprache der Welt.