[25] [DFN[[RUBYB[[[活性書式付け要素のリスト]]]@en[list of active formatting elements]]]]は、
[[HTML構文解析器]]において[[開始タグ]]と[[終了タグ]]が正常に入れ子関係になっていない時に、
[[木構造]]を保ちつつ[[著者]]の意図した[[レンダリング]]を実現するために[[書式付け要素]]を開き直したりするためのリストです。
[[AAA]] と共に[[HTML構文解析器]]の歴史的暗部の一つです。

* 仕様書

[REFS[
- [1] [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/#the-list-of-active-formatting-elements>
- [2] [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/#formatting>
]REFS]

* 活性書式付け要素のリスト

[16] [DFN[[RUBYB[[[活性書式付け要素のリスト]]]@en[list of active formatting elements]]]]は、
[SRC[>>1]] [[HTML構文解析器]]を構成するリストの1つです。

;; [17] [[XML構文解析器]]にはこのリストはありません。

[19] このリストには、
[[要素]]や[DFN[[RUBYB[マーカー]@en[marker]]]]と呼ばれる目印が [[push]] により追加されたり、
[[pop]] によって除去されたりします。初期状態ではこのリストは空です。

[20] [[マーカー]]は、複数個含まれることがあります。

;; [18] 同じ[[要素]]が複数回含まれることはありません。

[21] [[要素]]は、[[多妻ノアの方舟]] (>>8) によって末尾以外から除去されたり、
clear によって一度に複数個除去されたりすることもあります。 [[AAA]]
によっても除去されることがあります。再構築によって他の[[要素]]に置き換えられることもあります。

* 書式付け要素

[3] [[HTML構文解析器]]における[[要素]]の[RUBYB[[[分類]]]@en[category]]の1つである[DFN[[RUBYB[[[書式付け]]]@en[formatting]]]] [SRC[>>2]] は、
[[活性書式付け要素のリスト]]に追加され得る[[要素]]を表しています。

[FIG(corollary)[
[23] これらの[[要素]]以外の[[要素]]が[[活性書式付け要素のリスト]]に追加されることはありません。
]FIG]

[4] 次の[[HTML要素]]が含まれています [SRC[>>2]]。

[FIG(short list)[
- [CODE(HTMLe)@en[[[a]]]]
- [CODE(HTMLe)@en[[[b]]]]
- [CODE(HTMLe)@en[[[big]]]]
- [CODE(HTMLe)@en[[[code]]]]
- [CODE(HTMLe)@en[[[em]]]]
- [CODE(HTMLe)@en[[[font]]]]
- [CODE(HTMLe)@en[[[i]]]]
- [CODE(HTMLe)@en[[[nobr]]]]
- [CODE(HTMLe)@en[[[s]]]]
- [CODE(HTMLe)@en[[[small]]]]
- [CODE(HTMLe)@en[[[strike]]]]
- [CODE(HTMLe)@en[[[strong]]]]
- [CODE(HTMLe)@en[[[tt]]]]
- [CODE(HTMLe)@en[[[u]]]]
]FIG]

[FIG(corollary)[
[24] [[活性書式付け要素のリスト]]に[[外来要素]]が追加されることはありません。
]FIG]

[6] [[JSON]] 形式の一覧が >>5 にあります。

[REFS[
- [5] [CITE[data-web-defs/elements.txt at master · manakai/data-web-defs]] ([TIME[2014-08-02 06:51:45 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/elements.txt>
]REFS]

;; [7] 将来的にこのリストに含まれる[[要素]]が増えたり減ったりする可能性は低いと思われます。

* ノアの方舟

[8] [[活性書式付け要素のリスト]]に新たに[[要素]]が追加
([DFN[[[push onto the list of active formatting elements]]]])
される際、[DFN[[RUBYB[ノアの方舟]@en[Noah's Ark]]]]条項によるチェックが行われます [SRC[>>1]]。

[9] すなわち、新たに追加する[[要素]]と同じものが既に3つ[[活性書式付け要素のリスト]]に含まれている
([[マーカー]]がある場合、その[[マーカー]]以後に3つ含まれている) 場合には、
最古の[[要素]]をリストから削除します [SRC[>>1]]。

;; [12] [[旧約聖書]]の[[ノアの方舟]]は[[動物]]各[[種]]の雌雄一対ずつが選ばれる話ですが、
[[HTML]] では[[要素]]ごとに3つずつが残されますので、
[RUBYB[[[多妻ノアの方舟]]]@en[polyamorous Noah's Ark]]とも呼ばれます [SRC[>>1, >>13]]。

[10] ここで同じ[[要素]]であるとは、各[[要素]]の元となった[[字句]]の[[タグ名]]と[[属性]]、
それに[[名前空間]]が等しいことをいいます。[[属性]]が同じであるとは、
[[属性名]]と[[属性値]]と[[名前空間]]が等しいことをいいます。
一方のみに設定された[[属性]]があると等しくありません。 [SRC[>>1]]

;; [11] [[構文解析]]の途中で[[スクリプト]]によって[[要素]]が編集されたとしても、
[[構文解析器]]が[[要素]]を作った時点の状態に基づき判断されます。

;;
[15] [[多妻ノアの方舟]]条項は、 [[AAA]] による[[指数的]]な[[要素]]の増殖を防ぐために導入されました
[SRC[>>13, >>14]]。

* 歴史

[REFS[
- [13] [CITE@en[Web Applications 1.0 r5638     Add in some hard-coded limits for dealing with unclosed formatting elements to limit the explosive growth of the list of formatting elements in commonly-seen cases.]] ([TIME[2010-10-16 07:56:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=5637&to=5638>
- [14] [CITE@en[Web Applications 1.0 r8139     Try to mitigate the impact of the Noah's Arc algorithm on the Adoption Agency algorithm]]
( ([TIME[2013-08-13 06:08:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8138&to=8139>
]REFS]

* メモ

[22] 手順6で rewind に戻る例
[CODE[<!DOCTYPE HTML><p><b><i><u></p> <p>X]]

[26] [CITE@en[Editorial: button doesn't insert a marker, template does (#1036) · whatwg/html@f66348e]]
([TIME[2016-04-14 11:43:24 +09:00]] 版)
<https://github.com/whatwg/html/commit/f66348ee863408c1888b0e455bf93317ae632954>