YAML 1.2 メモ (4) 行の折りたたみ

リテラル以外の4種類のスカラーである、フォールデッド、プレイン、ダブル・クォーテッド、そしてシングル・クォーテッドはすべて複数行に渡る記述ができるようになっています。そのとき、Wiki 記法の段落に似た行の折りたたみがおこなわれます。さらに、フォールデッドを除くと、行頭・行末のスペース・タブを削り取るので、下の 4 つのドキュメントはすべて同じ文字列を表しています。

# リテラルとフォールデッドの内容のインデント・レベルは quick の前のスペース数から自動判定します。
--- |-  # リテラルの場合。strip インディケータ (-) で最後の改行を削ります。
 quick brown fox jumps

 over
 the lazy dog.
--- >-  # フォールデッドの場合。単純な場合、白くない行はスペースで連結し、空行で改行します。
 quick brown
 fox
 jumps


 over

 the lazy
 dog.
---     # プレインの場合。同じく。プレインでは行頭・行末のスペース・タブは削り取られます。
      quick brown
        fox jumps


       over       

  the lazy
  dog.
---     # シングル・クォーテッドの場合。クォートの直後・直前のスペースは削りません。
'quick brown
 fox jumps


     over

 the lazy
 dog.'
---     # ダブル・クォーテッドの場合。同じく。
"quick brown fox
           jumps


     over

 the lazy
 dog."
...

フォールデッドでは、白くない行のインデントに続いてスペース・タブを一つ置いた空白始まりの白くない行では折りたたみがおこなわれなくなります。このとき、直前の空白始まりでない白くない行の末尾改行も削らずに文字列にとりこまれます。

--- |-  # リテラルの場合。
 quick brown fox jumps

  over

 the lazy dog.
--- >-  # フォールデッドで白くない行のインデント直後に空白・タブを置くと挙動が変化します。
 quick brown
 fox
 jumps

  over

 the lazy
 dog.
...

この特例について仕様ではリストを混ぜるときに便利になるとアピールしてあります。ですが、使いにくくしているだけで残念感が漂っている気がしてなりません。

最後に、ダブル・クォーテッドのエスケープ・シーケンスを使うと、行の折りたたみ機能を抑制して改行の挿入位置を明示することができます。

--- |-
 日本語では、行連結で空白が挟まれるのを避けたいときがあります。
 そのときは、ダブル・クォートで行末をエスケープします。

 行末をエスケープすると、行末の改行文字を取り込まず、スペースも挟まずに直接行を連結します。
---
"日本語では、行連結で空白が挟まれるのを避けたいときがあります。\n\
 そのときは、ダブル・クォートで行末をエスケープします。\n\
 \n\
 行末をエスケープすると、行末の改行文字を取り込まず、\
 スペースも挟まずに直接行を連結します。"
...

改行のエスケープ・シーケンスに続けて、行末エスケープを置く書き方はイディオムらしくて、YAML 1.2 の仕様で多用されています。