Я изо всех сил пытался заставить это собственное расширение 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.CallBlock
в parse()
, а не self.call_method()
(который возвращает nodes.Call
объект). Если у кого-то есть понимание - или можете указать мне учебник по написанию расширений - пожалуйста, дайте мне знать.