Можно ли скомпилировать или вернуть часть Jinja2 AST?
Например, можно ли вызвать функцию или метод из jinja2.environment
a> или jinja2.compiler.generate
или эквивалент в списке узлов, извлеченных из шаблона?
Например, для шаблона y.html
:
avant-tag
{% xyz %}
tag content {{ 3 + 5 }}
{% endxyz %}
apres-tag
и расширение 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()
Запуск python y.py
приводит к ожидаемому результату:
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
В методе parse
как можно:
- скомпилировать
body
в юникод (т.е.tag-content 8
); или, альтернативно - вернуть
body
к исходному источнику (т.е.tag-content {{ 3 + 5 }}
).
С точки зрения предыстории этот вопрос связан с двумя предыдущими вопросами:
- Расширение компиляции Jinja2 после включения; и
- Вставить javascript поверх включения файла в Jinja 2 а>
Спасибо за чтение.
Брайан