В YAML у меня есть очень длинная строка. Я хочу сохранить это в 80-колоночном (или около того) виде моего редактора, поэтому я хотел бы разбить строку. Какой синтаксис для этого?
Другими словами, у меня есть это:
Key: 'this is my very very very very very very long string'
и я хотел бы иметь это (или что-то на этот счет):
Key: 'this is my very very very ' +
'long string'
Я хотел бы использовать кавычки, как указано выше, поэтому мне не нужно ничего экранировать внутри строки.
{{- 'key'|trans -}}
тоже не работает.Существует
56NINE (или 63 *, в зависимости от того, как вы считаете) различных способов написания многострочных строк в YAML.TL; DR
Обычно вы хотите
>
:Если вы хотите, чтобы разрывы
\n
строк были сохранены, как в строке (например, встроенная разметка с абзацами), используйте|
.Используйте
>-
или|-
вместо этого, если вы не хотите, чтобы разрыв строки добавлялся в конце.Если вам нужно разбить строки в середине слов или буквально ввести перевод строки как
\n
, используйте вместо этого двойные кавычки:YAML сумасшедший
Блокировать скалярные стили (
>
,|
)Они позволяют такие символы, как
\
и"
без экранирования, и добавляют новую строку (\n
) в конец вашей строки.>
Сложенный стиль удаляет одиночные новые строки в строке (но добавляет один в конце и преобразует двойные строки в одиночные):→
this is my very very very long string\n
|
Литеральный стиль превращает каждую новую строку в строке в буквальную новую строку и добавляет один в конце:→
this is my very very very\nlong string\n
Вот официальное определение от YAML Spec 1.2
Блок стилей с индикатором блока чавканье (
>-
,|-
,>+
,|+
)Вы можете управлять обработкой последней новой строки в строке и любых завершающих пустых строк (
\n\n
), добавив символ индикатора разбиения на блоки :>
,|
: "clip": сохранить перевод строки, удалить завершающие пустые строки.>-
,|-
: "strip": удалить перевод строки, удалить завершающие пустые строки.>+
,|+
: "keep": сохранить перевод строки, оставить после себя пустые строки."Поток" стили скалярные (
,
"
,'
)Они имеют ограниченный выход и создают однострочную строку без символов новой строки. Они могут начинаться с той же строки, что и ключ, или сначала с новых строк.
простой стиль (нет выхода, нет
#
или:
комбинаций, ограничения на первый символ):стиль в двойных кавычках (
\
и"
должен быть экранирован\
, символы новой строки могут быть вставлены с литералом\n
последовательностью, строки могут быть объединены без пробелов с завершающими\
):→
"this is my very very \"very\" loooong string.\n\nLove, YAML."
стиль в одинарных кавычках (буквальный
'
с одинарными кавычками должен быть удвоен, без специальных символов, возможно, полезно для выражения строк, начинающихся с двойных кавычек):→
"this is my very very \"very\" long string, isn't it."
Резюме
В этой таблице,
_
значитspace character
.\n
означает «символ новой строки» (\n
в JavaScript), за исключением строки «строка новой строки», где это означает буквально обратную косую черту и n).Примеры
Обратите внимание на конечные пробелы в строке перед «пробелами».
Стили блоков с индикаторами отступов
На случай, если вышеперечисленного недостаточно для вас, вы можете добавить « индикатор отступа блока » (после индикатора блокирования блока, если он у вас есть):
добавление
Если вы вставите лишние пробелы в начале не первых строк в стиле «Сложенный», они будут сохранены с бонусной новой строкой. Этого не происходит со стилями потока:
→
["my long\n string\n", "my long string"]
Я даже не могу.
*
2 стиля блока, каждый с 2-мя возможными индикаторами сочетания блоков (или без них) и с 9-ю возможными индикаторами отступа (или без него), 1 простой стиль и 2 указанных стиля: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63Часть этой информации также была обобщена здесь .
источник
"..." + "..."
в большинстве языков программирования, или обратную косую черту перед новой строкой в Bash.:
пределах одной строки в массиве строк заставляет YAML интерпретировать его как массив объектов. Это нарушает принцип наименьшего удивления .Для сохранения перевода строки используйте
|
, например:переводится как «Это очень длинное предложение \ n, которое занимает несколько строк в YAML \ n, но которое будет отображаться как строка \ n с сохранением новых строк. \ n »
источник
|
каждой строке, по причинам, которые мне не очевидны: groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9Acat
с разделителем это приводит к добавлению начальных пробелов (которые необходимы для YAML) к выводу.1. Блок-нотация (обычная, в стиле потока, скалярная): переводы строки становятся пробелами, а дополнительные строки после удаления блока
Эквивалент JSON
2. Буквальный Скалярный Блок: Буквальный Скалярный Блок |будет включать переводы строки и любые пробелы. но удаляет лишнее
новые строки после блока.
Эквивалент JSON
3. + индикатор со скалярным литеральным блоком: сохраняйте дополнительные символы новой строки после блока
Эквивалент JSON
4. - индикатор со скалярным литеральным блоком: - означает, что новая строка в конце строки удалена.
Эквивалент JSON
5. Сложенный блок скаляров (>):
будет складывать новые строки в пробелы, но удаляет лишние новые строки после блока.
Эквивалент JSON
для большего вы можете посетить мой блог
источник
Возможно, вы не поверите, но YAML также может выполнять многострочные ключи:
источник
key:value
, но если ваш ключ содержит новую строку, вы можете сделать это, как описано выше?
является ключевым индикатором (как в ключе в отображении). Во многих ситуациях вы можете не указывать индикатор ключа, когда индикатор (обязательный) значения:
после ключа делает разбор однозначным. Но это не тот случай, вам придется использовать это, чтобы явно пометить ключ.Чтобы объединить длинные строки без пробелов , используйте двойные кавычки и экранируйте символы новой строки с помощью обратной косой черты:
(Спасибо @Tobia)
источник
Если вы используете YAML и Twig для переводов в Symfony и хотите использовать многострочные переводы в Javascript, сразу после перевода добавляется возврат каретки. Так что даже следующий код:
var javascriptVariable = "{{- 'key'|trans -}}";
Который имеет следующий перевод YML:
По-прежнему приведет к следующему коду в HTML:
Таким образом, знак минус в Twig не решает эту проблему. Решение состоит в том, чтобы добавить этот знак минус после знака «больше, чем» в yml:
Будет ли правильный результат, многострочный перевод в одну строку в Twig:
источник
Для ситуаций, когда строка может содержать пробелы или нет, я предпочитаю двойные кавычки и продолжение строки с обратными слешами:
Но обратите внимание на ловушку для случая, когда линия продолжения начинается с пробела, ее нужно экранировать (потому что она будет удалена в другом месте):
Если строка содержит разрывы строк, это должно быть написано в стиле C
\n
.Смотрите также этот вопрос .
источник
Ни одно из перечисленных выше решений не сработало для меня в файле YAML в проекте Jekyll. Перепробовав много вариантов, я понял, что HTML-инъекция с использованием
<br>
может также подойти, так как в итоге все отображается в HTML:Имя:
|
В деревне Ла-Манча,<br>
чье имя я не<br>
хочу помнить.По крайней мере, это работает для меня. Без понятия о проблемах, связанных с этим подходом.
источник