Dev Study
← 解説「壊れた HTML を直す — 閉じ忘れ、迷子の終了タグ、無い html / head / body」に戻る

サンプルコードで身につける: 壊れた HTML を直す — 閉じ忘れ、迷子の終了タグ、無い html / head / body

解説で学んだ概念を、3つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1<p> の閉じ忘れは次の <p> で閉じる

HTML Standard 13.2.6.4.7 "in body" は、<p> の開始タグが来たとき開いている <p> があれば先に閉じると定めます(close a p )。だから <p>one<p>two の 2 つの <p> は入れ子ではなく兄弟になります。木を作らずスタックの深さで字下げして形を見せており、実行すると閉じ忘れの入力と正しく書いた入力が同じ形になり、自動で閉じた箇所に矢印の注記が付きます。

Rust

2迷子の終了タグは無視・閉じ忘れは一緒に閉じる・html/head/body は暗黙に作る

「止まらずに直す」3 つの規則を 1 つの構築器にまとめ、直した箇所を errors に記録します。HTML Standard は を「報告してよいが処理は仕様どおり続ける」ものと定めるので、1 か所の壊れで全体が止まることはありません。実行すると <div><p>a</b>b</div><span>c</span> から # > html > head, body > div > p(a, b), span(c) の木ができ、</b> は無視、</div> の前に <p> を一緒に閉じた、という 2 件の parse error が出ます。

Rust

3実務に写す: 壊れた CSV を止まらずに読む

HTML のと同じ設計を CSV に写しました。列が足りない行は空文字で埋め、多い行は切り捨て、数値にならない値は None にして、どう直したかを errors に記録して続けます。実行すると 4 行すべてが読め、3 行目は列不足、4 行目は qty が数値でない、6 行目は列が多すぎる、という 3 件の記録が行番号つきで出ます。

Rust

図やコードに出てくる用語(タップで説明)