В YAML у меня есть строка, которая'очень длинная. Я хочу сохранить ее в пределах 80-колоночного (или около того) представления моего редактора, поэтому я хотел бы разбить строку. Каков синтаксис для этого?
Другими словами, у меня есть следующее:
Key: 'this is my very very very very very very long string'
и я хотел бы иметь это (или что-то в этом роде):
Key: 'this is my very very very ' +
'long string'
Я'хотел бы использовать кавычки, как указано выше, так что мне не нужно экранировать что-либо в строке.
Существует 5 6 НЕСКОЛЬКО (или 63*, смотря как считать) различных способов записи многострочных строк в YAML.
Обычно вам нужно >
:
>
Ваша длинная
строка здесь.
Если вы хотите, чтобы разрывы строк сохранялись как \n
в строке (например, встроенный маркдаун с абзацами), используйте |
.
ключ: |
### Заголовок
* Пуля
* Точки
Используйте >-' или
|-' вместо этого, если вы не хотите, чтобы в конце добавлялся знак переноса строки.
Если вам нужно разделить строки в середине слов или буквально напечатать разрывы строк как \n
, используйте двойные кавычки:
ключ: "Антидизестаб\
lishmentarianism.\n\n\nGet on it."
YAML - это безумие.
>
, |
)Они позволяют использовать такие символы, как \
и "
без экранирования, и добавляют новую строку (\n
) в конец вашей строки.
>
Folded style удаляет одиночные новые строки внутри строки (но добавляет одну в конце, и преобразует двойные новые строки в одиночные):
Key: >
this is my very very very
long string
→ это моя очень очень очень очень очень длинная строка\n
.
|
Буквальный стиль превращает каждую новую строку в строке в буквальную новую строку и добавляет одну в конце:
Key: |
this is my very very very
long string
→ это моя очень очень очень очень очень очень очень очень очень очень длинная строка\n
.
Вот'официальное определение из YAML Spec 1.2
Скалярное содержимое может быть записано в блочной нотации, используя литеральный стиль (обозначается "|"), где все переносы строк являются значимыми. В качестве альтернативы, они могут быть записаны с использованием стиля сложения (обозначается ">"), где каждый перевод строки сворачивается в пробел, если он не заканчивается пустой или более отступной строкой.
>-
, |-
, >+
, |+
)Вы можете управлять обработкой последней новой строки в строке, а также любых пустых строк (\n\n
), добавляя символ индикатор блочности:
>
, |
: "clip": сохраняет перевод строки, удаляет пустые строки.>-
, |-
: "strip": удаление перевода строки, удаление пустых строк.>+
, |+
: "сохранить": сохранить перевод строки, сохранить пустые строки.,
",
'`)Они имеют ограниченную экранировку и строят однострочную строку без символов новой строки. Они могут начинаться с той же строки, что и ключ, или с дополнительной новой строки.
plain style (без экранирования, без комбинаций #
или :
, ограничения на первый символ):
Key: this is my very very very
long string
стиль двойных кавычек (\
и "
должны быть экранированы \
, новые строки могут быть вставлены буквальной последовательностью \n
, строки могут быть объединены без пробелов с подстрочными \
):
Key: "this is my very very \"very\" loooo\
ng string.\n\nLove, YAML."
→ "Это моя очень очень очень очень \"очень\" длинная строка.\n\nЛюбовь, YAML."
{{83843}}
стиль одинарных кавычек (литерал '
должен быть удвоен, никаких специальных символов, возможно полезно для выражения строк, начинающихся с двойных кавычек):
Key: 'this is my very very "very"
long string, isn''t it.'
→ `"Это моя очень очень \"очень\" длинная строка, не так ли.".
В этой таблице _
означает пробельный символ
. \n
означает "символ новой строки" (\n
в JavaScript), за исключением строки "in-line newlines", где он означает буквально обратный слеш и 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
Если вы вставите лишние пробелы в начале не первых строк в стиле Folded, они будут сохранены, с бонусной новой строкой. Этого не происходит со стилями потока:
- >
my long
string
- my long
string
→ ["моя длинная\n строка\n", "моя длинная строка"]
.
Я даже не могу.
`` 2 блочных стиля, каждый с 2 возможными индикаторами разбивки блока (или ни одного), и с 9 возможными индикаторами отступов (или ни одного), 1 обычный стиль и 2 стиля с кавычками: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63*.
Часть этой информации также была обобщена здесь.
При использовании стиля yaml folded каждый перевод строки заменяется пробелом. Отступы в каждой строке будут игнорироваться. Разрыв строки будет вставлен в конце.
Key: >
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
Вы можете использовать индикатор "block chomping indicator" для устранения переноса строки, как показано ниже:
Key: >-
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.
Существуют и другие инструменты управления (например, для управления отступами).
Чтобы сохранить новые строки, используйте |
, например:
|
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"
}
для больше, вы можете посетить мой Блог
Для конкатенации длинных линий without whitespace, используйте двойные кавычки и Escape на новую строку с обратной косой черты:
key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
orincididuntutlaboreetdoloremagnaaliqua."
(Спасибо @Тобиа)
В случае, если вы're, используя YAML и веточку для переводов в Symfony, и хотите использовать многоканальный перевод на JavaScript, каретки добавляется сразу после перевода. Так что даже следующий код:
ВАР javascriptVariable = "был{{- ' ключ'|Транс -}}" у;;
Которое имеет следующий перевод в формате YML:
key: >
This is a
multi line
translation.
Все равно приведет в следующий код в HTML:
var javascriptVariable = "This is a multi line translation.
";
Таким образом, знак минус в веточку не решит этого. К раствору можно добавить этот знак минус после знака больше, чем в YML:
key: >-
This is a
multi line
translation.
Будет иметь должного результата, Multi перевод строки на одну строку в веточку:
var javascriptVariable = "This is a multi line translation.";
Для таких ситуаций были строка может содержать пробелы или нет, я предпочитаю двойные кавычки и продолжение линии с обратным Слэшем:
key: "String \
with long c\
ontent"
Но заметьте, про ловушки на случай, если строка продолжения начинается с пробела, то он должен быть экранирован (так как он будет лишать других местах):
key: "String\
\ with lon\
g content"
Если строка содержит переносы строк, это должно быть написано в стиле C \п
.
См. Также этот question.
Ни один из вышеупомянутых решений работал для меня в файл YAML в рамках проекта Джекил. Испробовав множество вариантов, я поняла, что укол HTML с <БР>
может сделать, так как в итоге все сконвертировано в HTML:
название: |
В деревне Ла-Манча <БР>
чье имя я не'т <БР>
хотят вспоминать.
По крайней мере это работает для меня. Понятия не имею о проблемах, связанных с этим подходом.