ホワイトスペースの処理
ホワイトスペースの折り畳みと置き換え
はじめに、インライン整形コンテキストに含まれるインライン・レベルのホワイトスペースは下記の処理が行われます。この処理はライン・ブレイク処理と双方向(bidi)のテキストの並べ替えの前に行われます。
“white-space”プロパティの値が“normal”、“nowrap”、“pre-line”のいずれかである場合、ホワイトスペースは折り畳み可能と判断され、以下の手順で処理されます。
- セグメント・ブレイクの直前、もしくは直後にある連続する半角スペース(U+0020)とタブ文字(U+0009)は取り除かれます。
- 次に、セグメント・ブレイクの処理(詳細は次項)が行われます。
- 次に、タブ文字はすべて折り畳み可能な半角スペースに置き換えられます。
- 次に、別の折り畳み可能な半角スペース直後にある折り畳み可能な半角スペースは送り幅が“0”になるように折り畳まれます。
“white-space”プロパティの値が“pre”、“pre-wrap”、“break-spaces”のいずれかである場合、すべての連続する半角スペースは連続するノーブレーク・スペースとして扱われます。ただし、“pre-wrap”の場合は連続する半角スペースとタブ文字の後にソフト・ラップの機会があります。また、“break-spaces”の場合はすべての半角スペースとタブ文字の後にソフト・ラップの機会があります。
セグメント・ブレイクの処理
“white-space”プロパティの値が“pre”、“pre-wrap”、“break-spaces”、“pre-line”のいずれかである場合、セグメント・ブレイクは折り畳まれず、温存される行送り(U+000A)に置き換えられます。
“white-space”プロパティの値が上記以外の場合はセグメント・ブレイクは折り畳みが可能であり、次の手順で処理されます。
- 別のセグメント・ブレイクの直後にあるセグメント・ブレイクは取り除かれます。
- 次に、残るすべてのセグメント・ブレイクは前後の文脈に応じて半角スペースに置き換えられるか取り除かれます。
セグメント・ブレイクを半角スペースに置き換えるか取り除くかはユーザー・エージェントによって判断されます。歴史的にはセグメント・ブレイクは常に半角スペースに置き換えられてきましたが、言語によってはこのように取り扱うと文章が不自然になるのでユーザー・エージェントはテキストの性質に応じて処理方法を変えるように求められています。
ホワイトスペースの整理と配置
インライン・レベルのコンテンツは“white-space”プロパティによって指定されたライン・ブレイク処理と双方向(bidi)のテキストの並べ替えを行いながら、次のように行に配置されます。
- 行の最初にある折り畳み可能な半角スペースは取り除かれます。
- “tab-size”プロパティによって指定されるタブ・サイズが“0”である場合、温存されるタブ文字は表示されません。そうでなければ温存されるタブ文字はその次にある文字を次のタブ・ストップに揃えるために移動させます。この移動の距離が“0.5ch”未満である場合は代わりにその後続のタブ・ストップに揃えられます。
- 行の最後にある連続する折り畳み可能な半角スペースは取り除かれます。また、“white-space”プロパティの値が“normal”、“nowrap”、“pre-line”のいずれかである場合、最後にあるオガム文字のスペース(U+1680)も取り除かれます。
- 連続するホワイトスペースやその他のスペース・セパレータ、温存されるタブ文字が行の最後に残っていれば、“white-space”プロパティの値によってぶら下げや折り畳みが行われます。
- 行の最初にある折り畳み可能な半角スペースは取り除かれます。
- “normal”、“nowrap”、“pre-line”のいずれかの場合、連続するこれらの文字は無条件にぶら下げられます。
- “pre-wrap”の場合、連続するこれらの文字は強制ライン・ブレイクが直後にある場合を除き、ぶら下げられます。強制ライン・ブレイクが直後にある場合は条件付のぶら下げを行うか、折り畳みます。
- “break-spaces”の場合、半角スペースやタブ文字、その他のスペース・セパレータは他の視覚可能な文字と同じように扱われ、ぶら下げや折り畳みは行われません。
“タブ・ストップ(Tab Stop)”は温存されるタブ文字の最も近い祖先であるブロック・コンテナのコンテント・ボックスの端からタブ・サイズの整数倍の位置に生成されます。