第10章 コメントにも仕様がある
<!-- ... --> の中は、ブラウザが読み飛ばすただのメモ欄——そう思っていませんか。ところが、この一見どうでもいい場所にも、ちゃんと文法があります。書き方しだいでは、コメントのつもりが文書を壊すことすらあります。
この章では、HTML コメントが「ブラウザが読まない自由欄」ではなく、どこで始まりどこで終わるかを文法で決められた構文だと見ます。
10.1 コメントは無制限のメモ欄ではない
HTML コメントは <!-- で始まり --> で終わります。見た目だけを追うと、そのあいだは何を書いても無視される、ただのメモ欄に見えます。
しかしパーサーの立場では、話はそれほど気楽ではありません。どこからどこまでがコメントなのかを判断できなければ、その後ろに続く要素やテキストを正しく読み取れないからです。コメントもまた、HTML の入力の一部として処理される構文です。
ここで重要なのは、「表示されない」ことと「文法を持たない」ことは別だという点です。画面に出ないからといって、好き勝手に壊してよい領域にはなりません。コメントの境界が曖昧になれば、文書全体の解釈まで崩れます。
10.2 終端と衝突する並び
現行 HTML では、次のコメント内の -- は禁止されていません。
<!-- 前半 -- 後半 -->
一方、コメントを入れ子にすることはできません。
<!-- 外側
<!-- 内側 -->
<p>非表示にしたかった本文</p>
-->
パーサーは内側の --> でコメントを終えます。そのため p はコメントの外に出て、本文として扱われます。著者向けの構文規則も、コメントの内容に <!-- や --> などを含めることを許していません。長い HTML 断片をコメントで囲むなら、すでにコメントを含んでいないか確認が必要です。
「-- が禁止」という説明は、XML のコメントの規則と混ざりやすいところです。XHTML を XML として扱う場合にはその制約がありますが、現行の text/html に同じ禁止を持ち込んではいけません。
歴史の例: Internet Explorer には、
<!--[if IE]> … <![endif]-->のような条件付きコメントがありました。通常の HTML コメントに見える範囲を、IE が条件に応じて解釈する独自機能です。IE10 の標準モードではサポートされなくなりました。現在の HTML の標準機能として使うものではありません。
10.3 SGML の名残がいまも文法に影を落とす
では、なぜコメントにこうした細かな制約があるのでしょうか。理由の 1 つは、HTML が SGML の影響を受けて出発したからです。SGML は、文書の構造をどう記述するかを決める、HTML より前の世代の大きなマークアップの枠組みだと考えれば十分です。
初期の HTML は、いまの Living Standard だけで完結して生まれたわけではありません。文書構造を記述する仕組みとして、SGML の考え方を引き継いでいました。コメントの扱いにも、その時代の名残が残っています。現在の HTML は独自に整理され直されていますが、コメントを完全な自由欄にしなかった背景には、そうした歴史があります。
ここで大切なのは、「古い名残だから変だ」と切ってしまわないことです。むしろ、文書構造を壊さずに読み続けるためには、コメントのような脇役にさえ境界の規則が必要だった、と読むほうがこの本の筋に合います。前章の空要素と同じで、見た目が素朴でも、その裏には分類や制約があります。
10.4 実務ではコメントを文法の外に置かない
実務では、コメントを「どうせ表示されない領域」と見なして複雑な断片を詰め込みたくなることがあります。とくにテンプレートの途中で一時的に要素を消したり、長い説明を埋め込んだりすると、コメントは安全な退避場所に見えます。
しかし、ここまで見てきたように、コメントは文法の外側にあるわけではありません。HTML の中で処理される構文の 1 つです。だから、コメント内部の書き方しだいでは、パーサーや validator が気にする対象になります。画面がたまたま崩れなくても、入力としては parse error を含んでいることがあります。
この章で覚えるべきなのは、「コメントの細則一覧」ではありません。HTML は、見出しや段落や画像のような目立つ要素だけでなく、コメントのような地味な場所にも境界規則を持っている、という見方です。そう読むと、HTML は雑に許している言語ではなく、許すところと許さないところを選んで設計されている言語だと分かります。
ここまでで、表示されないコメントでさえ文法の一部だと分かりました。次章では、その延長として、属性値を省略できる場面があるのも無秩序な近道ではなく、条件つきの設計だということを見ます。