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