-
Notifications
You must be signed in to change notification settings - Fork 4
/
824.txt
124 lines (93 loc) · 7.63 KB
/
824.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
[3] [DFN[[RUBYB[里親付け]@en[foster parenting]]]]とは、 [[HTML]] の[[構文解析]]において
[CODE(HTMLe)@en[[[table]]]] [[要素]]の[[子孫]]になりそうな[[要素]]や[[テキスト]]を他の[[要素]]に挿入することをいいます。
* 仕様書
[REFS[
-[5] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-20 22:41:10 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#foster-parent>
]REFS]
* 文脈
[11] [[里親付け]]は、[[表]]を構成する[[要素]] ([[こま]]や[[見出し]]以外)
の[[内容]]となるべき部分に[[表]]以外の[[要素]]や[[テキスト]]が出現した時に行われます。
[EG[
[12] 例えば
[PRE(HTML code)[
<table>hoge<p>abc</p><tr><td>aaa</table>
]PRE]
... では「hoge」や「<p>」が[[里親付け]]によって処理されます。
「abc」は [CODE(HTMLe)@en[[[p]]]] [[要素]]の[[子供]]となりますから、
この[[テキスト]]自体は[[里親付け]]の対象ではありません。
]EG]
[13] [[挿入モード]]としては [[in table]]、[[in table body]]、
[[in table row]] が該当します。
;; [15] ただし仕様書上は「[[using the rules for]]」によって規定を他の[[挿入モード]]に委ねていることがあるので、
[[in body]] や [[in head]] などの仕様上の規定に基づく[[要素]]や[[テキスト]]の挿入が[[里親付け]]されることがあります。
;; [16] また[[里親付け]]は [[AAA]] や[[活性書式付け要素の再構築]]の内部で発生することもあります。
[34] [[里親付け]]が有効な状態で処理が行われるのは、 >>13 の[[挿入モード]]における
「[[空白]]以外の[[文字字句]]」、「[CODE(HTML)@en[[[<input type=hidden>]]]] 以外の
[CODE(HTMLe)@en[[[input]]]] [[開始タグ]]」、「その他の[[開始タグ]]」、「その他の[[終了タグ]]」
です。[[空白]]、[[注釈字句]]、[CODE(HTML)@en[[[DOCTYPE]]]]、[[EOF]]
は[[里親付け]]の影響を受けません。[[終了タグ]]もほとんどは影響を受けませんが、
[CODE(HTMLe)@en[[[br]]]] や [CODE(HTMLe)@en[[[p]]]] の[[終了タグ]]が[[開始タグ]]に置き換えられ、
影響をうけることがあります。また[[終了タグ]]によって [[AAA]]
が実行されて[[要素]]が[[挿入]]されることもあります。
[14] [[里親付け]]は[[HTML構文解析器]]でのみ行われ、[[XML構文解析器]]では行われません。
* 処理モデル
[17] 必要なら[[里親付け]]を考慮した[[節点]]の挿入位置のことを仕様書は[DFN[[RUBYB[[[節点を挿入する適切な場所]]]@en[appropriate place for inserting a node]]]]
[SRC[>>5]] と呼んでいます。これは次のように決定します [SRC[>>5]]。
[FIG(steps)[
= [18] 与えられた[[節点]] (なければ[[現在節点]]) について考えます。
= [19] [[里親付け]]が有効になっていて、かつ >>18 の[[節点]]が
[CODE(HTMLe)@en[[[table]]]], [CODE(HTMLe)@en[[[thead]]]],
[CODE(HTMLe)@en[[[tbody]]]], [CODE(HTMLe)@en[[[tfoot]]]], [CODE(HTMLe)@en[[[tr]]]]
のいずれかなら、
== [22] [[開いている要素のスタック]]上に >>18 より前にある[[節点]]から
直近の [CODE(HTMLe)@en[[[template]]]] や [CODE(HTMLe)@en[[[table]]]] を探します。
== [23] [CODE(HTMLe)@en[[[template]]]] があれば、その[[雛形内容]]の末尾とします。
== [24] そうでなく [CODE(HTMLe)@en[[[table]]]] があれば、
=== [26] [CODE(HTMLe)@en[[[table]]]] が[[親節点]]を持てば、
[[親節点]]における [CODE(HTMLe)@en[[[table]]]] の直前とします。
=== [27] なければ、[[開いている要素のスタック]]上で >>18 の直前にある[[要素]]の末尾とします。
== [25] どちらもなければ、[[開いている要素のスタック]]の最古の[[要素]]の末尾とします。
= [20] それ以外で >>18 の[[節点]]が [CODE(HTMLe)@en[[[template]]]]
なら、その[[雛形内容]]の末尾とします。
= [21] それ以外なら、 >>18 の[[節点]]の末尾とします。
]FIG]
[29] [[スクリプト]]によって [CODE(HTMLe)@en[[[table]]]] が移動されている場合には、
[[里親付け]]される[[節点]]は [CODE(HTMLe)@en[[[table]]]]
が元あった位置ではなく、現に存在する位置の前に挿入されます。
ただし [CODE(HTMLe)@en[[[table]]]] [[要素]]の[[親節点]]がない場合には、
元あった位置近くに挿入されます。
;; [31] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Ca%20href%3Dx%3E%3Ctable%3E%3Ca%20href%3Dy%3Ea%3C%2Fa%3E%3Cscript%3Et%20%3D%20document.getElementsByTagName(%27table%27)%5B0%5D%3Bt.parentNode.removeChild(t)%3C%2Fscript%3Eb>
のように [CODE(HTMLe)@en[[[table]]]] が元々挿入されていた[[要素]]が既に[[開いている要素のスタック]]から除去されていることがありますから、
[CODE(HTMLe)@en[[[table]]]] [[要素]]が元あった位置そのものとは限りません。
[28] [CODE(HTMLa)@en[[[innerHTML]]]] や [CODE(HTMLe)@en[[[template]]]]
で [CODE(HTMLe)@en[[[table]]]] の[[親]]が存在していない場合には、
[[里親付け]]されない場合と同じように末尾に[[節点]]が挿入されます。
[30] [CODE(HTMLe)@en[[[table]]]] の[[親要素]]が[[文書]]になっている場合、
[[根要素]]の前に[[テキスト]]や[[要素]]を挿入することになりますが、
これは [[DOM]] の制約で禁止されていますから、どこにも挿入されないことになります。
[32] この「[[節点を挿入する適切な場所]]」の定義は、
[[HTML構文解析器]]の仕様上[[節点]]が挿入されるほとんどすべての場所で参照されています。
;; [33] [[AAA]] で[[節点]]を移動する位置の決定では参照されていません。
[[AAA]] でも新しい[[節点]]の挿入は[[節点を挿入する適切な場所]]に行われます。
* 歴史
[4] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-09-06 10:45:38 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2731&to=2732>
[CODE(DOMa)@en[[[parentNode]]]] を直接見ない形に改められました。閉じられていない [CODE(HTMLe)@en[[[a]]]] [[要素]]があって表の内外で入れ子になっている場合や、
[[スクリプト]]によって[[要素]]構造が操作された場合の動作に影響が出ます。
[2] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-06 10:30:15 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=2987&to=2988>
[CODE(HTMLe)@en[[[style]]]]、[CODE(HTMLe)@en[[[script]]]]、
[CODE(HTML)@en[[[<input type=hidden>]]]] に関して[[里親付け]]が行われなくなりました。
[1] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-05 20:32:09 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=3381&to=3382>
[[空白文字]]の[[里親付け]]を行うかどうかの決定方法が変更されました。
[6] [CITE[IRC logs: freenode / #whatwg / 20090709]]
([TIME[2009-09-12 22:13:44 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090709#l-210>
[10] 次の2つの補助的な用語は仕様の改訂で使われなくなっています。
[8] 挿入先の[[要素]]を[DFN[[RUBYB[里親要素][foster parent element]]]]といいます。
[9] ある[[節点]]が[[里親要素]]に挿入されることを、[[節点]]が[DFN[[RUBYB[[[里親付け]]される]@en[foster parented]]]]といいます。
[7] [CITE@en[Web Applications 1.0 r8665 PARSER: Add a parse error for non-space characters in <table> elements]]
( ([TIME[2014-06-09 14:43:00 +09:00]] 版))
<http://html5.org/r/8665>