Compile Unterabschnitt von Jinja2 AST
-
29-09-2019 - |
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:
- Kompilierung
body
zu Unicode (dtag-content 8
); oder alternativ - revert
body
zu seiner ursprünglichen Quelle (das heißttag-content {{ 3 + 5 }}
).
Als eine Frage der Hintergrund bezieht sich diese Frage auf zwei vor Fragen:
- Jinja2 Kompilierung Erweiterung nach enthält ; und
- Legen Sie Javascript an der Spitze der darunter Datei in Jinja 2
Danke für das Lesen.
Brian
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.