マーク区間

この文書の最新版は「鳩丸よもやま話 : マーク区間とは」に移転しています。以下の文章は古くなっているかも知れません。

マーク区間とは

SGML には、マーク区間(marked section の訳語、マーク指定区域とも言います)という便利な仕組みがあります。まず、ルールをざっと説明しましょう。

マーク区間は、"<![" で始まり、キーワード(状態見出し語)、"[" 、内容、"]]>" という形で構成されます。そこで指定されるキーワードによって内容の扱いが変わります。

<![INCLUDE[
<P>この部分は INCLUDE ……表示/解釈されます。</P>
]]>

キーワード "INCLUDE" は、その部分が「含まれる」、すなわち普通に表示されたり解釈されたりすることを意味します。

<![IGNORE[
<P>この部分は IGNORE ……無視されます。</P>
]]>

キーワード "IGNORE" では、区間内は無視されます。

<![CDATA[
この部分は CDATA として扱われ、
< や > はタグの区切り子としては解釈されません。
&amp; なんて書くとそのまま &amp; と表示されますし、
<!--この部分もしっかり表示されます。-->
]]>

キーワード "CDATA" では、区間内は CDATA として扱われます。マーク区間終了区切り子 "]]" を除く全ての文字はデータとして扱われます。

同様に、キーワード "RCDATA" を用いると、区域内を RCDATA として扱います。

キーワード "TEMP" は、その区間を一時的なものとします。扱いは INCLUDE と同じです。

よく使われるのは、INCLUDE と IGNORE です。XML では CDATA型の内容をもつ要素が使えないことになっているので、CDATA も割と良く使われるようです。

マーク区間の使い方

マーク区間は、うまく使うと非常に便利なものです。たとえばこのように……。

<!ENTITY % test.section "INCLUDE">

……

<![%test.section;[
<H1>テスト区間</H1>
<P>テスト区間です。とりあえず表示はされる予定です。</P>
<P>INCLUDE を IGNORE に変えれば無視されます。</P>
]]>

……

<![%test.section;[
<H1>テスト区間再び</H1>
<P>またテスト区間です。とりあえず表示はされる予定です。</P>
]]>

パラメータ実体を使っておくと、先頭行の "INCLUDE" を "IGNORE" に書き換えるだけで、複数の箇所を一度に無効にできます。有効/無効の切り替えが簡単にできるわけです。もう少し複雑な例だと、こんなのがあります。

<!ENTITY % foo.deprecated "IGNORE">
<![%foo.deprecated;[
<!ENTITY % foo.recommended "IGNORE">
]]>

<!ENTITY % foo.recommended "INCLUDE">

……共通部分……

<![%foo.recommended;[
この部分は厳格な推奨仕様
]]>

<![%foo.deprecated;[
この部分は非推奨仕様
]]>

……共通部分……

最初の行で foo.deprecated が IGNORE とされているため、次のマーク区間は無視され、その次の宣言で foo.recommended が INCLUDE とされます。よって、以下 foo.recommended の部分は含まれ、foo.deprecated の部分は無視されます。

最初の行の IGNORE を INCLUDE とすると、次のマーク区間が有効となり、foo.recommended は IGNORE とされます。次の宣言は無視されませんが、先の宣言と重なるため無効です。よって、最初の場合と比べて、ちょうど INCLUDE と IGNORE が正反対になります。

このような手法は DTD の中でよく見かけるものですが、文書インスタンス(本文)の中でも使うことが出来ます。いや、これは面白そうです……。

マーク区間は使うべきか

しかし、残念なことに、現実にはマーク区間を理解してくれるブラウザは皆無です。間抜けなことに、ブラウザはマーク区間を単なるタグとみなして、訳の分からない表示をしたります。

一番最初の INCLUDE の例文を、あなたのブラウザはどのように表示するでしょうか?

この部分は INCLUDE ……表示/解釈されます。

]]>

……どうでしょうか。]]> が表示されているとしたら、それはあなたのブラウザが正しく HTML を解釈できていないということです。 上記の例では、おそらくほとんどの人が ]]> を見ているでしょう。ですから、HTML 文書にはこんな小細工をしないようにした方が賢明です。


マニアックな文法論議

HTML鳩丸倶楽部

水無月ばけら, MINAZUKI Bakera
E-mail: bakera@star.email.ne.jp