2011-05-12 101 views
10

我一直在努力让Jinja2定制扩展工作 - 当他们说写一个不是“平民”时,文档并不是在开玩笑 - 最终设法到达这个工作代码:定制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 

正如我所说,这是现在的工作。我不确定的是为什么我需要返回nodes.CallBlockparse(),而不是self.call_method()(它返回一个nodes.Call对象)。如果任何人有任何见解 - 或者可以指示我写一篇关于编写扩展的教程 - 请让我知道。

+1

前段时间我写了一个Jinaj2扩展......并已经忘记了一切:) – zeekay 2011-05-12 02:50:13

回答

4

原因是parse()预计会返回一个语句节点,例如CallBlockAssigncall_method()返回表达式节点,您必须将其包装在CallBlock中才能有语句。

+0

有道理,谢谢。 – dcrosta 2011-08-11 18:33:23