* スクリプト・マクロ (HTML)
[1] [[HTML]]の[DFN[[RUBYB@en[スクリプト・マクロ][script macro]]]]は、
[[属性値]]の中に[[JavaScript]]の[[式]]を埋め込むことができる機能です。
[4] この機能を導入した[[Netscape]]は、
[DFN[JavaScript[RUBY[実体][じったい]@en[entity]]]]あるいは[DFN[[RUBY[動的実体][どうてきじったい]@en[dynamic entity]]]]と呼んでいました。
[Q[予約]]機能として附属書 (参考) にこれを取り込んだ[[HTML 4]]では、
[DFN[[RUBYB@en[スクリプト・マクロ][script macro]]]]としています。
[2] 仕様書:
- [CITE[Welcome to Netscape Navigator Beta Release 5]]
- [[HTML 4]]
-- [CSECTION@en[B.7.1 Reserved syntax for future script macros]]
- [[XSLT 1]]
-- [CSECTION@en[16.2 HTML Output Method]]
[[#comment]]
** 構文
[5]
[PRE[
attribute = "... &{ [VAR[macro body]] }; ... "
]PRE]
のように、[[属性]]の[[値]]の中で[CODE(HTML)[&{]]からはじまり、
[CODE(HTML)[};]]で終わる部分が[[スクリプト・マクロ]]として解釈されます。
囲まれた部分を[[HTML 4]]は[DFN[[RUBYB[マクロ本体]@en[macro body]]]]と呼んでいます。
[6]
[[Netscape]]は、[[文字実体参照]]が[[文字]]に展開されるように、
[[JavaScript実体]]は[[JavaScript]][[式]]の[[評価]]結果に展開されるとしています。
1文字目の[CODE(HTML)@en[&]]を[CODE(HTML)@en[&[[amp]];]]に置き返ると、
[[JavaScript実体]]では''なく''、[[文字列]]とみなされます。
@@ [[SGML]]のような[[属性値]]と[[属性値指定]]の区別
([[引用符]]の有無による差異) はない?
[7]
一方で[[HTML 4]]は[Q@en[Current Practice]]をこう説明しています。
= まず、[[SGML]][[構文解析器]]が[[SGML]][[実体参照]]を[[展開]]します。
= 次に、[[スクリプト・マクロ]]の[[マクロ本体]]を[[スクリプト機関]]が1つ以上の[[文]]として[[評価]]します。
[[スクリプト言語]]は[[内在事象属性]]と同じです。
= 得られた[[文字列]]を以後の処理に使います。
[8]
無理に[[SGML]]として処理しようとしている点、
[[マクロ本体]]を[[式]]ではなく[[文]]としている点、
[[マクロ本体]]の言語を[CODE(HTTP)@en[[[Content-Script-Type]]]]によって変更可能にしている点が[[Netscape]]の説明と食い違っており、
いったいどこの[Q@en[Current Practice]]なのかが気になるところです。
特に[[SGML]]としての処理の部分は、[[文字実体参照]]の扱いが[[Netscape]]の実装と大きく異なっており、
[[HTML 4]]の通りに処理されるなら[[スクリプト・マクロ]]と同じように見える文字列を[[HTML]]として記述することができなくなってしまいます。
;; [CODE(example JS)@en[&{'&{}'+';'};]]という方法がありますが、
[[スクリプト]]が無効だと機能しません。
[10] [[HTML 4]]は、[[スクリプト・マクロ]]が有効なのを[CODE(SGML)@en[[[CDATA]]]][[属性]]のみとしています。
一方[[Netscape]]の説明と実装にはそのような制限は見当たりません。
[11]
この[[スクリプト・マクロ]]が[[評価]]される時機について、
[[Netscape]]は[Q[[[属性値]]が計算される時]]としています。
[[HTML 4]]は更に明確に、[Q[[[文書]]が読込まれる時で、[[再描画]]の時には''しない'']]としています。
[[#comment]]
** XSLTとの関係
[18] [[XSLT 1.0]]および[[XSLT 1.1]]の[[HTML出力方式]]では、
[[属性]]の[[値]]において[CODE(HTML)[&{]]は[[逃避]]するべきではないとされています。
;; [[HTML 4]]を見よとは書かれていますが、
閉じ[CODE(HTML)[};]]との対応や[CODE(SGML)@en[[[CDATA]]]][[属性]]か否かのチェックをせよという規定は''ありません''。
;; [[べき]] ([[should]]) の定義はありません。
[20]
@@XPath 2.0/XQuery 1.0/XSLT 2.0: 現在の案では、
[[XSLT 1]]と同じ、ただし[[MUST NOT]]
[[#comment]]
** 関連
[21] '''SGMLとの関係''':
[[HTML 4]]では[[SGML]][[応用]]であるために[[SGML]]としての[[属性]]の[[値]]を更に処理するとしています。
[[Netscape]]が説明・実装している[[動的実体]]は[[SGML]]に相当するものがなく苦肉の策なのでしょうが、
実装と乖離したものを標準化しようとしても意味がありません。
[24] '''DOMとの関係''':
[[DOM]]との関係は明らかではありません。
[[Netscape]]の[[DOM水準0]]では、評価後の値が使われているものと思われます。
(ただし、[[Classic Mozilla]]には[[文書木]]そのものの[[DOM]]表現が存在していません。)
@@ 要確認
[25]
[[W3C]]の[[DOM]]仕様には言及がありませんが、
[[文書]]の読込み時に[[評価]]される (>>11) ことから、
[[DOM]]内には[[評価]]結果の[[文字列]]が[[属性]]の[[値]]として残ると思われます。
[27] '''XHTMLとの関係''':
[[HTML 4]]と[[XHTML 1]]の関係は全体的に不明瞭ですが、
[[スクリプト・マクロ]]が[[XHTML 1]]では使えないとする積極的な根拠はありません。
[[#comment]]
** 歴史
[22] この機能は[[Netscape Navigator]] 3.0β5 で実装されたようです。
[23] [[HTML 4]]では標準の機能としては取り込まれませんでしたが、
附属書B (参考) で[Q[[[予約]]]]の機能として紹介されています。
[[HTML 4]]の[[DTD]]では[[WinIE]]の拡張の[CODE(HTMLa)@en[[[data[VAR[*]]]]]][[属性]]群が[Q[[[予約]]]]として取り込まれているので、
[[Microsoft]]と[[Netscape]]の政治的取引の結果かもしれません。
[26]
[[Classic Mozilla]]に代わる[[Gecko]]では[[スクリプト・マクロ]]は実装されていません。
他の[[Webブラウザ]]で実装したものも存在しないようです。
[[HTML 5]]にも[[スクリプト・マクロ]]が入ることはないでしょう。
ゾンビが1匹生まれようとしている (>>20) のを除いては、
このまま忘れ去られていくのでしょう。
[[#comment]]
** 例
[9] ([[JavaScript]]) [SRC@en[Netscape]]
[PRE(HTML obsoleted example code)[
"&{10 * 10};%"
]PRE]
[[評価]]されて[CODE(HTML)[100%]]になります。
[12] '''背景色を無作為に選ぶ''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
]PRE]
既に[[変数]][VAR@en(JS)[randomrgb]]に値が入れられているものと思われます。
[13] '''背景色を時刻で変化''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
]PRE]
[14] '''クライアント側画像写像の範囲とリンク先''' ([[JavaScript]])
[SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
]PRE]
[15] '''環境依存の画像幅''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
]PRE]
[16] ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
widget
]PRE]
[17] '''文字実体参照を含む例''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
]PRE]
[19] '''XSLTの変換例''' [SRC@en[XSLT 1.0, 1.1]]
[[XSLT]][[スタイル・シート]]で
[PRE(XSLT example code)[
]PRE]
とあるものを[[HTML出力方式]]で[[直列化]]すると、
[PRE(HTML example code)[
]PRE]
になります。
[[#comment]]
** メモ
@@ テストが必要:
- 引用符 ", ', なし
- &{ };
- マクロ本体中の文字参照
- Content-Script-Type
- 文; 文;
- 非 CDATA 属性
[[#comment]]
* メモ