Ako rozdeliť reťazec na viac riadkov?

V jazyku YAML mám reťazec, ktorý je veľmi dlhý. Chcem ho udržať v rámci 80-stĺpcového (alebo tak nejako) zobrazenia môjho editora, takže by som chcel reťazec rozdeliť. Aká je na to syntax?

Inými slovami, mám toto:

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

a chcel by som mať toto (alebo niečo podobné):

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

Rád by som použil úvodzovky, ako je uvedené vyššie, aby som nemusel v reťazci nič escapovať.

Existuje 5 6 NINE (alebo 63*, podľa toho, ako počítate) rôznych spôsobov zápisu viacriadkových reťazcov v jazyku YAML.

TL;DR

  • Zvyčajne chcete >:

      kľúč: >
        Váš dlhý
        reťazec tu.
  • Ak chcete, aby sa v reťazci zachovali riadkové zlomy ako \n (napríklad vložený markdown s odsekmi), použite |.

      kľúč: |
        ### Nadpis
    
        * Bullet
        * Body
  • Ak nechcete, aby sa na konci riadkoval zlom, použite namiesto neho >- alebo |-.

  • Ak potrebujete rozdeliť riadky uprostred slov alebo doslova napísať zalomenie riadkov ako \n, použite namiesto toho dvojité úvodzovky:

      kľúč: "Antidisestab\\
       lishmentarianism.\n\nGet on it."
  • YAML je šialený.

Blokové skalárne štýly (>, |)

Tieto štýly umožňujú používať znaky ako \ a " bez escapovania a pridávajú nový riadok (\n) na koniec reťazca.

> Skladaný štýl odstraňuje jednoduché nové riadky v rámci reťazca (ale pridáva jeden na koniec a konvertuje dvojité nové riadky na jednoduché):

Key: >
  this is my very very very
  long string

to je môj veľmi, veľmi, veľmi dlhý reťazec\n

| Literal style zmení každý nový riadok v reťazci na doslovný nový riadok a pridá jeden na koniec:

Key: |
  this is my very very very 
  long string

toto je môj veľmi, veľmi dlhý reťazec\n

Tu'je oficiálna definícia z YAML Spec 1.2

Skalárny obsah môže byť zapísaný v blokovej notácii, pričom sa použije doslovný štýl (označený "|"), kde sú všetky zalomenia riadkov významné. Prípadne sa môžu zapísať zloženým štýlom (označeným ">"), kde je každý zlom riadku zložený na medzeru, pokiaľ nekončí prázdny riadok alebo riadok s väčším odstupom.

Blokové štýly s indikátorom zalomenia bloku (>-, |-, >+, |+)

Spracovanie posledného nového riadku v reťazci a všetkých končiacich prázdnych riadkov (\n\n) môžete ovládať pridaním znaku block chomping indicator:

  • >, |: "clip": zachová podávanie riadkov, odstráni koncové prázdne riadky.
  • >-, |-: "strip": odstráni riadkový posuv, odstráni koncové prázdne riadky.
  • >+, |+: "zachovať": zachovať riadkový posuv, zachovať koncové prázdne riadky.

"Flow" skalárne štýly (``,",'`)

Tieto majú obmedzené escapovanie a konštruujú jednoriadkový reťazec bez znakov nového riadku. Môžu začínať na tom istom riadku ako kľúč alebo s ďalšími novými riadkami na začiatku.

plain style (bez escapovania, bez kombinácií # alebo :, obmedzenia na prvý znak):

Key: this is my very very very 
  long string

štýl s dvojitými úvodzovkami (\ a " musia byť escapované pomocou \, nové riadky možno vkladať pomocou doslovnej sekvencie \n, riadky možno spájať bez medzier s koncovým \):

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

"toto je môj veľmi veľmi \"veľmi\" dlhý reťazec.\n\nLove, YAML."

štýl s jednoduchými úvodzovkami (doslovné ' musí byť zdvojené, žiadne špeciálne znaky, prípadne užitočné na vyjadrenie reťazcov začínajúcich dvojitými úvodzovkami):

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

"toto je môj veľmi veľmi \"veľmi\" dlhý reťazec, všakže."

Zhrnutie

V tejto tabuľke _ znamená medzerový znak. \n znamená "znak nového riadku" (\n v jazyku JavaScript), okrem riadku "in-line newlines", kde znamená doslova spätné lomítko a 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       |

Príklady

Všimnite si koncové medzery na riadku pred "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        
  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."
]

Blokové štýly s indikátormi odsadenia

V prípade, že vám vyššie uvedené nestačí, môžete pridať "indikátor odsadenia bloku" (za indikátor odsadenia bloku, ak ho máte):

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

Dodatok

Ak na začiatok nie prvých riadkov v štýle Folded vložíte ďalšie medzery, budú zachované s bonusovým novým riadkom. Pri štýloch flow sa to nestane:

- >
    my long
      string
- my long
    string

["môj dlhý reťazec\n", "môj dlhý reťazec"]

Nemôžem'ani.

``2 blokové štýly, každý s 2 možnými indikátormi členenia bloku (alebo žiadnymi) a s 9 možnými indikátormi odsadenia (alebo žiadnymi), 1 jednoduchý štýl a 2 štýly s úvodzovkami: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63*

Niektoré z týchto informácií boli tiež zhrnuté tu.

Komentáre (26)
Riešenie

Pri použití zalomeného štýlu yaml je každý zlom riadku nahradený medzerou. Odsadenie v každom riadku sa ignoruje. Na konci sa vloží zalomenie riadku.

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

Na odstránenie koncového zalomenia riadku môžete použiť indikátor "block chomping" takto:

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.

K dispozícii sú aj ďalšie kontrolné nástroje (napríklad na kontrolu odsadenia).

Pozri https://yaml-multiline.info/.

Komentáre (11)

Ak chcete zachovať nové riadky, použite napríklad |:

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

sa prekladá ako "Toto je veľmi dlhá veta\n, ktorá sa rozprestiera na niekoľkých riadkoch v YAML\n, ale ktorá sa vykreslí ako reťazec\n so zachovanými novými riadkami.\n"

Komentáre (12)