Я пытаюсь адаптировать Jinja2 WithExtension для создания общего расширения для упаковки блока (за которым следуют некоторые более сложные).
Моя цель заключается в поддержке следующих шаблонов:
{% wrap template='wrapper.html.j2' ... %}
<img src="{{ url('image:thumbnail' ... }}">
{% endwrap %}
И для wrapper.html.j2, чтобы выглядеть как-то вроде:
<div>
some ifs and stuff
{{ content }}
more ifs and stuff
</div>
Я считаю, что мой пример больше всего в этом случае, WithExtension, похоже, разбирает блок, а затем добавляет AST-представление некоторых узлов {% assign .. %}
в контекст узлов, которые он разбор.
Итак, я решил, что хочу одно и то же, эти назначения, за которым следует блок include, который я ожидаю получить доступ к этим переменным при анализе АСТ и пройти через блок, который был завернут как переменная content
.
У меня есть следующее:
class WrapExtension(Extension):
tags = set(['wrap'])
def parse(self, parser):
node = nodes.Scope(lineno=next(parser.stream).lineno)
assignments = []
while parser.stream.current.type != 'block_end':
lineno = parser.stream.current.lineno
if assignments:
parser.stream.expect('comma')
target = parser.parse_assign_target()
parser.stream.expect('assign')
expr = parser.parse_expression()
assignments.append(nodes.Assign(target, expr, lineno=lineno))
content = parser.parse_statements(('name:endwrap',), drop_needle=True)
assignments.append(nodes.Name('content', content))
assignments.append(nodes.Include(nodes.Template('wrapper.html.j2'), True, False))
node.body = assignments
return node
Однако он падает на моей строке nodes.Include
, я просто получаю assert frame is None, 'no root frame allowed'
. Я считаю, что мне нужно передать AST на nodes.Template
, а не на имя шаблона, но я действительно не знаю, как анализировать дополнительные узлы с целью получения AST, а не вывода строки (то есть визуализации), - и не является ли это правильный подход. Я на правильных строках, любые идеи о том, как я должен это делать?