Frage

In Jinja2 ist es möglich, eine Node vom AST haben zu machen, nachdem alle include Anweisungen abgeschlossen haben?

Dies ist ein Schlüssel Stück einer Lösung ein größeres Rätsel .

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

Die Ausgabe ist

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

Wie kann es möglich sein Xs xes zu haben, um die X in y.html zählen, die das Verhalten, das ich wünsche und erwarten?

Mit anderen Worten ist es eine Möglichkeit, die Analyse oder Abflachung zu Text aus dem _get_x() in x.html zurück zu verzögern?

Vielen Dank für das Lesen.

Mit freundlichen Grüßen

Brian

War es hilfreich?

Lösung

Jinja2 nicht Streaming von Schablonendaten. Die Vorlage wird Anweisung für Anweisung in einen Strom von kleineren Strings ausgewertet, die in einen tatsächlichen Unicode-String durch die render() Methode verkettet werden. Sie können aber auch halten den Strom bekommen durch den Aufruf in generate() statt render().

Mit einiger In-Band-Signalisierung und Nachbearbeitung des Stroms könnte man wahrscheinlich in der Lage sein, so etwas zu implementieren, aber es ist gegen die Art und Weise, wie Jinja2 wurde so konzipiert, es brechen könnte schrecklich und ist völlig nicht unterstützt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top