2011-05-12 24 views
10

Bu Jinja2 özel uzantısının çalışmasını sağlamak için uğraştım - doktorlar "siviller" için yazmadıklarını söylerken şaka yapmıyorlardı - ve sonunda bu çalışma koduna ulaşmayı başardılar :Özel Jinja2 Uzantısı ile Yardım

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 

Dediğim gibi, bu şimdi çalışıyor. Emin olmadığımdan dolayı, self.call_method() (nodes.Call nesnesini döndürür) yerine, nodes.CallBlock (parse()) döndürmem gerekiyor. Herhangi bir içgörü varsa veya bana yazım uzantıları ile ilgili bir öğretici yazabilirseniz lütfen bana bildirin.

+1

Bir süre önce bir Jinaj2 uzantısı yazdım ... ve zaten her şeyi unuttum :) – zeekay

cevap

4

Nedeni, parse()'un CallBlock veya Assign gibi bir bildirim düğümü döndürmesidir. call_method(), bir ifade için CallBlock içinde sarmanız gereken bir ifade düğümü döndürür.

+0

Anlam veriyor, teşekkürler. – dcrosta