* スクリプト・マクロ (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)[ banner ]PRE] [16] ([[JavaScript]]) [SRC@en[HTML 4]] [PRE(HTML deprecated obsoleted example code)[ widget logo ]PRE] [17] '''文字実体参照を含む例''' ([[JavaScript]]) [SRC@en[HTML 4]] [PRE(HTML deprecated obsoleted example code)[ logo ]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]] * メモ