Помогите с пользовательским расширением Jinja2 - PullRequest
10 голосов
/ 12 мая 2011

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

1 Ответ

4 голосов
/ 10 августа 2011

Причина в том, что parse() должен возвращать узел оператора, такой как CallBlock или Assign.call_method() возвращает узел выражения, который необходимо обернуть в CallBlock, чтобы получить оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...