Sto tentando di adattare il Jinja2 WithExtension per produrre un'estensione generica per il wrapping di un blocco (seguito da alcuni più complessi).Come si analizzano e si iniettano nodi aggiuntivi in un'estensione Jinja?
Il mio obiettivo è quello di sostenere la seguente nei modelli:
{% wrap template='wrapper.html.j2' ... %}
<img src="{{ url('image:thumbnail' ... }}">
{% endwrap %}
E per wrapper.html.j2 a guardare come qualcosa di simile a:
<div>
some ifs and stuff
{{ content }}
more ifs and stuff
</div>
Credo che il mio esempio è la maggior parte del modo in cui In questo caso, WithExtension sembra analizzare il blocco e quindi aggiungere la rappresentazione AST di alcuni nodi {% assign .. %}
nel contesto dei nodi che sta analizzando.
Quindi ho pensato che volevo la stessa cosa, quei compiti, seguiti da un blocco di inclusione, che mi sarei aspettato di poter accedere a quelle variabili quando l'AST è analizzato, e di passare attraverso il blocco che era avvolto come una variabile content
.
Ho il seguente finora:
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
Tuttavia, cade sopra a mia linea nodes.Include
, ho semplicemente capito assert frame is None, 'no root frame allowed'
. Credo di dover passare AST a nodes.Template
anziché a un nome di modello, ma non so davvero come analizzare in nodi aggiuntivi per l'obiettivo di ottenere AST piuttosto che l'output di stringa (cioè i rendering) - né se questo sia l'approccio giusto . Sono sulla buona strada, qualche idea su come dovrei fare questo?
Potete aggiungere ulteriori dettagli sul risultato richiesto? Intendi finire con il markup contenuto nel contenuto di 'wrapper.html.j2'? Puoi dare un esempio di contenuto per 'wrapper.html.j2'? – tutuDajuju
Oh, whoop, nel semplificare il mio esempio l'ho reso non sensato, aggiornerò gli esempi – Steve