以下の処理が順番に行われます。
- HTMLタグのエスケープ
- 根ノードの追加
- 木構造への変換
- HTMLへの変換
- 根ノードの削除
- テキストエリア要素のアンインデント
- 整形済みテキスト要素のアンインデント
HTMLタグのエスケープ
根ノードの追加
木構造は1個の根ノードしか持ちませんが、HTMLとして最も浅い深さに複数の要素を持ちたい場合があります。
この要求のため、入力の各行のインデントを1増やし、先頭に"ROOT"という行を追加します。
木構造への変換
1行以上の連続する行がノードになります。
各ノードの深さは、インデントの深さになります。
ブロックレベル要素およびテキストエリア要素の開始から終了までは1個のノードになり、ブロックレベル要素フラグが付きます。
それ以外の部分はインデントの深さが変化したときと空行を挟んだときにノードに分割されます。
HTMLへの変換
各ノードのインデントの深さを、ノードの深さにします。
ブロックレベル要素フラグの付いていないノードには以下の変換が行われます。
子ノードを持つ場合
ノードをインデントの深さに応じて見出し要素で囲みます。
子ノードを持たない場合
ノードの各行のインデントの深さを1増やします。
ノードの各行の末尾に改行要素を追加します。
ノードを段落要素で囲みます。
根ノードの削除
ここまでの変換で入力は以下のように変換されているはずです。
<h0>ROOT</h0>
<div>
内容
</div>
この最初の2行と最後の1行を取り除き、内容のインデントの深さを1減らします。
テキストエリア要素のアンインデント
<textarea>
と</textarea>
タグのインデントの深さを0にします。
また、テキストエリア要素の内容はこのインデントの深さ+1だけ減らされます。
例:
<h1>見出し1</h1>
<div>
<div>
<textarea>
テキストエリア要素の
内容
</textarea>
</div>
</div>
このような入力が、
<h1>見出し1</h1>
<div>
<div>
<textarea>
テキストエリア要素の
内容
</textarea>
</div>
</div>
このように出力されます。
整形済みテキスト要素のアンインデント
整形済みテキスト要素<pre>
についても、テキストエリア要素と同様の変換が行われます。