[1] HTMLのスクリプト・マクロは、 属性値の中にJavaScriptの式を埋め込むことができる機能です。
[4] この機能を導入したNetscapeは、
JavaScript実体あるいは動的実体と呼んでいました。
予約
機能として附属書 (参考) にこれを取り込んだHTML 4では、
スクリプト・マクロとしています。
[2] 仕様書:
attribute = "... &{ macro body }; ... "のように、属性の値の中で
&{
からはじまり、
};
で終わる部分がスクリプト・マクロとして解釈されます。
囲まれた部分をHTML 4はマクロ本体と呼んでいます。[6]
Netscapeは、文字実体参照が文字に展開されるように、
JavaScript実体はJavaScript式の評価結果に展開されるとしています。
1文字目の&
を&
に置き返ると、
JavaScript実体ではなく、文字列とみなされます。
[7]
一方でHTML 4はCurrent Practice
をこう説明しています。
[8]
無理にSGMLとして処理しようとしている点、
マクロ本体を式ではなく文としている点、
マクロ本体の言語をContent-Script-Type
によって変更可能にしている点がNetscapeの説明と食い違っており、
いったいどこのCurrent Practice
なのかが気になるところです。
特にSGMLとしての処理の部分は、文字実体参照の扱いがNetscapeの実装と大きく異なっており、 HTML 4の通りに処理されるならスクリプト・マクロと同じように見える文字列をHTMLとして記述することができなくなってしまいます。
[10] HTML 4は、スクリプト・マクロが有効なのをCDATA
属性のみとしています。
一方Netscapeの説明と実装にはそのような制限は見当たりません。
[11]
このスクリプト・マクロが評価される時機について、
Netscapeは属性値が計算される時
としています。
HTML 4は更に明確に、文書が読込まれる時で、再描画の時にはしない
としています。
[18] XSLT 1.0およびXSLT 1.1のHTML出力方式では、
属性の値において&{
は逃避するべきではないとされています。
[28] 現在のWebアプリケーションなどでは、現存する Webブラウザで依然スクリプト・マクロを実装しているものは無いので、 ユーザー入力などにスクリプト・マクロとして解釈し得る文字列が含まれていてもそのまま出力することが多々あります。 古い利用者エージェントでそのような Webアプリケーションを利用すると XSS の類の攻撃が成功することもあります。
[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では使えないとする積極的な根拠はありません。
[22] この機能はNetscape Navigator 3.0β5 で実装されたようです。
[30] Welcome to Netscape Navigator 3.0, , https://web.archive.org/web/20020630200918/http://wp.netscape.com/eng/mozilla/3.0/relnotes/windows-3.0.html#Layout
[29] null, , https://web.archive.org/web/20010208103254/http://home.netscape.com/eng/mozilla/3.0/handbook/javascript/getstart.htm#996824
JS 1.1
[23] HTML 4では標準の機能としては取り込まれませんでしたが、
附属書B (参考) で予約
の機能として紹介されています。
HTML 4のDTDではWinIEの拡張のdata*
属性群が予約
として取り込まれているので、
MicrosoftとNetscapeの政治的取引の結果かもしれません。
[26] Classic Mozillaに代わるGeckoではスクリプト・マクロは実装されていません。 他のWebブラウザで実装したものも存在しないようです。 HTML 5にもスクリプト・マクロが入ることはないでしょう。 ゾンビが1匹生まれようとしている (>>20) のを除いては、 このまま忘れ去られていくのでしょう。
[9] (JavaScript) Netscape
"&{10 * 10};%"
[12] 背景色を無作為に選ぶ (JavaScript) HTML 4
<BODY bgcolor='&{randomrgb};'>
既に変数randomrgbに値が入れられているものと思われます。
[13] 背景色を時刻で変化 (JavaScript) HTML 4
<BODY bgcolor='&{if(Date.getHours > 18)...};'>
[14] クライアント側画像写像の範囲とリンク先 (JavaScript) HTML 4
<MAP NAME=foo> <AREA shape="rect" coords="&{myrect(imageuri)};" href="&{myuri};" alt=""> </MAP>
[15] 環境依存の画像幅 (JavaScript) HTML 4
<IMG src="bar.gif" width='&{document.banner.width/2};' height='50%' alt="banner">
[16] (JavaScript) HTML 4
<SCRIPT type="text/javascript"> function manufacturer(widget) { ... } function location(manufacturer) { ... } function logo(manufacturer) { ... } </SCRIPT> <A href='&{location(manufacturer("widget"))};'>widget</A> <IMG src='&{logo(manufacturer("widget"))};' alt="logo">
[17] 文字実体参照を含む例 (JavaScript) HTML 4
<IMG src="&{logo(manufacturer("widget"))};" alt="logo">
[19] XSLTの変換例 XSLT 1.0, 1.1
<BODY bgcolor='&{{randomrbg}};'>とあるものをHTML出力方式で直列化すると、
<BODY bgcolor='&{randomrbg};'>になります。
[3] XSLT and XQuery Serialization 3.1 () https://www.w3.org/TR/2017/REC-xslt-xquery-serialization-31-20170321/#HTML_ATTRIBS
&{'&{}'+';'};
という方法がありますが、 スクリプトが無効だと機能しません。