第10章 コメントにも仕様がある
<!-- ... --> の中は、ブラウザが読み飛ばすただのメモ欄——そう思っていませんか。ところが、この一見どうでもいい場所にも、ちゃんと文法があります。書き方しだいでは、コメントのつもりが文書を壊すことすらあります。
この章では、HTML コメントが「ブラウザが読まない自由欄」ではなく、どこで始まりどこで終わるかを文法で決められた構文だと見ます。ゴールは、<!-- ... --> を単なるメモの囲みとしてではなく、パーサーがきちんと解釈しなければならない入力として説明できるようになることです。
前章では、img に閉じタグがないのは空要素という分類の結果だと見ました。この章では、もっと地味なコメントを題材にしても、HTML が見た目以上に文法を持っていることを確かめます。次章では、その文法意識が属性値の省略にどう現れるかを見ます。
10.1 コメントは無制限のメモ欄ではない
HTML コメントは <!-- で始まり --> で終わります。見た目だけを追うと、そのあいだは何を書いても無視される、ただのメモ欄に見えます。
しかしパーサーの立場では、話はそれほど気楽ではありません。どこからどこまでがコメントなのかを判断できなければ、その後ろに続く要素やテキストを正しく読み取れないからです。コメントもまた、HTML の入力の一部として処理される構文です。
ここで重要なのは、「表示されない」ことと「文法を持たない」ことは別だという点です。画面に出ないからといって、好き勝手に壊してよい領域にはなりません。コメントの境界が曖昧になれば、文書全体の解釈まで崩れます。
10.2 終端と衝突する並び
この性質は、コメントの中で使える文字列に制約があることを見ると分かりやすいです。
<!-- ここは通常のコメント -->
<!-- ここで -- を多用すると? -->
コメントは --> で終わるので、内部で -- のような並びをどう扱うかは、最初から無関心ではいられません。コメントの中身がどこで終端と衝突しうるかを決めておかないと、パーサーは「まだコメントの途中なのか」「ここで終わったのか」を安定して判断できません。
たとえば、開発中に要素を一時的に無効化したつもりで、長い HTML 断片を雑にコメントへ押し込む場面を想像してください。書き手は「どうせ表示されない」と思っていても、パーサーは依然として <!-- と --> の境界を追い続けています。だからコメント内部の文字列しだいでは、「どこまでが無効化されたのか」を人間と同じ感覚では読んでくれません。
つまり HTML コメントは、「中に何でも流し込める箱」ではなく、「終端と衝突しないように扱う必要がある構文」です。見た目には目立ちませんが、ここでも HTML は文字列の境界をかなり真面目に扱っています。
余談: かつてコメントは、ただの無視欄どころか分岐の道具として使われていました。
<!--[if IE]> ... <![endif]-->という書き方(条件付きコメント)で、「Internet Explorer のときだけ読み込むスタイルシート」などを切り替えていたのです。他のブラウザにはただのコメントに見えるのに、IE だけは中身を解釈しました。コメントという最も地味な構文が、ブラウザ差を吸収する抜け道になっていた——これは IE 全盛期を象徴する雑学です(IE10 以降は廃止されました)。
10.3 SGML の名残がいまも文法に影を落とす
では、なぜコメントにこうした細かな制約があるのでしょうか。理由の 1 つは、HTML が SGML の影響を受けて出発したからです。SGML は、文書の構造をどう記述するかを決める、HTML より前の世代の大きなマークアップの枠組みだと考えれば十分です。
初期の HTML は、いまの Living Standard だけで完結して生まれたわけではありません。文書構造を記述する仕組みとして、SGML の考え方を引き継いでいました。コメントの扱いにも、その時代の名残が残っています。現在の HTML は独自に整理され直されていますが、コメントを完全な自由欄にしなかった背景には、そうした歴史があります。
ここで大切なのは、「古い名残だから変だ」と切ってしまわないことです。むしろ、文書構造を壊さずに読み続けるためには、コメントのような脇役にさえ境界の規則が必要だった、と読むほうがこの本の筋に合います。前章の空要素と同じで、見た目が素朴でも、その裏には分類や制約があります。
10.4 実務ではコメントを文法の外に置かない
実務では、コメントを「どうせ表示されない領域」と見なして複雑な断片を詰め込みたくなることがあります。とくにテンプレートの途中で一時的に要素を消したり、長い説明を埋め込んだりすると、コメントは安全な退避場所に見えます。
しかし、ここまで見てきたように、コメントは文法の外側にあるわけではありません。HTML の中で処理される構文の 1 つです。だから、コメント内部の書き方しだいでは、パーサーや validator が気にする対象になります。画面がたまたま崩れなくても、入力としては parse error を含んでいることがあります。
この章で覚えるべきなのは、「コメントの細則一覧」ではありません。HTML は、見出しや段落や画像のような目立つ要素だけでなく、コメントのような地味な場所にも境界規則を持っている、という見方です。そう読むと、HTML は雑に許している言語ではなく、許すところと許さないところを選んで設計されている言語だと分かります。
ここまでで、表示されないコメントでさえ文法の一部だと分かりました。次章では、その延長として、属性値を省略できる場面があるのも無秩序な近道ではなく、条件つきの設計だということを見ます。