In YAML, come posso spezzare una stringa su più righe?

In YAML, ho una stringa molto lunga. Voglio mantenere questo nella vista di 80 colonne (o così) del mio editor, quindi mi piacerebbe rompere la stringa. Qual è la syntax per questo?

In altre parole, ho questo:

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

e mi piacerebbe avere questo (o qualcosa di simile):

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

Mi piacerebbe usare le virgolette come sopra, quindi non ho bisogno di sfuggire a qualcosa all’interno della stringa.

Usando lo stile piegato su yaml, ogni interruzione di riga viene sostituita da uno spazio. L’indentazione in ogni riga verrà ignorata.

 > This is a very long sentence that spans several lines in the YAML but which will be rendered as a string without carriage returns. 

http://symfony.com/doc/current/components/yaml/yaml_format.html

Ci sono 5 6 NINE (o 63 *, a seconda di come si contano) diversi modi per scrivere stringhe multi-linea in YAML.

Blocca stili scalari ( > , | )

Consentono caratteri come \ e " senza escaping e aggiungono una nuova riga ( \n ) alla fine della stringa.

> stile piegato rimuove singole righe nuove all’interno della stringa (ma ne aggiunge una alla fine e converte le doppie nuove in singole):

 Key: > this is my very very very long string 

this is my very very very long string\n

| Lo stile letterale trasforma ogni nuova riga all’interno della stringa in una nuova riga letterale e ne aggiunge una alla fine:

 Key: | this is my very very very long string 

this is my very very very\nlong string\n

Ecco la definizione ufficiale della YAML Spec 1.2

Il contenuto scalare può essere scritto in notazione a blocchi, usando uno stile letterale (indicato da “|”) dove tutte le interruzioni di riga sono significative. In alternativa, possono essere scritti con lo stile piegato (indicato da “>”) in cui ogni interruzione di riga viene piegata in uno spazio a meno che non termini una linea vuota o più indentata.

Blocca gli stili con l’indicatore del blocco dei blocchi ( >- , |- , >+ , |+ )

Puoi controllare la gestione della nuova riga finale nella stringa e le eventuali righe finali vuote ( \n\n ) aggiungendo un carattere indicatore di blocco dei blocchi :

  • > , | : “clip”: mantieni l’avanzamento della riga, rimuovi le righe vuote finali.
  • >- , |- : “strip”: rimuove l’avanzamento riga, rimuove le righe vuote finali.
  • >+ , |+ : “mantieni”: mantieni l’avanzamento della riga, continua a trascinare le righe vuote.

Stili scalari “Flusso” ( , " , ' )

Questi hanno limitato l’escaping e costruiscono una stringa a riga singola senza caratteri di nuova riga. Possono iniziare sulla stessa riga del tasto o prima con nuove righe aggiuntive.

stile semplice (nessuna escaping, nessuna # o : combinazioni, limiti sul primo carattere):

 Key: this is my very very very long string 

stile a virgolette ( \ e " devono essere sfuggiti a \ , le newline possono essere inserite con una sequenza \n letterale, le linee possono essere concatenate senza spazi con il trailing \ ):

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

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

stile a virgolette singole (letterale ' deve essere raddoppiato, nessun carattere speciale, probabilmente utile per esprimere stringhe che iniziano con virgolette doppie):

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

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

Sommario

In questa tabella, _ indica il space character . \n significa “carattere di nuova riga” ( \n in JavaScript), ad eccezione della riga “newline in-line”, dove letteralmente significa backslash e an).

  > | " ' >- >+ |- |+ -------------------------|------|-----|-----|-----|------|------|------|------ 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 | 

Esempi

Nota gli spazi finali sulla riga prima di “spazi”.

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

Blocca gli stili con gli indicatori di indentazione

Nel caso in cui quanto sopra non sia abbastanza per te, puoi aggiungere un ” indicatore di rientro del blocco ” (dopo l’indicatore del blocco dei blocchi, se ne hai uno):

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

appendice

Se si inseriscono spazi extra all’inizio delle prime righe in stile Piegato, verranno mantenute, con una nuova riga bonus. Questo non succede con gli stili di stream:

 - > my long string - my long string 

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

Non posso nemmeno.

* 2 stili di blocco, ciascuno con 2 possibili indicatori di battitura a blocchi (o nessuno) e con 9 possibili indicatori di indentazione (o nessuno), 1 stile semplice e 2 stili quotati: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Alcune di queste informazioni sono state anche riassunte qui .

Per preservare le newline usare | , per esempio:

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

è tradotto in “Questa è una frase molto lunga \ n che si estende su più righe nello YAML \ n ma che sarà renderizzata come una stringa \ n con le nuove linee conservate.”

1. Notazione del blocco: le nuove linee diventano spazi e nuove righe dopo che il blocco è stato rimosso

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

JSON equivalente

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

2. Blocco letterale scalare: un blocco letterale scalare | includerà le newline e gli spazi finali. ma rimuove extra

newlines dopo il blocco.

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

JSON equivalente

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

3. Indicatore + con letterale blocco scalare: mantenere i nuovi extra dopo il blocco

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

JSON equivalente

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

4. – Indicatore con letterale blocco scalare: significa che il newline alla fine della stringa viene rimosso.

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

JSON equivalente

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

5. Piegato blocco scalare (>):

piega le nuove righe in spazi e rimuove le nuove righe dopo il blocco.

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

JSON equivalente

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

per di più puoi visitare il mio blog

Potresti non crederci, ma YAML può anche usare i tasti multi-linea:

 ? > multi line key : value 

Per concatenare le linee lunghe senza spazi vuoti , utilizzare le doppie virgolette e sfuggire alle nuove righe con i backslash:

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

(Grazie a @Tobia)

Nel caso in cui tu stia utilizzando yml e Twig per le traduzioni in Symfony e desideri utilizzare le traduzioni multilinea in Javascript, viene aggiunto un ritorno a capo subito dopo la traduzione. Quindi anche il seguente codice:

var javascriptVariable = "{{- 'key'|trans -}}";

Quale ha la seguente traduzione yml:

 key: > This is a multi line translation. 

Risulterà comunque nel seguente codice in html:

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

Quindi, il segno meno in Twig non risolve questo. La soluzione consiste nell’aggiungere questo segno meno dopo il segno maggiore di yml:

 key: >- This is a multi line translation. 

Avrà il risultato corretto, la traduzione multi linea su una riga in Twig:

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

Per le situazioni in cui la stringa potrebbe contenere spazi o no, preferisco virgolette doppie e continuazione di riga con barre retroverse:

 key: "String \ with long c\ ontent" 

Ma prendi nota del trabocchetto per il caso in cui una linea di continuazione inizia con uno spazio, deve essere scappato (perché verrà rimosso altrove):

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

Se la stringa contiene interruzioni di riga, questo deve essere scritto in stile C. \n .

Vedi anche questa domanda .