W YAML mam ciąg, który jest bardzo długi. Chcę to zachować w 80-kolumnowym widoku mojego edytora, więc chciałbym przerwać ciąg. Jaka jest składnia tego?
Innymi słowy, mam to:
Key: 'this is my very very very very very very long string'
i chciałbym mieć to (lub coś w tym celu):
Key: 'this is my very very very ' +
'long string'
Chciałbym użyć cytatów jak powyżej, więc nie muszę uciekać przed niczym w ciągu.
{{- 'key'|trans -}}
też nie działa.Istnieje
56Dziewięć (lub 63 *, w zależności od tego, jak się liczy) różnych sposobów pisania ciągów wieloliniowych w YAML.TL; DR
Zwykle chcesz
>
:Jeśli chcesz, aby podziały wierszy były zachowywane jak
\n
w ciągu (na przykład osadzone znakowanie akapitu), użyj|
.Użyj
>-
lub|-
zamiast tego, jeśli nie chcesz dołączać podziału linii na końcu.Jeśli chcesz podzielić wiersze na środku słów lub dosłownie wpisać podziały wiersza jako
\n
, użyj podwójnych cudzysłowów:YAML jest szalony.
Blokuj style skalarne (
>
,|
)Pozwalają one na znaki takie jak
\
i"
bez ucieczki oraz dodają nową linię (\n
) na końcu łańcucha.>
Styl zagięty usuwa pojedyncze znaki nowego ciągu (ale dodaje jeden na końcu i konwertuje podwójne znaki nowego na pojedyncze):→
this is my very very very long string\n
|
Dosłowny styl zamienia każdą nową linię w ciągu w dosłowną nową linię i dodaje jedną na końcu:→
this is my very very very\nlong string\n
Oto oficjalna definicja z YAML Spec 1.2
Style bloku z bloku chomping wskaźnik (
>-
,|-
,>+
,|+
)Możesz kontrolować obsługę ostatniego nowego wiersza w łańcuchu i dowolnych końcowych pustych linii (
\n\n
), dodając znak wskaźnika chompingowania bloku :>
,|
: „clip”: utrzymuj linię, usuń końcowe puste linie.>-
,|-
: „strip”: usuń linię, usuń końcowe puste linie.>+
,|+
: „keep”: utrzymuj linię, kontynuuj puste linie."Flow" style skalarne (
,
"
,'
)Mają one ograniczone znaki ucieczki i konstruują łańcuch jednowierszowy bez żadnych nowych znaków linii. Mogą zaczynać się w tym samym wierszu co klawisz lub najpierw z dodatkowymi znakami nowej linii.
zwykły styl (ma ucieczki, nie ma
#
lub:
kombinacje ograniczeń pierwszego znaku):styl podwójnego cudzysłowu (
\
i"
musi być\
poprzedzony znakiemucieczki, znaki nowej linii można wstawiać w dosłownej\n
kolejności, linie można łączyć bez spacji z końcowymi znakami\
):→
"this is my very very \"very\" loooong string.\n\nLove, YAML."
styl pojedynczego cudzysłowu (literał
'
musi być podwojony, bez znaków specjalnych, być może przydatne do wyrażania ciągów zaczynających się od podwójnych cudzysłowów):→
"this is my very very \"very\" long string, isn't it."
Podsumowanie
W tej tabeli
_
oznaczaspace character
.\n
oznacza „znak nowej linii” (\n
w JavaScript), z wyjątkiem wiersza „wbudowane znaki nowej linii”, gdzie dosłownie oznacza to odwrotny ukośnik i n).Przykłady
Zwróć uwagę na końcowe spacje w wierszu przed „spacjami”.
Blokuj style za pomocą wskaźników wcięcia
Na wypadek gdyby powyższe nie było dla Ciebie wystarczające, możesz dodać „ wskaźnik wcięcia bloku ” (po wskaźniku chompingowania bloku, jeśli taki masz):
Uzupełnienie
Jeśli wstawisz dodatkowe spacje na początku nie-pierwszych wierszy w stylu zagiętym, zostaną one zachowane z nową linią bonusową. Nie dzieje się tak w przypadku stylów przepływu:
→
["my long\n string\n", "my long string"]
Nawet nie umiem.
*
2 style bloków, każdy z 2 możliwymi wskaźnikami chompowania bloków (lub brak) i 9 możliwymi wskaźnikami wcięcia (lub brak), 1 styl zwykły i 2 stylami cytowanymi: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63Niektóre z tych informacji zostały również tutaj streszczone .
źródło
"..." + "..."
w większości języków programowania lub ukośnik odwrotny przed nową linią w Bash.:
w obrębie jednego łańcucha w tablicy łańcuchów powoduje, że YAML interpretuje to jako tablicę obiektów. Narusza to zasadę najmniejszego zdziwienia .Aby zachować nowe wiersze, użyj
|
na przykład:jest tłumaczone na „To jest bardzo długie zdanie \ n, które obejmuje kilka wierszy w YAML \ n, ale które będzie renderowane jako ciąg \ n z zachowanymi znakami nowej linii. \ n ”
źródło
|
w każdym wierszu, z powodów, które nie są dla mnie oczywiste: groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9Acat
z multilinii z separatorem powoduje to, że do wyniku dodawane są spacje wiodące (niezbędne dla YAML).1. Notacja bloku (zwykła, płynna, skalarna): nowe linie stają się spacjami i dodatkowe nowe linie po usunięciu bloku
Odpowiednik JSON
2. Dosłowna skalarna blokowa: dosłowna skalarna blokowa |będą zawierać znaki nowej linii i wszelkie spacje końcowe. ale usuwa dodatkowe
nowe linie po bloku.
Odpowiednik JSON
3. + wskaźnik z dosłowną skalą bloku: zachowaj dodatkowe znaki nowej linii po bloku
Odpowiednik JSON
4. - wskaźnik z dosłowną skalą blokową: - oznacza, że nowa linia na końcu łańcucha jest usuwana.
Odpowiednik JSON
5. Skalarny składany blok (>):
będzie składać nowe wiersze do spacji, ale usuwa dodatkowe nowe wiersze po bloku.
Odpowiednik JSON
więcej możesz odwiedzić mój blog
źródło
Możesz w to nie wierzyć, ale YAML może także wykonywać klucze wieloliniowe:
źródło
key:value
, ale jeśli twój klucz zawiera nową linię, możesz to zrobić jak opisano powyżej?
jest kluczowym wskaźnikiem (jak w kluczu w mapowaniu). W wielu sytuacjach możesz pominąć wskaźnik klucza, gdy (wymagana) wartość wskaźnika:
po kluczu sprawia, że parsowanie jest jednoznaczne. Ale tak nie jest, musisz użyć tego do wyraźnego zaznaczenia klucza.Aby połączyć długie linie bez spacji , użyj podwójnych cudzysłowów i unikaj znaków nowej linii za pomocą odwrotnych ukośników:
(Dzięki @Tobia)
źródło
Jeśli używasz YAML i Twig do tłumaczeń w Symfony i chcesz używać tłumaczeń wieloliniowych w JavaScript, zwrot karetki jest dodawany zaraz po tłumaczeniu. Więc nawet następujący kod:
var javascriptVariable = "{{- 'key'|trans -}}";
Który ma następujące tłumaczenie yml:
Nadal spowoduje powstanie następującego kodu w html:
Tak więc znak minus w Twig nie rozwiązuje tego. Rozwiązaniem jest dodanie tego znaku minus po znaku większy niż znak w yml:
Będzie mieć poprawny wynik, tłumaczenie wielu wierszy w jednym wierszu w Twig:
źródło
W sytuacjach, w których łańcuch może zawierać spacje lub nie, wolę podwójne cudzysłowy i kontynuację wiersza z odwrotnymi ukośnikami:
Ale zwróć uwagę na pułapkę w przypadku, gdy linia kontynuacji zaczyna się od spacji, należy ją uciec (ponieważ zostanie usunięta w innym miejscu):
Jeśli ciąg zawiera podziały wiersza, należy to zapisać w stylu C.
\n
.Zobacz także to pytanie .
źródło
Żadne z powyższych rozwiązań nie działało dla mnie w pliku YAML w ramach projektu Jekyll. Po wypróbowaniu wielu opcji, zdałem sobie sprawę, że wstrzyknięcie HTML
<br>
może również zrobić, ponieważ ostatecznie wszystko jest renderowane do HTML:imię:
|
W wiosce La Mancha,<br>
której imienia nie znam<br>
chcę pamiętać.Przynajmniej to działa dla mnie. Nie ma pojęcia o problemach związanych z tym podejściem.
źródło