Привет, Я пытался создать расширение для jinja2, которое объединило бы несколько элементов с разделителем, а пропуская элементы (фрагменты шаблона), которые оцениваются в пробелы.Как написать расширение «столяр» для Jinja2?
Есть несколько таких фрагментов, и вы никогда не знаете заранее, какие из них будут не пустыми и какие будут.
Звучит как тривиальная задача, но у меня было очень тяжелое время, чтобы это работало в jinja2. Возможно, причина в том, что jinja не позволяет определять пользовательские узлы шаблонов.
У вас есть предложения? Ниже приведен фрагмент, который будет выполнять синтаксический анализ, но ему не хватает части оценки.
class JoinerExtension(Extension):
"""Template tag that joins non-whitespace (string) items
with a specified separator
Usage syntax:
{% joinitems separator='|' %}
....
{% separator %}
....
{% separator %}
....
{% endjoinitems %}
where value of "separator" within the joinitems tag
can be an expression, not necessarily a sting
"""
tags = set(['joinitems'])
def parse(self, parser):
"""parse function for the
joinitems template tag
"""
lineno = next(parser.stream).lineno
#1) read separator
separator = None
while parser.stream.current.type != 'block_end':
name = parser.stream.expect('name')
if name.value != 'separator':
parser.fail('found %r, "separator" expected' %
name.value, name.lineno,
exc=TemplateAssertionError)
# expressions
if parser.stream.current.type == 'assign':
next(parser.stream)
separator = parser.parse_expression()
else:
var = parser.stream.current
parser.fail('assignment expected after the separator' %
var.value, var.lineno,
exc=TemplateAssertionError)
#2) read the items
items = list()
end_tags = ['name:separator', 'name:endjoinitems']
while True:
item = parser.parse_statements(end_tags)
items.append(item)
if parser.stream.current.test('name:separator'):
next(parser.stream)
else:
next(parser.stream)
break
, который будет работать, используя встроенный в настоящее время со стратегически размещенными {{pipe()}} вызовами. – Evgeny