Cum pot sparge un șir de caractere pe mai multe linii?

În YAML, am un șir de caractere care's de foarte mult timp. Vreau să păstrați acest lucru în 80 de coloane (sau așa), vedere editorul meu, așa că am'd place să rupă șirul. Ce's sintaxa pentru asta?

Cu alte cuvinte, eu am asta:

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

și am'd dori să aibă această (sau ceva în acest sens):

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

Am'd place să folosesc ghilimele ca mai sus, așa că am don't nevoie pentru a scăpa ceva în șir.

Există 5 6 NOUĂ (sau 63*, în funcție de modul în care te numeri) moduri diferite de a scrie mai multe linii siruri de caractere în YAML.

TL;DR

  • De obicei, vrei " >":

cheie: > Ta timp string aici.

  • Dacă doriți linebreaks să fie păstrate cât \n în șir (de exemplu, încorporate reduceri cu paragrafe), utilizați"|".

cheie: |

Poziția

  • Bullet

  • Puncte

  • Utilizarea > - " sau " | - în loc, dacă nu't vrei un linebreak anexată la sfârșitul anului.

  • Dacă aveți nevoie pentru a împărți linii în mijlocul de cuvinte sau literal de tip linebreaks ca \n, utilizați ghilimele duble în loc:

cheie: "Antidisestab\ lishmentarianism.\n\nGet pe ea."

  • YAML este nebun.

Bloc de scalare stiluri (">",|)

Acestea permit caractere, cum ar fi \ si ", fără a scăpa, și se adaugă o nouă linie (\n) la sfârșitul șirului.

"> " Pliat style elimină singur newline în șir (dar adaugă la sfârșitul, și convertește dublu newline la simplu):

Key: >
  this is my very very very
  long string

asta mi-e foarte, foarte, foarte lung șir de\n

| Literal style transformă fiecare newline în șir într-un literal newline, și adaugă la sfârșitul:

Key: |
  this is my very very very 
  long string

asta mi-e foarte, foarte, foarte\nlong șir de\n

Aici's definiția oficială de la YAML Spec 1.2

Scalare conținut poate fi scris în bloc notație, folosind un stil literal (indicat de "|"), în care toate sfârșiturile de linie sunt semnificative. Alternativ, ele pot fi scrise cu pliat stil (notată cu ">") în cazul în care fiecare linie este pliat într-un spațiu excepția cazului în care se termină un gol sau mai multe-indentat linie.

Stiluri de bloc cu bloc chomping indicator (>-, |-, >+, |+)

Puteți controla de manipulare de ultima linie nouă în șir, și orice sfârșit linii goale (\n\n) prin adăugarea unui bloc chomping indicator caracter:

  • ">",|: "clip": păstrați linia de alimentare, scoateți final linii goale.
  • >-, |-: "benzi": demontați conducta de alimentare, scoateți final linii goale.
  • >+, |+: "păstrați": păstrați linia de alimentare, ține la final linii goale.

"Tur" scalare stiluri (`,",'`)

Acestea au limitat să evadeze, și de a construi o singură linie de șir, cu nici o linie nouă de caractere. Ei pot începe pe aceeași linie cu cheie, sau cu alte linii noi în primul rând.

stil simplu (nici o scăpare, nici # sau : combinații, limite pe primul caracter):

Key: this is my very very very 
  long string

dublu-citat style (\ si " trebuie să fi scăpat de`, liniile pot fi inserate cu un literal \n secvență, liniile pot fi concatenate fără spații cu final \):

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

"asta mi-e foarte foarte \"foarte" loooong șir.\n\nLove, YAML."

single-citat style (literal ' trebuie să fie dublat, fără caractere speciale, eventual utile pentru exprimarea siruri de caractere incepand cu ghilimele):

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

"asta mi-e foarte foarte \"foarte" șir lung, e't."

Rezumat

În acest tabel, _ "înseamnă" caracter spațiu. \n înseamnă "newline" (\n în JavaScript), cu excepția pentru "in-line newline" rând, în cazul în care înseamnă literalmente un backslash și o 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       |

Exemple

Notă spații pe linia înainte "spații."

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

Stiluri de bloc cu indentare indicatori

Doar în cazul în care cele de mai sus este't de ajuns pentru tine, puteți adăuga un "bloc de indentare indicator" (după bloc chomping indicator, dacă aveți unul):

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

Addendum

Dacă veți introduce spații suplimentare la începutul nu-primele linii în Pliate stil, acestea vor fi păstrate, cu un bonus newline. Asta nu't se întâmplă cu fluxul de stiluri:

- >
    my long
      string
- my long
    string

["meu mult timp\n șir\n", "mea șir lung"]

Pot't chiar.

``2 stiluri de bloc, fiecare cu 2 posibile bloc chomping indicatori (sau nici unul), și cu 9 posibile indentare indicatori (sau nici unul), 1 stil clar și 2 citat stiluri: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63*

Unele dintre aceste informații au fost, de asemenea, rezumate aici.

Comentarii (26)
Soluția

Folosind yaml pliat stil, fiecare linie este înlocuit printr-un spațiu. Identatie în fiecare linie va fi ignorat. O linie va fi introdus la sfârșitul anului.

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

Puteți utiliza "bloc chomping indicator" pentru a elimina sfârșit de linie, după cum urmează:

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.

Există și alte instrumente de control disponibile, precum și (pentru controlează indentarea de exemplu).

Vezi https://yaml-multiline.info/

Comentarii (11)

Pentru a păstra newline utilizare |, de exemplu:

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

este tradus în "Aceasta este o foarte lungă perioadă de propoziție\n care se întinde pe mai multe linii în YAML\n dar care va fi pronunțată ca un șir de caractere\n cu liniile conservate.\n"

Comentarii (12)

1. Bloc Notație: Liniile devin spații și extra newline după blocul sunt eliminate

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

...

Echivalent JSON

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

2. Literal Bloc de Scalare: Un Literal Bloc de Scalare | va include liniile și eventualele spații. dar elimină suplimentar

newline după bloc.

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

...

Echivalent JSON

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

3. + indicator cu Literală Bloc de Scalare: ține plus newline după bloc

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

...

Echivalent JSON

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

4. – indicator cu Literală Bloc de Scalare: înseamnă că newline la sfârșitul șirului este eliminat.

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

...

Echivalent JSON

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

5. Pliat Bloc Scalar(>):

va renunța la liniile de spații, dar și elimină plus newline după bloc.

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

...

Echivalent JSON

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

pentru mai multe puteți vizita mea Blog

Comentarii (3)

Poate nu crezi, dar YAML poate face multi-linie cheile:

?
 >
 multi
 line
 key
:
  value
Comentarii (4)

Pentru a concatena linii lungi without whitespace, utilizați ghilimele și să scape de liniile cu backslash-uri:

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

(Multumesc @Tobia)

Comentarii (3)

În cazul în care te're folosind YAML și Crenguță pentru traduceri în Symfony, și doriți să utilizați multi-linie traduceri în Javascript, un retur de car este adăugat imediat după traducere. Deci, chiar codul de mai jos:

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

Care are următoarele yml traducere:

key: >
    This is a
    multi line 
    translation.

Va duce în continuare în următorul cod html:

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

Deci, semnul minus în Creanga nu rezolva asta. Soluția este să adăugați acest semn minus după semnul mai mare decât în yml:

key: >-
    This is a
    multi line 
    translation.

Va avea rezultatul propriu-zis, multi-linie, traducere pe o singură linie în Crenguță:

var javascriptVariable = "This is a multi line translation.";
Comentarii (1)

Pentru situații au fost șir poate conține spații sau nu, eu prefer ghilimele duble și linie de continuare cu backslash-uri:

key: "String \
  with long c\
  ontent"

Dar, rețineți despre capcana pentru cazul în care o linie de continuare începe cu un spațiu, trebuie să fi scăpat (pentru că va fi luat în altă parte):

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

Dacă șirul conține pauze de linie, acest lucru trebuie să fie scrise în stilul C \n.

A se vedea, de asemenea, acest question.

Comentarii (1)

Niciuna dintre soluțiile de mai sus a lucrat pentru mine, în o YAML într-un Jekyll proiect. După ce a încercat mai multe opțiuni, mi-am dat seama că un HTML injecție cu <br> ar putea face la fel de bine, deoarece, în cele din urmă totul este redat în HTML:

nume: | Într-un sat din La Mancha <br> al cărui nume nu't `
vreau să-mi amintesc.

Cel puțin pentru mine. Nici o idee cu privire la problemele asociate cu această abordare.

Comentarii (1)