Jak złamać łańcuch w YAML na wielu liniach?

W YAML mam bardzo długi sznurek. Chcę zachować to w 80-kolumnowym (lub tak) widoku mojego edytora, więc chciałbym złamać ciąg znaków. 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 stylu):

Key: 'this is my very very very ' +
     'long string'

Chciałbym używać cudzysłowów jak powyżej, więc nie muszę uciekać się do niczego wewnątrz ciągu.

Author: zuku, 2010-09-24

9 answers

Używanie stylu składanego yaml. Wcięcia w każdej linii będą ignorowane. Przerwa linii zostanie wstawiona na końcu.

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

Możesz użyć" block chomping indicator", aby wyeliminować przerwanie linii końcowej, w następujący sposób:

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.

W każdym przypadku, każde złamanie linii jest zastępowane spacją.

Dostępne są również inne narzędzia sterujące (na przykład do kontrolowania wcięcia).

Zobacz https://yaml-multiline.info/

 1154
Author: Matt Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-18 23:51:25

5 6 dziewięć (lub 63*, w zależności od liczenia) różne sposoby zapisu ciągów wielowierszowych w YAML.

TL; DR

  • Używaj > przez większość czasu: wewnętrzne przerwy linii są usuwane, chociaż dostajesz jeden na końcu:

    key: >
      Your long
      string here.
    
  • Użyj |, Jeśli chcesz, aby te liniały były zachowane jako \n (na przykład, embedded markdown with paragrafy).

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Użyj >- lub |- zamiast tego, jeśli nie chcesz dodawać linebreak na końcu.

  • Użyj "...", jeśli chcesz podzielić wiersze w środku słów lub chcesz dosłownie wpisać linebreaks jako \n:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • YAML jest szalony.

Style skalarne blokowe (>, |)

Te pozwalają znaki takie jak \ i " bez znaków specjalnych i dodają nową linię (\n) na końcu twojego sznurek.

> składany styl usuwa pojedyncze nowe linie wewnątrz łańcucha (ale dodaje jeden na końcu i konwertuje podwójne nowe linie na pojedyncze):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| styl dosłowny zamienia każdy znak nowej linii w literalny znak nowej linii i dodaje jeden na końcu:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Oto oficjalna definicja z YAML Spec 1.2

Skalar treść może być zapisana w notacji blokowej, używając dosłownego stylu (oznaczonego przez"/"), gdzie wszystkie podziały wierszy są znaczące. Alternatywnie można je zapisać za pomocą stylu składanego (oznaczonego przez">"), gdzie każdy podział linii jest składany do spacji, chyba że kończy się pustą lub bardziej wciętą linią.

Style blokowe ze wskaźnikiem chomping block(>-, |-, >+, |+)

Możesz kontrolować obsługę ostatniej nowej linii w łańcuchu i dowolnych końcowych pustych linii (\n\n) dodając wskaźnik blokowania Znak:

  • >, |: "klip": zachowaj kanał linii, Usuń końcowe puste linie.
  • >-, |-: "strip": Usuń kanał linii, Usuń końcowe puste linie.
  • >+, |+: "keep": utrzymuj kanał linii, utrzymuj puste linie.

Style skalarne "Flow" (, ", ')

Te mają ograniczone ucieczki i konstruują ciąg jednowierszowy bez znaków nowej linii. Mogą zaczynać się w tej samej linii co klawisz lub z dodatkowymi znakami nowej linii.

zwykły Styl (brak ucieczki, brak # lub: kombinacji, ograniczenia na pierwszy znak):

Key: this is my very very very 
  long string

styl podwójnie cytowany (\ i " musi być zabezpieczony przez \, nowe linie mogą być wstawiane z ciągiem literalnym \n, linie mogą być konkatenowane bez spacji z zakończeniem \):

Key: "this is my very very \"very\" loooo\
  ng string.\n\nLove, YAML."

"this is my very very \"very\" loooong string.\n\nLove, YAML."

styl jednoprzyciskowy (literal ' musi być podwojony, bez znaków specjalnych, prawdopodobnie przydatny do wyrażania ciągów zaczynających się od podwójnych cudzysłowów):

Key: 'this is my very very "very"
  long string, isn''t it.'

"this is my very very \"very\" long string, isn't it."

Podsumowanie

W tej tabeli _ oznacza space character. \n oznacza "znak nowej linii" (\n w JavaScript), z wyjątkiem wiersza "in-line newlines" , gdzie oznacza dosłownie odwrotny ukośnik i 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       |

Przykłady

uwaga na spacje końcowe na linii przed " spacjami."

- >
  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."
]

Style blokowe ze wskaźnikami wcięć

Na wypadek, gdyby powyższe nie wystarczyło, możesz dodać" wskaźnik wcięcia bloku " (po wskaźniku chompingu bloku, jeśli go posiadasz):

- >8
        My long string
        starts over here
- |+1
 This one
 starts here

Dodatek

Jeśli wstawisz dodatkowe spacje na początku nie pierwszych linii w stylu złożonym, zostaną one zachowane, z dodatkową nową linią. To się nie dzieje z flow style:

- >
    my long
      string
- my long
    string

["my long\n string\n", "my long string"]

Nie mogę nawet.

*2 Style blokowe, każdy z 2 możliwymi wskaźnikami chompingu bloków (lub brak) i z 9 możliwymi wskaźnikami wcięcia( lub brak), 1 Styl zwykły i 2 Style cytowane: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Niektóre z tych informacji zostały również podsumowane tutaj .

 3706
Author: Steve Bennett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-10 06:37:03

Aby zachować newlines Użyj |, na przykład:

|
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with newlines preserved.

Jest tłumaczone na "jest to bardzo długie zdanie \N , które obejmuje kilka linii w YAML \N , ale które będzie renderowane jako ciąg\N z zachowanymi znakami nowej linii.\N "

 196
Author: Ali Shakiba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-09 16:35:59

1. Notacja blokowa (plain, flow-style, scalar): nowe linie stają się spacjami i dodatkowe nowe linie po usunięciu bloku

---
# Note: It has 1 new line after the string
content:
    Arbitrary free text
    over multiple lines stopping
    after indentation changes...

...

Równoważny JSON

{
 "content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}

2. Literalny Skalar blokowy: literalny Skalar blokowy| będzie zawierać nowe linie i spacje końcowe. ale usuwa dodatkowe

Nowe linie po bloku.

---
# After string we have 2 spaces and 2 new lines
content1: |
 Arbitrary free text
 over "multiple lines" stopping
 after indentation changes...  


...

Równoważny JSON

{
 "content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes...  \n"
}

3. + wskaźnik z literalnym blokiem Skalar: zachowaj dodatkowe nowe linie po bloku

---
# After string we have 2 new lines
plain: |+
 This unquoted scalar
 spans many lines.


...

Równoważny JSON

{
 "plain": "This unquoted scalar\nspans many lines.\n\n\n"
}

4. - wskaźnik z literalnym Skalarem blokowym: oznacza, że znak nowej linii na końcu łańcucha jest usuwany.

---
# After string we have 2 new lines
plain: |-
 This unquoted scalar
 spans many lines.


...

Równoważny JSON

{
 "plain": "This unquoted scalar\nspans many lines."
}

5. Skalar Blokowy Złożony(>):

Będzie składać nowe linie do spacji, ale usunie dodatkowe nowe linie po bloku.

---
folded_newlines: >
 this is really a
 single line of text
 despite appearances


...

Ekwiwalent JSON

{
 "fold_newlines": "this is really a single line of text despite appearances\n"
}

Po więcej zapraszam na mój Blog

 115
Author: Arayan Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-14 05:46:04

Aby połączyć długie linie bez spacji , Użyj podwójnych cudzysłowów i usuń nowe linie z odwrotnymi ukośnikami:

key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
  orincididuntutlaboreetdoloremagnaaliqua."

(Dzięki @ Tobia)

 50
Author: phs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 19:39:35

Możesz w to nie uwierzyć, ale YAML też potrafi robić klawisze Wielowierszowe:

?
 >
 multi
 line
 key
:
  value
 42
Author: Mohsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-24 21:17:27

Jeśli używasz YAML i Twig do tłumaczeń w Symfony i chcesz używać tłumaczeń wielowierszowych w Javascript, powrót 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:

key: >
    This is a
    multi line 
    translation.

Nadal będzie wynikał z następującego kodu w html:

var javascriptVariable = "This is a multi line translation.
";

Więc znak minus w gałązce tego nie rozwiąże. Rozwiązaniem jest dodanie tego znaku minus po większym niż logowanie yml:

key: >-
    This is a
    multi line 
    translation.

Będzie miał właściwy wynik, tłumaczenie Wielowierszowe na jednej linijce w gałązce:

var javascriptVariable = "This is a multi line translation.";
 18
Author: Rvanlaak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-16 06:57:09

W sytuacjach, w których łańcuch może zawierać spacje lub nie, wolę podwójne cudzysłowy i kontynuację linii z odwrotnymi ukośnikami:

key: "String \
  with long c\
  ontent"

Ale zwróć uwagę na pułapkę dla przypadku, że linia kontynuacyjna zaczyna się od spacji, musi być uniknięta (ponieważ zostanie usunięta gdzie indziej):

key: "String\
  \ with lon\
  g content"

Jeśli łańcuch zawiera podziały linii, musi być napisany w stylu C \n.

Zobacz też to pytanie.

 8
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 16:15:08

Żadne z powyższych rozwiązań nie zadziałało dla mnie, w pliku YAML w ramach projektu Jekyll. Po wypróbowaniu wielu opcji, zdałem sobie sprawę, że wstrzyknięcie HTML z <br> może zrobić równie dobrze, ponieważ w końcu wszystko jest renderowane do HTML:

Nazwa: | W wiosce La Mancha <br> której imienia nie chcę pamiętać.

Przynajmniej dla mnie działa. Brak pomysłu na problemy związane z tym podejściem.
 -1
Author: Irene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-07 09:39:30