Frage Wie unterteile ich eine Zeichenfolge in YAML über mehrere Zeilen hinweg?


In YAML habe ich eine Zeichenfolge, die sehr lang ist. Ich möchte dies innerhalb der 80-Spalten (oder so) Ansicht meines Editors behalten, also möchte ich die Zeichenfolge unterbrechen. Wie lautet die Syntax dafür?

Mit anderen Worten, ich habe folgendes:

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

und ich möchte das haben (oder etwas in diesem Sinne):

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

Ich würde gerne Zitate wie oben verwenden, also muss ich nichts innerhalb der Zeichenfolge entkommen.


934
2017-09-24 19:47


Ursprung


Antworten:


Mit dem gefalteten yaml-Stil wird jeder Zeilenumbruch durch ein Leerzeichen ersetzt. Die Einrückung in jeder Zeile wird ignoriert.

>
  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


535
2017-09-24 19:54



Es gibt 5  6  NEUN (oder 63 *, abhängig davon, wie Sie zählen) verschiedene Möglichkeiten, mehrzeilige Strings in YAML zu schreiben.

Skalare Stile blockieren (>, |)

Diese erlauben Zeichen wie \ und " ohne zu entkommen und eine neue Zeile hinzuzufügen (\n) bis zum Ende der Zeichenfolge.

>  Gefalteter Stil entfernt einzelne Zeilenumbrüche innerhalb der Zeichenfolge (fügt aber am Ende eine hinzu und konvertiert doppelte Zeilenumbrüche in Singles):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

|  Literaler Stil verwandelt jeden Zeilenumbruch innerhalb des Strings in einen wörtlichen Zeilenumbruch und fügt am Ende einen hinzu:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Hier ist die offizielle Definition von der YAML Spezifikation 1.2

Skalarer Inhalt kann in Blocknotation geschrieben werden, wobei ein literaler Stil (angezeigt durch "|") verwendet wird, in dem alle Zeilenumbrüche signifikant sind. Alternativ können sie mit dem gefalteten Stil (bezeichnet mit ">") geschrieben werden, wobei jeder Zeilenumbruch zu einem Leerzeichen gefaltet wird, es sei denn, er endet mit einer leeren oder einer mehr eingerückten Zeile.

Blockstile mit Block Chopping-Indikator (>-, |-, >+, |+)

Sie können die Handhabung der letzten neuen Zeile in der Zeichenfolge und alle nachfolgenden leeren Zeilen steuern (\n\n) durch Hinzufügen von a Block Chopping-Anzeige Charakter:

  • >, |: "clip": Den Zeilenvorschub beibehalten, die nachfolgenden Leerzeilen entfernen.
  • >-, |-: "strip": Entfernen Sie den Zeilenvorschub, entfernen Sie die nachfolgenden Leerzeilen.
  • >+, |+: "Behalten": Den Zeilenvorschub beibehalten, Leerzeilen nachziehen.

"Flow" -Skalarstile (, ", ')

Diese haben ein begrenztes Escaping und konstruieren eine einzeilige Zeichenfolge ohne neue Zeilenzeichen. Sie können in der gleichen Zeile wie der Schlüssel oder mit zusätzlichen Zeilenumbrüchen beginnen.

schlichter Stil (Keine Flucht, nein # oder : Kombinationen, Grenzen für das erste Zeichen):

Key: this is my very very very 
  long string

Doppelt zitierter Stil (\ und " muss von entkommen sein \Zeilenumbrüche können mit einem Literal eingefügt werden \n Sequenz können Zeilen mit Leerzeichen ohne Leerzeichen verkettet werden \):

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

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

Single-Anführungsstil (wörtlich ' muss verdoppelt werden, keine Sonderzeichen, möglicherweise nützlich zum Ausdrücken von Strings, beginnend mit doppelten Anführungszeichen):

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

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

Zusammenfassung

In dieser Tabelle _ meint space character. \n bedeutet "Newline-Charakter" (\n in JavaScript), außer für die Zeile "Inline-Zeilenumbrüche", wo es wörtlich einen Backslash und ein n bedeutet.

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

Beispiele

Beachten Sie die abschließenden Leerzeichen in der Zeile vor "Leerzeichen".

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

Blockieren Sie Stile mit Indentationsindikatoren

Nur für den Fall, dass das obige nicht genug für Sie ist, können Sie ein "hinzufügen"Block Indentationsindikator"(nach Ihrem Block Chopping-Indikator, wenn Sie einen haben):

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

Nachtrag

Wenn Sie am Anfang der Nicht-die-Ersten-Zeilen im Folded Style zusätzliche Leerzeichen einfügen, werden diese mit einem Bonus-Zeilenumbruch beibehalten. Dies geschieht nicht mit Fließstilen:

- >
    my long
      string
- my long
    string

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

Ich kann nicht einmal.

*2 Blockstile mit je 2 möglichen Block Chopping-Indikatoren (oder keine), mit 9 möglichen Indentationsindikatoren (oder keine), 1 einfachen Stil und 2 zitierten Stilen: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Einige dieser Informationen wurden ebenfalls zusammengefasst Hier.


2230
2018-02-11 10:27



Konservieren Zeilenumbrüche benutzen |, beispielsweise:

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

übersetzt zu "Dies ist ein sehr langer Satz\ n Das erstreckt sich über mehrere Zeilen in der YAML\ n aber das wird als eine Zeichenfolge wiedergegeben\ n mit Zeilenumbrüchen erhalten. "


149
2018-03-12 15:28



Sie glauben es vielleicht nicht, aber YAML kann auch mehrzeilige Schlüssel verwenden:

?
 >
 multi
 line
 key
:
  value

34
2017-10-24 21:17



1. Block Notation:  Newlines werden zu Leerzeichen und zusätzliche Zeilenumbrüche, nachdem der Block entfernt wurde

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

...

Äquivalentes JSON

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

2. Literal Block Skalar:  ein Literal Block Scalar | enthält die Zeilenumbrüche und alle nachfolgenden Leerzeichen. aber entfernt extra

Zeilenumbrüche nach dem Block.

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


...

Äquivalentes JSON

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

3. + Indikator mit Literal Block Scalar: Halten Sie zusätzliche Zeilenumbrüche nach dem Block

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


...

Äquivalentes JSON

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

4. - Indikator mit Literal Block Scalar: - bedeutet, dass der Zeilenumbruch am Ende der Zeichenfolge entfernt wird.

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


...

Äquivalentes JSON

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

5. Gefalteter Blockskalar (>):

faltet Zeilenumbrüche in Leerzeichen und entfernt zusätzliche Zeilenumbrüche nach dem Block.

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


...

Äquivalentes JSON

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

Für mehr können Sie meine besuchen Blog


30
2018-04-06 05:08



Lange Zeilen verketten ohne Leerzeichen, verwenden Sie doppelte Anführungszeichen und umgehen Sie die Zeilenumbrüche mit umgekehrten Schrägstrichen:

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

(Danke @Tobia)


22
2018-04-11 19:39



Falls Sie in Symfony XML und Twig für Übersetzungen verwenden und mehrzeilige Übersetzungen in Javascript verwenden möchten, wird direkt nach der Übersetzung ein Wagenrücklauf hinzugefügt. Also auch der folgende Code:

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

Welche hat die folgende Übersetzung?

key: >
    This is a
    multi line 
    translation.

Wird immer noch in den folgenden Code in HTML führen:

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

Das Minuszeichen in Twig löst das nicht. Die Lösung besteht darin, dieses Minuszeichen nach dem Größer-als-Zeichen in Yml hinzuzufügen:

key: >-
    This is a
    multi line 
    translation.

Wird das richtige Ergebnis haben, mehrzeilige Übersetzung in einer Zeile in Twig:

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

15
2018-05-06 15:02