web-dev-qa-db-fra.com

Comment puis-je rompre une chaîne sur plusieurs lignes?

En YAML, j'ai une chaîne qui est très longue. Je veux garder cela dans la vue 80 colonnes (ou plus) de mon éditeur, alors j'aimerais rompre 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 ceci (ou quelque chose à cet effet):

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

J'aimerais utiliser des guillemets comme ci-dessus, afin que je n'ai besoin d'échapper à rien dans la chaîne.

1321
jjkparker

En utilisant le style yaml, chaque saut de ligne est remplacé par un espace. L'indention dans chaque ligne sera ignorée. Un saut de ligne sera inséré à la fin.

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

Vous pouvez utiliser "l'indicateur de blocage de bloc" pour éliminer le saut de ligne de fin, comme suit:

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.

D'autres outils de contrôle sont également disponibles (pour contrôler l'indentation, par exemple).

Voir https://yaml-multiline.info/

789
Matt Williamson

Il y a 5 6  NEUF (ou 63 *, en fonction de votre compte) de différentes façons d'écrire sur plusieurs lignes cordes en YAML.

TL; DR

  • Généralement, vous voulez >:

    key: >
      Your long
      string here.
    
  • Si vous souhaitez que les sauts de ligne soient préservés en tant que \n dans la chaîne (par exemple, markdown incorporé avec des paragraphes), utilisez |.

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Utilisez plutôt >- ou |- si vous ne souhaitez pas qu'un saut de ligne soit ajouté à la fin.

  • Si vous devez fractionner des lignes au milieu de mots ou taper littéralement les sauts de ligne sous la forme \n, utilisez plutôt des guillemets:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • YAML est fou.

Bloquer les styles scalaires (>, |)

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

>style plié supprime les retours à la ligne simples dans la chaîne (mais en ajoute un à la fin et convertit les doubles lignes en lignes simples):

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 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 YAML Spec 1.2

Le contenu scalaire peut être écrit en notation bloc, en utilisant un style littéral (indiqué par “|”) où tous les sauts de ligne sont significatifs. Ils peuvent également être écrits avec le style plié (indiqué par ">"), chaque saut de ligne étant plié en un espace sauf s’il termine une ligne vide ou une ligne plus en retrait.

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

Vous pouvez contrôler le traitement de la dernière nouvelle ligne de la chaîne et de toutes les lignes vides de fin (\n\n) en ajoutant un indicateur de blocage de bloc caractère:

  • >, |: "clip": conserve le saut de ligne, supprime les lignes vierges.
  • >-, |-: "strip": supprime le saut de ligne, supprime les lignes vierges.
  • >+, |+: "keep": conserve le saut de ligne, conserve les lignes vierges.

Styles scalaires "Flow" (, ", ')

Celles-ci ont un échappement limité et construisent une chaîne d'une seule ligne sans nouveaux caractères de ligne. Ils peuvent commencer sur la même ligne que la touche ou par des lignes nouvelles supplémentaires.

style brut (aucune combinaison d'échappement, aucune combinaison de # ou de :, limites sur le premier caractère):

Key: this is my very very very 
  long string

style entre guillemets (\ et " doivent être précédés de \, les nouvelles lignes peuvent être insérées avec une séquence littérale \n, les lignes peuvent être concaténées sans espaces \) suivant:

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 entre guillemets simples (le code ' doit être doublé, aucun caractère spécial, éventuellement utile pour l'expression de 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."

Sommaire

Dans cette table, _ signifie space character. \n signifie "caractère de nouvelle ligne" (\n en JavaScript), à l'exception de la ligne "nouvelles lignes en ligne", où elle correspond littéralement à une barre oblique inversée 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 finaux sur la ligne précédant "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."
]

Styles de bloc avec indicateurs d'indentation

Au cas où ce qui précède ne vous suffirait pas, vous pouvez ajouter un " indicateur d'indentation de bloc " (après votre indicateur de blocage, 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 premières lignes du style Plié, ils seront conservés avec une nouvelle ligne. 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 décompression de bloc possibles (ou aucun) et avec 9 indicateurs d'indentation possibles (ou aucun), 1 style brut et 2 styles entre guillemets: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

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

2980
Steve Bennett

Pour conserver nouvelles lignes, utilisez |, 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 du YAML‌ \ n mais qui sera restituée sous forme de chaîne‌ \ n avec nouvelles lignes préservées .\ n "

178
Ali Shakiba

1. Notation de bloc: Les nouvelles lignes deviennent des espaces et les nouvelles lignes 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. Scalaire de bloc littéral: Un scalaire de bloc littéral | inclura les nouvelles lignes et les espaces de fin. mais supprime extra

nouvelles lignes 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 littéral bloc scalaire: conserver 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 Scalaire au Bloc Scalaire: - signifie que la nouvelle ligne à la fin de la chaîne est supprimée.

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


...

JSON équivalent

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

5. Scalaire de bloc plié (>):

pliera les nouvelles lignes aux 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

72
Arayan Singh

Vous ne le croirez peut-être pas, mais YAML peut aussi utiliser des clés multilignes:

?
 >
 multi
 line
 key
:
  value
39
Mohsen

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

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

(Merci @Tobia)

37
phs

Si vous utilisez YAML et Twig pour les traductions dans Symfony et souhaitez utiliser des traductions multilignes en Javascript, un retour à la ligne 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.

Restera toujours dans le code suivant en HTML:

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

Ainsi, le signe moins dans Twig ne résout pas le problème. La solution consiste à ajouter ce signe moins après le signe supérieur à yml:

key: >-
    This is a
    multi line 
    translation.

Aura le résultat approprié, traduction multiligne sur une ligne dans Twig:

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

Pour les situations où la chaîne peut contenir des espaces ou non, je préfère les guillemets doubles et la continuation de ligne avec des barres obliques inverses:

key: "String \
  with long c\
  ontent"

Mais notez le piège dans le cas où une ligne de continuation commence par un espace, elle doit être échappée (car elle sera supprimée ailleurs):

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

Si la chaîne contient des sauts de ligne, vous devez l'écrire dans le style C \n.

Voir aussi cette question .

8
Joe

Aucune des solutions ci-dessus n'a fonctionné pour moi, dans un fichier YAML dans un projet Jekyll. Après avoir essayé de nombreuses options, je me suis rendu compte qu'une injection HTML avec <br> pourrait également être utile, car à la fin, tout est rendu au format HTML:

name: | Dans un village de La Mancha <br> dont je ne retiens le nom <br>.

Au moins ça marche pour moi. Aucune idée sur les problèmes associés à cette approche.

0
Irene