Frage

Kann man Kompilierung oder einen Teil des Jinja2 AST?

zurückkehren

Zum Beispiel ist es möglich, eine Funktion oder Methode von zu nennen jinja2.environment oder jinja2.compiler.generate oder einige äquivalente auf einer Liste von Knoten aus einer Vorlage extrahierten?

Zum Beispiel einer Vorlage y.html gegeben:

avant-tag
{% xyz %}
tag content {{ 3 + 5 }}
{% endxyz %}
apres-tag

und eine Erweiterung 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()

Ausführen python y.py Ergebnisse in dem erwarteten Ausgang:

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

In dem parse Verfahren, wie kann man entweder:

  1. Kompilierung body zu Unicode (d tag-content 8); oder alternativ
  2. revert body zu seiner ursprünglichen Quelle (das heißt tag-content {{ 3 + 5 }}).

Als eine Frage der Hintergrund bezieht sich diese Frage auf zwei vor Fragen:

  1. Jinja2 Kompilierung Erweiterung nach enthält ; und
  2. Legen Sie Javascript an der Spitze der darunter Datei in Jinja 2

Danke für das Lesen.

Brian

War es hilfreich?

Lösung

zu Unicode Kompilieren ist noch nicht möglich, in der parse() Methode, da Sie nicht den Kontext an dieser Stelle zur Verfügung stehen. Sie können hack um es natürlich, aber es wäre wahrscheinlich nicht der beste Weg zu gehen.

Beachten Sie, dass der parse() Schritt normalerweise nur einmal auf einer HTML-Datei ausgeführt wird, nach, dass es die geparsten Bytecode verwenden, um die Vorlage zu machen. Die Ergebnisse der Parse-Schritt kann eine Umgebung gegeben gemacht werden.

Sie haben einfach nicht den Kontext verfügbar dort, und immer den Kontext, in dort ... recht schwierig;)

Um die ursprüngliche Quelle jedoch zu bekommen ... nicht viel einfacher, ohne Hacking, aber das Hacking ist nicht so schlecht;)

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

Danach können Sie den Text als value vom {% raw %} Knoten lesen kann. Achten Sie darauf, dass nach dem Papierkorb es oder es wird in der Vorlage zeigen.

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