Пользовательское расширение Jinja: разбирать аргументы в любом порядке их написания - PullRequest
0 голосов
/ 25 октября 2019

Я создал собственное расширение Jinja, которое при использовании внутри шаблона выглядит примерно так:

{% field "text" name="color" value="Yellow" class="bold" %}

И после того, как оно было интерпретировано Jinja, полученный HTML-кодis:

<div class='bold'>Yellow</div>

Работает нормально, за исключением того факта, что параметры должны быть записаны в точном порядке (name, затем value и, наконец, class),Я бы хотел, чтобы он обрабатывал параметры более гибко, т.е. что они могут быть указаны в любом порядке.

Вот как я это реализовал:

def parse(self, parser):

        lineno = parser.stream.__next__().lineno
        context = jinja2.nodes.ContextReference()
        tag = parser.parse_expression().value

        if tag not in self.environment.supported_tags:
            raise TemplateSyntaxError(f'Unexpected template tag {tag}. '
                                      f'Expected one of {self.environment.supported_tags}.',
                                      lineno, tag)

        value = css_class = ''

        if parser.stream.current.test('name:name'):
            parser.stream.skip(2)
            parser.parse_expression()  # parse the field name
            parser.stream.skip_if('comma')

        if parser.stream.current.test('name:value'):
            parser.stream.skip(2)
            value = parser.parse_expression()
            parser.stream.skip_if('comma')

        if parser.stream.current.test('name:class'):
            parser.stream.skip(2)
            css_class = parser.parse_expression()
            parser.stream.skip_if('comma')

        args = [value, css_class, context]
        call = self.call_method('_create_field', args)
        return jinja2.nodes.Output([call], lineno=lineno)

Я понимаю, почему он ведет себя так, как есть, но я не знаю, какдля анализа параметров в любом заданном порядке.

Есть идеи, как заставить его принимать параметры в любом порядке?

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