2011-05-12 17 views
10

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.

+1

Escribí una extensión Jinaj2 hace un tiempo ... y ya lo he olvidado todo :) – zeekay

Respuesta

4

La razón es que se espera que parse() devuelva un nodo de sentencia, como CallBlock o Assign. call_method() devuelve un nodo de expresión, que debe envolver en CallBlock para tener una declaración.

+0

Tiene sentido, gracias. – dcrosta

Cuestiones relacionadas