趣味Web 小説 2006-01-30

object 要素と W3C 勧告の陥穽


<p>遠足の必需品は、達人、遠足太郎氏によれば、

<object>
<blockquote>
<p>お弁当、おやつ、遠足のしおり、リュックサック</p>
</blockquote>
</object>

だそうである。</p>

あるブロックレベル要素を一つのobject要素として看做すのは可能だと私は考えているので、上記の様な例を用いるのも良いと思う(実際に私も用いている)。最初の一行目を<p>遠足の必需品は、達人、遠足太郎氏によれば、</p>として終らせてしまうのも気持ちが悪いし、かと言って明確な意味付けが出来ないdiv要素を用いるのも気持ちが悪い。よって、先ずはっきりと段落として意味付けられる<p>タグでマークアップして、引用文は<blockquote>タグ、更にそれを<object>タグでマークアップするのが妥当だと思う。

object要素がブロックレベル要素を含み得る事と、必須の属性が存在しない事があまり知られていないが為に、使用している人を滅多にみない方法だが、私は良く使っている。

真名垣さんの主張を「間違い」と断言するには根拠薄弱ながら、私が「感心しない」理由なら挙げられます。

そもそも object 要素の内容は、オブジェクトを埋め込むことができなかった場合の代替テキストに過ぎない、と私は理解しています。

img 要素もそうなのですが、じつは W3C の勧告している HTML の仕様は、「まずテキストがあって、それをマークアップしていく」という原則に忠実ではありません。その証拠に、HTML4.01 の勧告書には以下に引用する事例が示されています

<P><OBJECT classid="http://www.miamachina.it/analogclock.py">
<PARAM name="height" value="40" valuetype="data">
<PARAM name="width" value="40" valuetype="data">
This user agent cannot render Python applications.
</OBJECT>

引用者が強調した部分の大意は「Python アプリケーションを表示できません」というもの。最初にテキストありきではないからこそ、こうした言葉が出てくるのです。object 要素は、テキストをオブジェクトで置き換えるという性質の要素ではなくて、あくまでも埋め込みありきの要素なのです。

そのことに不満を持つのは自由ですが、DTD に違反しなければいいんだみたいな「なんちゃって Valid さん(例えば、いわゆる div 厨)」に対して「いかがなものか」という立場をとるならば、最初から何も埋め込む気がないのに object 要素を使うのはおかしいのではないか。

object 要素に必須属性がないのは、実用上の問題でしょう。オブジェクトの埋め込みに関するワーキングドラフトに示された様々な事例を見れば、いかなる属性も必須にはできない理由が伺えます。汎用性を追求するため、いかなる属性を必須にすることもできかねたのです。「任意属性しかないので、ひとつも属性を指定せず、何も埋め込まないでいいのだ」という推論は、誤りだと思う。

したがって、仮に object 要素を使う場合、私ならこう書きますね。

<p>遠足の必需品は、達人、遠足太郎氏によれば、<object data="http://deztec.jp/x/06/01/img/object01.html" style="display:block; width:100%; height:2em;"><q>お弁当、おやつ、遠足のしおり、リュックサック</q></object>だそうである。</p>

遠足の必需品は、達人、遠足太郎氏によれば、お弁当、おやつ、遠足のしおり、リュックサックだそうである。

代替テキストをインライン要素の q 要素でマークアップしているのは、HTML4.01 の勧告書の中に代替テキストの一部を em 要素としてマークアップしている事例があるため。

ちなみにワーキングドラフトには代替テキストを p 要素としてマークアップしている事例が登場しますが、それも <P>You're missing a really cool poem viewer ... という内容。オブジェクト(ここでは“詩”)の埋め込みに失敗したことを伝えるメッセージに過ぎません。

ともあれ object 要素の代替テキストをブロックレベル要素でマークアップすること自体に私は異論を持ちません。IE がブロックレベルの代替テキスト表示に対応していない状況あえて無視することも、「仕様に準拠しておけばブラウザの機能は後で追いつくのだから、理想的なマークアップに躊躇する必要はない」といった考え方において、納得できないものではない。

しかしながら、真名垣さんの object 要素活用法は、W3C 勧告の意図に反している疑いが濃厚だと思う。DTD には違反しないとはいえ、何も埋め込まずに代替要素のみ示す事例は、勧告書にもワーキングドラフトにも見つかりません。だから、私は感心しないのです。

2年余り前の文書です。内容もないのに長大なのですが、じつは話を単純化するために避けているテーマがあります。それは、br 要素と pre 要素の解釈です。

上記リンク先の文書において、私は「マークアップ前のテキストにおける改行=ブロックレベル要素の境界」と主張しているのですが、そうなると br 要素と pre 要素って何? ということになります。

HTML の仕様は各種言語の文法に依存しないよう作られていて、だから日本語における「段落」の概念を p 要素に仮託するのは「思い込み」のようなものに過ぎない……という本旨は、やはり間違っていないと思いますが、だからといって単純明快に「改行=ブロックレベル要素境界」と割り切れるのか。それはつらくないだろうか、という疑問は拭えません。

様々な状況が想定される中で、br 要素と pre 要素は「仕様の遊び(=余裕)」として存在意義が与えられているのではないか、と私は思うのです。こう考えると、どのようなテキストの集合体をブロックレベル要素として扱うべきかを一言も書かず、ブロックレベル要素の中にはブロックレベル要素を配置できるという循環論法と、ブロックレベル要素は行を改めて描画されるという転倒した説明だけが用意された W3C 勧告の奇妙さも腑に落ちます。W3C は、ブロックレベル要素の定義を、あえて曖昧にしたのではないか。

したがって、

遠足の必需品は、達人、遠足太郎氏によれば、
お弁当、おやつ、遠足のしおり、リュックサック
だそうである。

というテキストのマークアップには、様々な正解がありえると思う。

<p>遠足の必需品は、達人、遠足太郎氏によれば、
<q>お弁当、おやつ、遠足のしおり、リュックサック</q>
だそうである。</p>

<p>遠足の必需品は、達人、遠足太郎氏によれば、<br>
<q>お弁当、おやつ、遠足のしおり、リュックサック</q><br>
だそうである。</p>

<p>遠足の必需品は、達人、遠足太郎氏によれば、</p>
<blockquote><p>お弁当、おやつ、遠足のしおり、リュックサック</p></blockquote>
<p>だそうである。</p>

3例挙げましたが、どれでもいいのではないかな。そして子要素の制限に注意しつつ pre 要素を用いてマークアップすれば以下の通り。これこそ、ほとんど誰もやらないマークアップだと思うけれど、ありかなしかといえば、ありなんじゃないかと。

<pre>遠足の必需品は、達人、遠足太郎氏によれば、
<q>お弁当、おやつ、遠足のしおり、リュックサック</q>
だそうである。</pre>

真名垣さんの object 要素活用法がこれらと異なるのは、いわば仕様の抜け穴を突いた方法に過ぎず、object 要素の利用自体に疑問符がつく点です。

元のテキストの改行に、マークアップするだけの価値を見出さないのは自由だし、逆に br 要素としてマークアップするのも OK でしょう。改行をブロック要素の境界とみなしたり、元テキストの改行を神聖視して整形済みテキストと考えるのも悪くない。

しかし、オブジェクトを埋め込む予定がないのに object 要素を持ち込み、最初から存在する文章を、埋め込みに失敗した場合の代替テキストとしてマークアップするのはおかしいでしょう。少なくとも、私は違和感を覚えます。object 要素が、テキストをオブジェクトで置き換える要素ならいいのですが、W3C の勧告書にそのような記述はない。

Information

注意書き