He tenido problemas para hacer funcionar esta extensión personalizada de Jinja2 - los documentos no son broma cuando dijeron que escribir uno no era para "civiles" - y finalmente logré llegar a este código de trabajo :Ayuda con la extensión personalizada de Jinja2
class WrapperExtension(Extension):
tags = set(['wrap'])
def parse(self, parser):
lineno = parser.stream.next().lineno
args = [parser.parse_expression()]
args.append(nodes.Const(args[0].name))
return nodes.CallBlock(
self.call_method('_render', args),
[], [], []).set_lineno(lineno)
def _render(self, value, name, *args, **kwargs):
if some_condition():
return '<wrapper id="%s">%s</wrapper>' % (name, value)
return value
Como dije, esto ahora está funcionando. Lo que no estoy seguro es por qué tengo que devolver nodes.CallBlock
en parse()
, en lugar de self.call_method()
(que devuelve un objeto nodes.Call
). Si alguien tiene alguna idea, o puede dirigirme a un tutorial sobre cómo escribir extensiones, por favor hágamelo saber.
Escribí una extensión Jinaj2 hace un tiempo ... y ya lo he olvidado todo :) – zeekay