挿入モード

挿入モード (構文解析器)

[1] 挿入モード (insertion mode) は、HTML構文解析器木構築段階における動作モード (構文解析器の状態の一つ) です。 字句化器によって送出された字句は、木構築発送器挿入モードによって決まる処理が適用され、 DOM木の構築が行われます。

仕様書

表記

[3] 挿入モードは、「the "in body" insertion mode」のように引用符で括って表記されます。

挿入モードの一覧

[4] HTML構文解析器には、次の挿入モードがあります。

[5] 以前は外来内容の処理も挿入モードの一つ ("in foreign content") でしたが、現在は木構築発送器によって分岐する特別な処理手順となっています。

[12] 仕様上は挿入モードではありませんが、 textarea など一部の開始タグの直後では U+000A 文字字句を1つ無視することになっています。実装によってはこれを特別な挿入モードとして、 あるいは木構築発送器の分岐として実現しているかもしれません。

[13] textarea のように original insertion mode挿入モードを保存して "text" 挿入モードに切り替えてから U+000A が無視される場合と、 prelisting のようにそのままの挿入モードU+000A が無視される場合の2パターンあります。

挿入モードの変化

[6] 通常のHTML構文解析器の初期状態は、 "initial" 挿入モードです >>2

[7] 素片構文解析の場合は、文脈要素に合わせた挿入モードとなります。

[9] 挿入モードは、字句の処理に従い適宜変化していきます。 基本的には、開始タグによって次の挿入モードに (必要なら) 切り替えられ、 終了タグによって元の挿入モードに戻ります。

[8] 仕様書上は、ほとんどの挿入モードは、次の挿入モードへと、状態を持たずに変化します。 終了タグによる元の挿入モードへの復元は、 reset the insertion mode appropriately 手順によって要素の種類をチェックすることで行われます。

[10] しかし "text""in table text" は特別で、 開始タグでこれらの挿入モードに切り替えられた時に元の挿入モードoriginal insertion mode として保存され、 終了タグ挿入モードoriginal insertion mode に切り替えられます。

[11] また template 要素では現在節点だけから挿入モードを決められないので、 stack of template insertion modes挿入モードが保存されていて、 適宜ここから復元されます。

[14] 挿入モードの状態遷移を図示すると、次のようになります。 (主要な遷移と挿入モードのみ表示。)

initial
initial
->
before html
before html
before html
->
before head
in template
in template
>>
5
->
in head noscript
->
in body
->
in table
->
in table body
->
in row
->
in column group
before head
before head
->
in head
in head
in head
->
after head
->
in head noscript
->
text
in head noscript
in head noscript
v
>>
1
->
in head
->
in template
after head
after head
->
in body
->
in frameset
->
text
in body
in body
v
->
in table
->
in template
->
in select
->
after body
->
text
in frameset
in frameset
>>
4
->
text
->
after frameset
in select
in select
v
>>
1
->
in body
#->
in cell
#->
in caption
->
text
->
in template
in select in table
in select in table
>>
5
->
in table
->
in table body
->
in row
->
text
->
in template
in table
in table
v
>>
2
->
in caption
->
in column group
->
in table body
->
in body
->
in select in table
->
in template
->
text
->
in table text
in table text
in table text
v
>>
4
->
in table
->
in table body
->
in row
#->
in body
in caption
in caption
v
>>
1
->
in table
#->
in body
#->
in select
->
in template
->
text
in column group
in column group
>>
3
->
in table
#->
in body
->
in template
in table body
in table body
v
>>
2
#->
in body
->
in table
->
in row
->
in table text
->
in select in table
->
in template
->
text
in row
in row
v
>>
2
#->
in body
->
in table body
->
in cell
->
in table text
->
in select in table
->
in template
->
text
in cell
in cell
v
>>
2
#->
in body
->
in row
#->
in select
->
in template
->
text
text
text
v
>>
9
->
in head
->
after head
->
in body
->
in table
after body
after body
->
after after body
after frameset
after frameset
>>
4
->
after after frameset
after after body
after after body
->
in body
after after frameset
after after frameset
>>
4