Dev Study
← 解説「属性の 8 つの状態 — 引用符 3 種類と、値のない属性」に戻る

サンプルコードで身につける: 属性の 8 つの状態 — 引用符 3 種類と、値のない属性

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

1引用符 3 種を状態で区別する

の値は "..."、'...'、引用符なし、の 3 通りで、HTML Standard 13.2.5.36〜38 はそれぞれ別のです。BeforeAttributeValue で「=」の次の 1 文字を見てどの状態に入るかを決め、その状態では対応する閉じ引用符だけが値の終わりになります(引用符なしは空白か > で終わる)。実行すると href="/x" title='say "hi"' target=_blank から href = "/x"、title = "say \"hi\""(単引用符の中の二重引用符は文字)、target = "_blank" の 3 つが取れます。

Rust

2値なし属性・空白・小文字化

AfterAttributeName(13.2.5.34)を足すと、「=」が来なかった属性を値なし(値は空文字)として確定して次の属性に進めます。タグ名と属性名は小文字に揃えて値はそのまま残し、「=」の前後の空白や改行、引用符の直後に空白が無い class="a"id="b"( だが続ける)も読めます。実行すると <INPUT DISABLED required Value=Yes> が input / disabled="" required="" value="Yes"、改行入りの a href = "/x" ID="Main" が href="/x" id="Main"、p class="a"id="b" が class="a" id="b" と出ます。

Rust

3実務: logfmt のログを同じ状態で読む

level=info msg="user logged in" user=kazu のような key=value 形式(logfmt)は、HTML の属性と同じ状態の並び(BeforeKey / Key / BeforeValue / 引用符 2 種 / Unquoted)で読め、値なしのキー(retry)は HTML の値なし属性と同じ扱いです。実行すると 3 行のログがそれぞれ 3 組・5 組・3 組に分かれ、level=error の行だけ msg(引用符の中のコロンと空白が保たれる)と retry の有無が抜き出されます。split(' ') では msg が壊れる入力です。

Rust

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