У меня есть определение переменной, ее имя и связанный комментарий в файле YAML, и я пытаюсь использовать Jinja2 для создания соответствующего целевого файла;в этом случае проприетарный файл конфигурации
...
- comment: >
This is a comment which will almost certainly end up longer than standard eighty characters or at least on the occasion on which it does.
name: my_useful_variable
value: /a/long/example/path/to/my/file.txt
Я хотел бы, чтобы этот текст отображался следующим образом:
# This is a comment which will almost certainly end up
# longer than standard eighty characters or at least on
# the occasion on which it does.
my_useful_variable = "/a/long/example/path/to/my/file.txt"
Есть ли у Jinja2 какой-либо способ обтекания текста так, чтобыдлинная строка комментария ограничена по длине и разбита на сколько необходимо строк?
Пока у меня есть:
# {{item.comment}}
{{item.name}} = "{{item.value}}"
Но это, конечно, не касается длиныкомментарий.
Решение
Следуя ответу, предоставленному @blhsing ниже, я придумал следующий макрос, который отлично работает для основных переменных и простых списков.(т. е. не словари или более сложные иерархические структуры данных:
{% macro set_params(param_list, ind=4, wid=80) -%}
{% for item in param_list %}
{% if item.comment is defined %}{{item.comment|wordwrap(wid - ind - 2)|replace('', ' ' * ind +'# ', 1)|replace('\n', '\n' + ' ' * ind + '# ')}}
{% endif %}
{% if item.value is iterable and item.value is not string %}{{item.name|indent(ind, True)}} = [ {% for item_2 in item.value %}{{item_2}}{{ ", " if not loop.last else " " }}{% endfor %}{% else %}{{item.name|indent(ind, True)}} = {{item.value}}{% endif %}
{% endfor %}
{%- endmacro %}
Чтобы использовать это, просто передайте список элементов, аналогичный спецификации, приведенной вверху, вместе с отступом и шириной страницы.
Небольшое объяснение:
- Строка 3, если комментарий определен, то это слово переносится на правильную длину с учетом ширины и отступа. Первая замена имеет дело с indЗанимая первую строку, а второй отступ последующих строк.Все префиксы с префиксом «#»
- в строке 5, в зависимости от того, является ли переменная простой или итеративной, отображаются в виде
name = value
или name = [ value1, value2, value3 ]
Конечно,это не надежно, но отвечает моим основным требованиям.