この文書の最新版は「鳩丸よもやま話 : SGMLの注釈宣言」に移転しています。以下の文章は古くなっているかも知れません。
マーク宣言の中にはコメントを書くことが出来ます。これは SGML を解釈する上では完全に無視されます。DTD や SGML宣言の中に解説を入れておくことで、見通しの良い宣言文になるわけです。
コメントはコメント区切り子 COM によって表現されます。通常、COM は -- という文字列です。コメントの開始と終了は、どちらもこの区切り子によって表されます。
基本的に、マーク宣言の中で空白文字の出現が許されている所にはコメントを挿入することが出来ます。たとえば、
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
というおなじみの文書型宣言には、
<!DOCTYPE --comment1-- HTML --comment2-- PUBLIC --comment3-- "-//W3C//DTD HTML 4.01//EN" --comment4-->
と、四ヶ所にコメントを挿入することが可能です。
もっとも、SGMLの文法として正しいからと言って、コメントが常に正しく解釈されるとは限りません。たとえば、ある文法チェッカは、上記のようなコメント入りの文書型宣言をうまく認識できません。HTML の文書型宣言にコメントなどを入れるべきではないでしょう。
良くあるのは、
<!ELEMENT BAKERA - - (%flow;)* -- comments -->
のように、DTD の要素宣言や属性宣言の中に書かれたコメントです。これで、どんなものを宣言しているのかを書き留めておくわけですね。
なお、コメントの中には < > & などの文字をそのまま記すことが出来ます。コメント中にこれらが現れても、SGML のマークとはみなされず、単なるコメントの一部として解釈されます。
基本的に、コメントというものはマーク宣言の中でしか有効ではありません。たとえば、HTML 文書の地の文として -- コメント -- などと書いたとしても、これはそのまま表示されてしまいます。
文書中にコメントを入れるためには、注釈宣言というものを使います。これは通常、以下のような形をしています。
<!-- comments -->
マーク宣言の姿をしていますが、意味のある宣言ではなく、コメントだけが含まれています。コメントは無視されますから、宣言内容は空っぽだということになります。ですから何の効果も持ちません。
HTML文書中に意味のあるマーク宣言を書き込むわけには行きませんから、意味を持たない空っぽの宣言を使って、コメントを書き込むことになるわけです。
なお、注釈宣言はマーク宣言の一種であってタグではありませんので、これを「コメントタグ」などと呼ぶと意味が通じません。
※IE独自拡張の <comment> というタグはあるようです。
注釈宣言はコメントだけで構成されていなければなりません。意味ある宣言はパーサーを混乱させます。
以下のような例は正しいコメントです。
<!--コメント--> <!--コメントの後ろに空白-- > <!--複数行にま- たがる- コメント--> <!--複数の-- --コメント-- --です--> <!--<SAMP>タグのコメントアウトもできます。</SAMP>-->
それぞれのコメントの後ろには空白や改行の挿入が許されます。もちろん、コメントの中身に空白が含まれていても構いませんし、< > などもそのまま入れられます。また、一つの注釈宣言は複数のコメントを持つことが出来ます。
コメントの中身が空だったり、コメントの数が零でも構いませんので、以下のようなものも正しいコメントです。
<!----> <!--------------------> <!-- -- > <!>
ただし、<!
とコメントとの間に空白を挿入することは許されていません。<!
の後ろには、ただちにコメントもしくは >
が出現しなくてはなりません。
空白が入ったりすると、<! がマーク宣言開始区切り子とみなされなくなります。これは他のマーク宣言でも同様で、たとえば <! DOCTYPE ……
のように空白を入れてはいけません。また、当然ながら < と ! の間にも空白は許されません。
そんなわけで、以下のようなものは誤りです。
<! --コメント-- > <! --改行してからコメント--> <! >
いずれも、よけいな空白や改行が入ってしまっています。
注釈宣言を良く理解していないためか、コメントのつもりで変なものを書いている例が結構あります。
コメントのつもりで謎の文字列を書いてしまっている人がいます。たとえば、以下のように。
<!コメントのつもり> <!-ハイフンが足りないよ!-> <!->
これらにはそもそもコメント区切り子 --
がないので、<!
と >
の間は注釈宣言とはみなされません。
また、
<!test> <![適当な文字]>
のようなものは、<! がマーク宣言開始区切り子とみなされるものの、謎の文字列が現れるために宣言として解釈することが出来ません。要するに不正なマーク宣言とみなされます。
もっとも、たいていの WWW ブラウザはまともな SGML の構文解釈が出来ないので、単に <! 〜 > の間を無視します。その結果として、これらはコメントのように振る舞うかも知れません。
注釈宣言の中には複数のコメントを入れることが出来ます。ところが、単に <!--
と >
の中が無視されると思っている人がいるらしく、閉じないコメントを書いている例があります。
<!--コメント開始……> 地の文? ……
これがどういうふうに構文解釈されるのか、考えてみましょう。
まず、<!
があります。後ろは -- ですから、これはマーク宣言開始区切り子とみなされ、以降がマーク宣言であるとみなされます。続いて --
がコメント区切り子です。以降はコメントとなります。
さて、ここで重要なのは、コメントの中には < や > をそのまま書くことが出来て、それらは SGML のマークとは解釈されないということです。コメントの中で解釈されるのは、コメント終了を示すコメント区切り子 -- だけです。
つまり、-- 以降、-- が現れるまでがコメントとみなされ、無視されることになります。
ここで上記の例に戻りますと、コメント区切り子 -- によってコメントが開始され、そのあとに > が出現していますが、これはマーク宣言終了区切り子とはみなされません。単なるコメントの一部とみなされます。-- が現れてコメントが閉じられるまで、> などは区切り子として機能しないのです。
結局、最後まで -- が出てこなければ、最後までコメントとみなされ、無視されることになります。
以下の例を見れば、一目瞭然でしょう。
<!--あいたっ (>_<)-- >
これは正しい注釈宣言で、全てコメントとして無視されます。-- が出てきたところでコメントが終わり、そのあとの > で宣言が閉じます。
もっとも、WWW ブラウザの中には、> の直前でコメントが終了すると判断してくれるものもあります(親切のつもりだろうけどよけいなお世話)。そして、正しいコメントをうまくコメントアウトできなかったりします。たとえば、
ぶった<!--あいたっ (>_<)-- >ぶたれた
と書かれているとき、あなたのブラウザはこれをうまく処理できるでしょうか。
ぶったぶたれた、となればいいのですが、 "_<)-- >
" を表示してしまうブラウザが数多く存在します。不正なコメントに対する救済措置が裏目に出ているのです。
今の例に似ていますが、むやみにハイフンを書いている例があります。以下のようなものです。
<!---------------------->
ハイフンを数えると 22 個あります。これは、空のコメントが五つあって、その後ろにコメント区切り子があるということですから、最後の > はコメントで、区切り子ではありません。以降がずっとコメントとみなされます。
また、このような例もあります。
<!--コメントの中に--が入ると-->
これも似たようなものです。「が入ると」という文字列はコメントではなく、不正なマーク宣言となります。そのあとにまたコメントが開始していますので、> はコメントとみなされ、以降ずっとコメントとみなされてしまいます。
<!---ハイフン三つ-->
これは正しいコメントです。コメント区切り子の後ろに余分なハイフンが一つありますが、これは区切り子ではなくコメントとみなされますから問題ありません。ただし、以下のようにしてしまうと……。
<!---ハイフン三つずつ--->
後ろのハイフン三つは、前半の二つでコメント区切り子とみなされます。そこでコメントは終わりますから、最後のハイフンはコメントではありません。不正なマーク宣言です。
結局、コメントは <!--コメント-->
の形にしておくのが無難でしょう。迂闊にハイフンをたくさん入れると、とんでもない結果を招きます。もっとも、<!-- --> の内側に、空白などで区切って、連続しない - を入れるのは可です。
また、ソースに区切り線を入れたいときには、<!---- ---- ---- ---- ---->
のようなものよりも、<!--============================-->
のようなものを使うと良いでしょう。
もちろん、<!コメント>
というようなものを使ってはいけません。