Обтекание длинных текстовых разделов в Jinja2 - PullRequest
1 голос
/ 08 марта 2019

У меня есть определение переменной, ее имя и связанный комментарий в файле 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 ]

Конечно,это не надежно, но отвечает моим основным требованиям.

1 Ответ

1 голос
/ 08 марта 2019

Вы можете добавить к данной строке символ новой строки, затем использовать фильтр wordwrap, чтобы сначала обернуть текст в несколько строк, и использовать фильтр replace, чтобы заменить символы новой строки на символ новой строки плюс '# ':

{{ ('\n' ~ item.comment) | wordwrap(78) | replace('\n', '\n# ') }}

Выше предполагается, что каждая строка должна содержать не более 80 символов.Измените 78 на желаемую ширину линии минус 2, чтобы оставить место для '# '.

...