Próbuję zaadaptować urządzenie Jinja2 WithExtension, aby utworzyć ogólne rozszerzenie do zawijania bloku (a następnie kilka bardziej złożonych).Jak analizować i wstrzykiwać dodatkowe węzły w rozszerzeniu Jinja?
Moim celem jest wspieranie następujących szablonów:
{% wrap template='wrapper.html.j2' ... %}
<img src="{{ url('image:thumbnail' ... }}">
{% endwrap %}
I wrapper.html.j2 wyglądać coś takiego:
<div>
some ifs and stuff
{{ content }}
more ifs and stuff
</div>
wierzę moim przykładem jest większość drogi tam pojawia się parametr WithExtension, aby przeanalizować blok, a następnie dołączyć reprezentację AST niektórych węzłów {% assign .. %}
do kontekstu węzłów, które analizuje.
Więc pomyślałem, że chcę tego samego, te przypisania, po którym następuje blok włączający, który spodziewałbym się mieć możliwość uzyskania dostępu do tych zmiennych podczas analizowania AST i przejścia przez blok, który był zawijany jako zmienna content
.
Mam następujący dotąd:
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
jednak przewraca w moim nodes.Include
linii, po prostu dostać assert frame is None, 'no root frame allowed'
. Uważam, że muszę przekazać AST do nodes.Template
zamiast nazwy szablonu, ale tak naprawdę nie wiem, jak analizować w dodatkowych węzłach w celu uzyskania AST raczej niż wyjście łańcuchowe (tj. Renderowania) - ani czy jest to właściwe podejście . Czy jestem na właściwej linii, jakieś pomysły na to, jak powinienem to zrobić?
Czy możesz dodać więcej szczegółów na temat wymaganych wyników? Czy chcesz zakończyć znacznikami zawartymi w treści 'wrapper.html.j2'? Czy możesz podać przykład zawartości dla 'wrapper.html.j2'? – tutuDajuju
Och, whoops, w upraszczaniu mojego przykładu zrobiłem to bezsensowne, będę aktualizować przykłady – Steve