В YAML как разбить строку на несколько строк?
В YAML у меня есть очень длинная строка. Я хочу сохранить это в 80-колоночном (или около того) виде моего редактора, поэтому я хотел бы разбить строку. Какой синтаксис для этого?
Другими словами, у меня есть это:
Key: 'this is my very very very very very very long string'
и я хотел бы иметь это (или что-то на этот счет):
Key: 'this is my very very very ' +
'long string'
Я хотел бы использовать кавычки, как указано выше, поэтому мне не нужно ничего экранировать внутри строки.
8 ответов
Используя стиль сгиба yaml, каждый разрыв строки заменяется пробелом. Отступ в каждой строке будет игнорироваться. В конце будет вставлен разрыв строки.
>
This is a very long sentence
that spans several lines in the YAML
but which will be rendered as a string
with only a single carriage return appended to the end.
http://symfony.com/doc/current/components/yaml/yaml_format.html
Вы можете использовать "индикатор блокировки блока", чтобы устранить разрыв в трейлинговой линии следующим образом:
>-
This is a very long sentence
that spans several lines in the YAML
but which will be rendered as a string
with NO carriage returns.
Также доступны другие инструменты управления (например, для управления отступами).
Смотрите https://yaml-multiline.info/
Существует 5 6 NINE (или 63*, в зависимости от того, как вы считаете) различных способов написания многострочных строк в YAML.
Блокировать скалярные стили (>
, |
)
Они позволяют такие символы, как \
а также "
без экранирования и добавления новой строки (\n
) до конца вашей строки.
>
Сложенный стиль удаляет одиночные символы новой строки в строке (но добавляет один в конце и преобразует двойные строки в одиночные):
Key: >
this is my very very very
long string
→ this is my very very very long string\n
|
Литеральный стиль превращает каждую новую строку в строке в буквальную новую строку и добавляет один в конце:
Key: |
this is my very very very
long string
→ this is my very very very\nlong string\n
Вот официальное определение от YAML Spec 1.2
Скалярное содержимое может быть записано в блочной нотации, используя буквальный стиль (обозначенный "|"), где все разрывы строк являются значительными. В качестве альтернативы, они могут быть записаны в сложенном стиле (обозначается ">"), где каждый разрыв строки свернут в пробел, если он не заканчивается пустой или более отступой строкой.
Стили блоков с индикатором чипирования блоков (>-
, |-
, >+
, |+
)
Вы можете контролировать обработку последней новой строки в строке и любых завершающих пустых строк (\n\n
), добавив символ индикатора блокада:
>
,|
: "clip": сохранить перевод строки, удалить завершающие пустые строки.>-
,|-
: "strip": удалить перевод строки, удалить завершающие пустые строки.>+
,|+
: "keep": сохранить перевод строки, оставить после себя пустые строки.
"Поток" скалярных стилей (
, "
, '
)
Они имеют ограниченный выход и создают однострочную строку без символов новой строки. Они могут начинаться с той же строки, что и ключ, или сначала с новых строк.
простой стиль (нет выхода, нет #
или же :
комбинации, ограничения на первый символ):
Key: this is my very very very
long string
стиль в двойных кавычках (\
а также "
должен быть сброшен \
, новые строки могут быть вставлены с литералом \n
последовательность, строки могут быть объединены без пробелов с конечным \
):
Key: "this is my very very \"very\" loooo\
ng string.\n\nLove, YAML."
→ "this is my very very \"very\" loooong string.\n\nLove, YAML."
стиль в одинарных кавычках (буквальный '
должно быть удвоено, без специальных символов, возможно, полезно для выражения строк, начинающихся с двойных кавычек):
Key: 'this is my very very "very"
long string, isn''t it.'
→ "this is my very very \"very\" long string, isn't it."
Резюме
В этой таблице _
средства space character
, \n
означает "символ новой строки" (\n
в JavaScript), за исключением строки "inline inline", где это означает буквально обратную косую черту и n).
> | " ' >- >+ |- |+
-------------------------|------|-----|-----|-----|------|------|------|------
Trailing spaces | Kept | Kept | | | | Kept | Kept | Kept | Kept
Single newline => | _ | \n | _ | _ | _ | _ | _ | \n | \n
Double newline => | \n | \n\n | \n | \n | \n | \n | \n | \n\n | \n\n
Final newline => | \n | \n | | | | | \n | | \n
Final dbl nl's => | | | | | | | Kept | | Kept
In-line newlines | No | No | No | \n | No | No | No | No | No
Spaceless newlines| No | No | No | \ | No | No | No | No | No
Single quote | ' | ' | ' | ' | '' | ' | ' | ' | '
Double quote | " | " | " | \" | " | " | " | " | "
Backslash | \ | \ | \ | \\ | \ | \ | \ | \ | \
" #", ": " | Ok | Ok | No | Ok | Ok | Ok | Ok | Ok | Ok
Can start on same | No | No | Yes | Yes | Yes | No | No | No | No
line as key |
Примеры
Обратите внимание на конечные пробелы в строке перед "пробелами".
- >
very "long"
'string' with
paragraph gap, \n and
spaces.
- |
very "long"
'string' with
paragraph gap, \n and
spaces.
- very "long"
'string' with
paragraph gap, \n and
spaces.
- "very \"long\"
'string' with
paragraph gap, \n and
s\
p\
a\
c\
e\
s."
- 'very "long"
''string'' with
paragraph gap, \n and
spaces.'
- >-
very "long"
'string' with
paragraph gap, \n and
spaces.
[
"very \"long\" 'string' with\nparagraph gap, \\n and spaces.\n",
"very \"long\"\n'string' with\n\nparagraph gap, \\n and \nspaces.\n",
"very \"long\" 'string' with\nparagraph gap, \\n and spaces.",
"very \"long\" 'string' with\nparagraph gap, \n and spaces.",
"very \"long\" 'string' with\nparagraph gap, \\n and spaces.",
"very \"long\" 'string' with\nparagraph gap, \\n and spaces."
]
Стили блоков с индикаторами отступов
На случай, если вышеперечисленного недостаточно для вас, вы можете добавить " индикатор отступа блока " (после индикатора блокирования блока, если он у вас есть):
- >8
My long string
starts over here
- |+1
This one
starts here
добавление
Если вы вставите лишние пробелы в начале не первых строк в стиле "Сложенный", они будут сохранены с бонусной новой строкой. Этого не происходит со стилями потока:
- >
my long
string
- my long
string
→ ["my long\n string\n", "my long string"]
Я не могу даже.
*
2 стиля блока, каждый с 2-мя возможными индикаторами сочетания блоков (или без них) и с 9-ю возможными индикаторами отступа (или без), 1 простой стиль и 2 указанных стиля: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63
Часть этой информации также была обобщена здесь.
Для сохранения перевода строки используйте |
, например:
|
This is a very long sentence
that spans several lines in the YAML
but which will be rendered as a string
with newlines preserved.
переводится как "Это очень длинное предложение \ n, которое занимает несколько строк в YAML \ n, но которое будет отображаться как строка \ n с сохранением новых строк. \ n "
1. Блок-нотация. Новые строки становятся пробелами, а дополнительные - после удаления блока.
---
# Note: It has 1 new line after the string
content:
Arbitrary free text
over multiple lines stopping
after indentation changes...
...
Эквивалент JSON
{
"content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}
2. Буквальный скалярный блок: Буквальный скалярный блок | будет включать переводы строки и любые пробелы. но удаляет лишнее
новые строки после блока.
---
# After string we have 2 spaces and 2 new lines
content1: |
Arbitrary free text
over "multiple lines" stopping
after indentation changes...
...
Эквивалент JSON
{
"content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes... \n"
}
3. + индикатор со скалярным литеральным блоком: сохраняйте дополнительные символы новой строки после блока
---
# After string we have 2 new lines
plain: |+
This unquoted scalar
spans many lines.
...
Эквивалент JSON
{
"plain": "This unquoted scalar\nspans many lines.\n\n\n"
}
4. - индикатор со скалярным литеральным блоком: - означает, что новая строка в конце строки удалена.
---
# After string we have 2 new lines
plain: |-
This unquoted scalar
spans many lines.
...
Эквивалент JSON
{
"plain": "This unquoted scalar\nspans many lines."
}
5. Сложенный блок скаляров (>):
будет складывать новые строки в пробелы, но удаляет лишние новые строки после блока.
---
folded_newlines: >
this is really a
single line of text
despite appearances
...
Эквивалент JSON
{
"fold_newlines": "this is really a single line of text despite appearances\n"
}
для большего вы можете посетить мой блог
Чтобы объединить длинные строки без пробелов, используйте двойные кавычки и экранируйте символы новой строки с помощью обратной косой черты:
key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
orincididuntutlaboreetdoloremagnaaliqua."
(Спасибо @Tobia)
Возможно, вы не поверите, но YAML также может выполнять многострочные ключи:
?
>
multi
line
key
:
value
Если вы используете yml и Twig для переводов в Symfony и хотите использовать многострочные переводы в Javascript, сразу после перевода добавляется возврат каретки. Так что даже следующий код:
var javascriptVariable = "{{- 'key'|trans -}}";
Который имеет следующий перевод YML:
key: >
This is a
multi line
translation.
По-прежнему приведет к следующему коду в HTML:
var javascriptVariable = "This is a multi line translation.
";
Таким образом, знак минус в Twig не решает эту проблему. Решение состоит в том, чтобы добавить этот знак минус после знака "больше, чем" в yml:
key: >-
This is a
multi line
translation.
Будет ли правильный результат, многострочный перевод в одну строку в Twig:
var javascriptVariable = "This is a multi line translation.";
Для ситуаций, когда строка может содержать пробелы или нет, я предпочитаю двойные кавычки и продолжение строки с обратными слешами:
key: "String \
with long c\
ontent"
Но обратите внимание на ловушку для случая, когда линия продолжения начинается с пробела, ее нужно экранировать (потому что она будет удалена в другом месте):
key: "String\
\ with lon\
g content"
Если строка содержит разрывы строк, это должно быть написано в стиле C \n
,
Смотрите также этот вопрос.
Ни одно из перечисленных выше решений не сработало для меня, в файле YAML в проекте Jekyll. Перепробовав много вариантов, я понял, что HTML-инъекция с <br>
может сделать то же самое, так как в конце все отображается в HTML:
название: |
В деревне Ла Манча <br>
чье имя я не <br>
хочу вспомнить.
По крайней мере, это работает для меня. Без понятия о проблемах, связанных с этим подходом.