Dev Study
← Rust で小さなブラウザを作る コース

11. 属性の 8 つの状態 — 引用符 3 種類と、値のない属性

を読むにはを 8 つ足します。BeforeAttributeName(タグ名のあとの空白を読んだ)、AttributeName(名前の途中)、AfterAttributeName(名前のあと)、BeforeAttributeValue(= のあと)、AttributeValue の 3 つ(二重引用符・一重引用符・引用符なし)、AfterAttributeValueQuoted(閉じ引用符のあと)。名前は HTML Standard 13.2.5.32〜13.2.5.39 と同じです。

入口は TagName で空白を読んだときです。前のレッスンでは空白をタグ名の一部にしていましたが、ここから BeforeAttributeName に移ります。そこで空白以外の文字が来たら「新しい属性(名前も値も空)を作って AttributeName で」。以後の文字はこの属性の名前に溜まり、= が来たら値へ、空白や > が来たら名前だけの属性(disabled や required)として確定します。

値の読み方は引用符で 3 つに分かれます。"..." の中では閉じの " が来るまで、空白も > も全部が値です(alt="a > b" が正しく読めるのはこのため)。'...' も同じ。引用符なしは空白か > で終わります。閉じ引用符のあとは空白が来れば次の属性、> ならタグの完成です。

属性名は小文字にそろえます(ID=Main が id になる)。値はそのままです。この実装は同じ名前の属性が 2 回出たときの重複除去(仕様は後の方を捨てる)と、値の中の文字参照(&)を省いています。

本物のブラウザでは: 属性の名前と値を集める形は の HTMLToken も同じです。この実装が省いた文字参照(& など)は、Blink では html_entity_parser.cc と html_entity_table.h が担当し、表の構造体には「数千個のオブジェクトになるので詰め方を最適化した」と注釈があります。Firefox は make named_characters で名前付き文字参照の表を生成します。『引用符の中では区切りの意味が消える』という属性値の読み方に、文字参照の置き換えを重ねたものが本物の属性値です。

開発のどこに活かすか: 「引用符の中では区切り文字の意味が消える」のは CSV、シェル、SQL、JSON、設定ファイルのどれでも同じ問題で、同じ形(引用符ごとの状態)で解きます。属性名を小文字にそろえる・値はそろえない、という非対称も、 名や変数名の扱いで繰り返し出てきます。

点線の付いた語はタップすると説明が出ます。用語集を開く →

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Rust

手元で動かす(配布物)

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

サンプルコードで身につける(3本) →

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

公式ドキュメントで詳しく ↗