如何在多行中断YAML中的字符串?

在YAML中,我有一个很长的字符串。我想将其保留在编辑器的80列(左右)视图中,所以我想打破字符串。这是什么语法?

换句话说,我有这个:

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

我想要这个(或类似的东西):

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

我想像上面那样使用引号,所以我不需要转义字符串中的任何内容。

1217017 次浏览

使用yaml折叠样式。每行中的缩进将被忽略。将在末尾插入换行符。

Key: >This is a very long sentencethat spans several lines in the YAMLbut which will be rendered as a stringwith only a single carriage return appended to the end.

http://symfony.com/doc/current/components/yaml/yaml_format.html

您可以使用“块咬合指示器”来消除尾随换行符,如下所示:

Key: >-This is a very long sentencethat spans several lines in the YAMLbut which will be rendered as a stringwith NO carriage returns.

在任何一种情况下,每个换行符都被一个空格替换。

还有其他可用的控制工具(例如用于控制缩进)。

https://yaml-multiline.info/

要保留换行符,请使用#0,例如:

|This is a very long sentencethat spans several lines in the YAMLbut which will be rendered as a stringwith newlines preserved.

翻译为“这是一个非常长的句子\n,它跨越YAML\n中的几行,但将被呈现为字符串\n并保留换行符。\n

在YAML中编写多行字符串有56<强>九(或63*,取决于您的计数方式)不同的方法。

太长别读

  • 大多数时候使用>:内部换行符被去掉,尽管你在最后得到一个:

      key: >Your longstring here.
  • 如果您希望将这些换行符保留为\n(例如,带有段落的嵌入式标记),请使用|

      key: |### Heading
    * Bullet* Points
  • 如果您不希望在末尾附加换行符,请使用>-|-

  • 如果您需要在单词中间拆分行或想要按字面意思键入换行符\n,请使用"..."

      key: "Antidisestab\lishmentarianism.\n\nGet on it."
  • YAML疯了。

块标量样式(>|

这些允许\"等字符不转义,并在字符串末尾添加新行(\n)。

>折叠样式删除字符串中的单个换行符(但在末尾添加一个,并将双换行符转换为单行):

Key: >this is my very very verylong string

this is my very very very long string\n

额外的前导空格会被保留并导致额外的换行符。

建议:用这个。通常这就是你想要的。

|文字风格将字符串中的每个换行符转换为文字换行符,并在末尾添加一个:

Key: |this is my very very verylong string

this is my very very very\nlong string\n

这是YAML Spec 1.2的官方定义

标量内容可以用块表示法编写,使用文字样式(由“|”表示),其中所有换行符都很重要。或者,它们可以使用折叠样式(由“>”表示)编写,其中每个换行符都折叠到一个空格,除非它以空行或更缩进的行结束。

建议:使用它来插入格式化文本(尤其是Markdown)作为值。

带有块咀嚼指示器的块样式(>-|->+|+

您可以通过添加块咬合指示器字符来控制字符串中最后一个新行和任何尾随空行(\n\n)的处理:

  • >|:“剪辑”:保留换行符,删除尾随的空白行。
  • >-|-:“带”:删除换行符,删除尾随的空白行。
  • >+|+:“保持”:保持换行符,保持空行尾随。

“流”标量样式( "'

它们具有有限的转义,并构造一个没有新行字符的单行字符串。它们可以与键在同一行开始,也可以先从其他换行符开始,这些换行符被剥离。双换行符成为一个换行符。

普通样式(没有转义,没有 #: 组合,第一个字符不能是"'或许多其他标点符号):

Key: this is my very very verylong string

建议:避免。可能看起来很方便,但你可能会因为不小心使用了禁止的标点符号而触发语法错误。

双引号样式\"必须由\转义,换行符可以用文字\n序列插入,行可以连接而不用尾随\的空格):

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

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

建议:在非常特殊的情况下使用。这是在不添加空格的情况下跨行中断很长标记(例如URL)的唯一方法。也许在中线添加换行符可能会很有用。

单引号样式(文字'必须加倍,没有特殊字符,可能对表达以双引号开头的字符串有用):

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

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

建议:避免。很少有好处,主要是不便。

带有缩进指示符的块样式

如果上面的内容对你来说还不够,你可以添加一个“块缩进指示器”(在你的块咀嚼指示器之后,如果你有的话):

- >8My long stringstarts over here- |+1This onestarts here

注意:折叠样式的前导空格(>

如果您在折叠样式中的非第一行开头插入额外的空格,它们将被保留,并带有额外的换行符。(这不会发生在流样式中。)第6.5节

此外,折叠不适用于包含前导空格的文本行周围的换行符。请注意,这种缩进更多的行可能仅由这种前导空格组成。

- >my longstring                    
many spaces above- my longstring                    
many spaces above    

["my long\n string\n \nmany spaces above\n","my long string\nmany spaces above"]

总结

在此表中,_表示space character\n表示“换行符”(JavaScript中的\n),除了“其他功能”下。“前导空格”适用于第一行(建立缩进)之后

>|"'>->+|-|+
空格/换行符转换为:
尾随空间→______
领先空间→\n_\n_\n_\n_\n_\n_
单个换行符→_\n_____\n\n
双换行符→\n\n\n
\n\n
最后双换行符→\n\n\n\n
如何创建文字:
单引号''''''''''
双引号\"
反斜杠\\\\\
\n的内联换行符🚫🚫🚫🚫🚫🚫🚫🚫
\的空格换行符🚫🚫🚫🚫🚫🚫🚫🚫
#: 的值🚫
可以从与键相同的
行开始
🚫🚫🚫🚫🚫🚫

示例

注意“空格”之前一行的尾随空格。

- >very "long"'string' with
paragraph gap, \n andspaces.- |very "long"'string' with
paragraph gap, \n andspaces.- very "long"'string' with
paragraph gap, \n andspaces.- "very \"long\"'string' with
paragraph gap, \n ands\p\a\c\e\s."- 'very "long"''string'' with
paragraph gap, \n andspaces.'- >-very "long"'string' with
paragraph gap, \n andspaces.
["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."]

*2块样式,每个都有2个可能的块咀嚼指示器(或无),9个可能的缩进指示器(或无),1个普通样式和2个引用样式:2 x(2+1)x(9+1)+1+2=63

其中一些信息也被总结为这里

你可能不相信,但YAML也可以做多行键:

?>multilinekey:value

如果您在Symfony中使用YAML和Twig进行翻译,并且想要在Javascript中使用多行翻译,则会在翻译后立即添加回车。所以即使是以下代码:

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

其中有以下yml翻译:

key: >This is amulti linetranslation.

仍然会在html中产生以下代码:

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

所以,Twig中的负号并不能解决这个问题。解决方案是在yml中的大于号之后添加这个负号:

key: >-This is amulti linetranslation.

将有正确的结果,多行翻译在Twig中的一行:

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

要连接长行没有空格,请使用双引号并用反斜杠转义换行符:

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

对于字符串可能包含空格或不包含空格的情况,我更喜欢双引号和带反斜杠的行延续:

key: "String \with long c\ontent"

但是请注意,如果连续行以空格开头,则需要转义(因为它将在其他地方被剥离):

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

如果字符串包含换行符,则需要使用C样式\n编写。

另见这个问题

1.块表示法(普通、流样式、标量):删除块后,换行符变成空格和额外的换行符

---# Note: It has 1 new line after the stringcontent:Arbitrary free textover multiple lines stoppingafter indentation changes...
...

等效JSON

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

2.文字块标量:文字块标量||将包括换行符和任何尾随空格。但删除额外的

块后的换行符。

---# After string we have 2 spaces and 2 new linescontent1: |Arbitrary free textover "multiple lines" stoppingafter indentation changes...

...

等效JSON

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

3.+带有字面块标量的指标:块后保留额外的换行符

---# After string we have 2 new linesplain: |+This unquoted scalarspans many lines.

...

等效JSON

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

4.-指标与文字块标量:-表示删除字符串末尾的换行符。

---# After string we have 2 new linesplain: |-This unquoted scalarspans many lines.

...

等效JSON

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

5.折叠块标量(>):

将换行符折叠为空格,但删除块后的额外换行符。

---folded_newlines: >this is really asingle line of textdespite appearances

...

等效JSON

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

更多你可以访问我的博客

在Jekyll项目中的YAML文件中,上述解决方案都不适合我。在尝试了许多选项后,我意识到<br>的超文本标记语言注入也可以,因为最终所有内容都呈现为超文本标记语言:

名称:|在La Mancha<br>的一个村庄,我不想记住它的名字。

至少它对我有用。不知道与这种方法相关的问题。

如果您在前端存储库中使用YAML文件并尝试在前端呈现新行,那么

使用
标签

 key: >-Line 1<br>Line 2<br>Line 3

而不是\n

 key: >-Line 1\nLine 2Line 3