Question En YAML, comment je casse une chaîne sur plusieurs lignes?


En YAML, j'ai une chaîne très longue. Je veux garder cela dans la vue à 80 colonnes (ou plus) de mon éditeur, donc je voudrais casser la chaîne. Quelle est la syntaxe pour cela?

En d'autres termes, j'ai ceci:

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

et j'aimerais avoir ça (ou quelque chose comme ça):

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

Je voudrais utiliser des guillemets comme ci-dessus, donc je n'ai pas besoin d'échapper quoi que ce soit dans la chaîne.


934
2017-09-24 19:47


origine


Réponses:


En utilisant le style plié en yaml, chaque saut de ligne est remplacé par un espace. L'indentation dans chaque ligne sera ignorée.

>
  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



Il y a 5  6  NEUF (ou 63 *, selon la façon dont vous comptez) différentes façons d'écrire des chaînes multilignes en YAML.

Bloquer les styles scalaires (>, |)

Ceux-ci permettent des caractères tels que \ et " sans s'échapper, et ajouter une nouvelle ligne (\n) à la fin de votre chaîne.

>  Style plié supprime les nouvelles lignes simples dans la chaîne (mais en ajoute une à la fin et convertit les nouvelles lignes doubles en singles):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

|  Style littéral transforme chaque nouvelle ligne de la chaîne en une nouvelle ligne littérale et en ajoute une à la fin:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Voici la définition officielle de la YAML Spec 1.2

Le contenu scalaire peut être écrit en notation de bloc, en utilisant un style littéral (indiqué par "|") où tous les sauts de ligne sont significatifs. Alternativement, ils peuvent être écrits avec le style plié (noté ">") où chaque saut de ligne est replié dans un espace à moins qu'il ne termine une ligne vide ou indentée.

Styles de bloc avec indicateur de blocage de bloc (>-, |-, >+, |+)

Vous pouvez contrôler la gestion de la nouvelle ligne finale dans la chaîne et des lignes vides finales (\n\n) en ajoutant bloc indicateur de chomping personnage:

  • >, |: "clip": garde le saut de ligne, supprime les lignes vides qui suivent.
  • >-, |-: "strip": supprime le saut de ligne, supprime les lignes vides qui suivent.
  • >+, |+: "keep": garde le saut de ligne, garde les lignes vides.

Styles scalaires "Flow" (, ", ')

Ceux-ci ont un échappement limité, et construisent une chaîne à une seule ligne sans aucun nouveau caractère de ligne. Ils peuvent commencer sur la même ligne que la clé, ou avec des nouvelles lignes supplémentaires en premier.

style simple (pas d'échappement, pas # ou : combinaisons, limites au premier caractère):

Key: this is my very very very 
  long string

style à double guillemets (\ et " doit être échappé par \, les nouvelles lignes peuvent être insérées avec un littéral \n séquence, les lignes peuvent être concaténées sans espaces avec 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."

style à guillemets simples (littéral ' doit être doublé, pas de caractères spéciaux, peut-être utile pour exprimer des chaînes commençant par des guillemets doubles):

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

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

Résumé

Dans ce tableau, _ veux dire space character. \n signifie "caractère de nouvelle ligne" (\n en JavaScript), à l'exception de la ligne "newlines en ligne", où elle signifie littéralement une barre oblique inverse et un 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       |

Exemples

Notez les espaces de fin sur la ligne avant "espaces".

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

Bloquer les styles avec des indicateurs d'indentation

Juste au cas où ce qui précède ne vous suffit pas, vous pouvez ajouter un "indicateur d'indentation de bloc"(après votre indicateur de blocage de bloc, si vous en avez un):

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

Addenda

Si vous insérez des espaces supplémentaires au début des lignes qui ne sont pas les premières du style Plié, elles seront conservées avec un retour à la ligne bonus. Cela n'arrive pas avec les styles de flux:

- >
    my long
      string
- my long
    string

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

Je ne peux même pas.

*2 styles de bloc, chacun avec 2 indicateurs de compression de bloc possibles (ou aucun), et avec 9 indicateurs d'indentation possibles (ou aucun), 1 style simple et 2 styles cités: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Certaines de ces informations ont également été résumées ici.


2230
2018-02-11 10:27



Conserver nouvelles lignes utilisation |, par exemple:

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

est traduit en "Ceci est une très longue phrase\ n qui s'étend sur plusieurs lignes dans le YAML\ n mais qui sera rendu sous forme de chaîne\ n avec des nouvelles lignes préservées. "


149
2018-03-12 15:28



Vous pourriez ne pas le croire, mais YAML peut aussi faire des clés multi-lignes:

?
 >
 multi
 line
 key
:
  value

34
2017-10-24 21:17



1. Notation de bloc:  Les nouvelles lignes deviennent des espaces et des retours à la ligne supplémentaires après la suppression du bloc

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

...

JSON équivalent

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

2. Bloc scalaire littéral:  un bloc scalaire littéral | inclura les nouvelles lignes et tous les espaces de fin. mais enlève supplémentaire

newlines après le bloc.

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


...

JSON équivalent

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

3. + indicateur avec bloc scalaire littéral: garder les nouvelles lignes après le bloc

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


...

JSON équivalent

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

4. - indicateur avec bloc scalaire littéral: - signifie que le retour à la ligne à la fin de la chaîne est supprimé.

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


...

JSON équivalent

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

5. Bloc scalaire plié (>):

va plier les nouvelles lignes dans les espaces et supprime les nouvelles lignes après le bloc.

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


...

JSON équivalent

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

pour plus vous pouvez visiter mon Blog


30
2018-04-06 05:08



Pour concaténer les longues lignes sans espace, utilisez des guillemets doubles et échappez aux nouvelles lignes avec des barres obliques inverses:

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

(Merci @Tobia)


22
2018-04-11 19:39



Dans le cas où vous utilisez yml et Twig pour des traductions dans Symfony, et que vous souhaitez utiliser des traductions multilignes en Javascript, un retour chariot est ajouté juste après la traduction. Donc même le code suivant:

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

Qui a la traduction yml suivante:

key: >
    This is a
    multi line 
    translation.

Cela entraînera toujours le code suivant en html:

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

Donc, le signe moins dans Twig ne résout pas ça. La solution est d'ajouter ce signe moins après le signe supérieur à yml:

key: >-
    This is a
    multi line 
    translation.

Auront le bon résultat, traduction multiligne sur une ligne dans Twig:

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

15
2018-05-06 15:02