object 要素と W3C 勧告の陥穽

object 要素と W3C 勧告の陥穽(2006-01-30)


<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 の勧告書にそのような記述はない。

仕様への準拠と批判精神(2006-02-01)

ある仕様への準拠を決めたなら、不満はあっても、仕様に従うべきだというのが私の主張です。

仕様に従うといっても2つのレベルがあって、ひとつは DTD に違反しなければいいのだ、と。もうひとつは、仕様が想定しているような要素の使い方、マークアップの仕方をしましょう、と。私は後者の立場だから、真名垣さんの object 要素活用法に眉をひそめるのです。

これは p要素は最小の節 にも書いたことですが、W3C はブロックレベル要素は単体で意味が通じるものであるべきだと云う自説を裏付ける、いかなる説明もしていません。W3C は循環論法や論理の倒錯まで駆使してブロックレベル要素の定義を自然言語の文法と結びつけることを避けています。真名垣さんと W3C とでは、多くの価値観が共有されていないことに注意すべきです。

HTML はこのように進化するべきだ、という提言をすることと、とりあえず現存の仕様に従うことは矛盾しません。仕様に従うのは、窮屈なことです。その窮屈さをテーブルレイアウトをする人には押し付けて、自分は、仕様に反する object 要素の使い方をする、これは疑問です。仕様が否定していない「読点で終了するブロックレベル要素」を気持ち悪いとする感情は、仕様に挑戦する理由として正当なのでしょうか。

大前提
はじめにテキストありき
仮説
テキストをマーク附けする事で、HTML文書ができあがる。

これは野嵜さんの有名な基本方針ですが、たしかにこう考えると HTML はわかりやすい。けれども、W3C の勧告書を検討していくと、この基本方針に反する内容がいくつも見つかります。理解の鍵となる概念の絞り込みは、学習の初期には重要です。しかし少なくとも現在、事実上の標準となっている各種 HTML の仕様は、原則だけでは説明できません。ならば現実に合わせる他ない場面では、原則が通用しない事情を理解していく必要があるでしょう。

これから世に出る新しい仕様は、ぜひ野嵜さんの基本方針に従ってほしい。HTML の仕様は、見通しがよくわかりやすいものが望ましいと思います。しかしそれは遠い未来の話で、「今、どうするか」という問題は別に考えるべきです。

真名垣さんが、普及しているとかそういった理由で他人の作った仕様に準拠するのであれば、仕様と個人的欲求の不整合は、自制によって対処するのが筋だと私はいいたいのです。現時点では、p 要素がブロックレベル要素を包含できる仕様はありません。

object 要素は解決策にならないと私は考えています。はじめにテキストありきの大前提と矛盾するからです。object 要素において、本来、存在するのはオブジェクトであり、テキストはその代替なのです。object 要素は、実質的には空要素です。object 要素の内容は、img 要素の alt 属性値と同じ代替テキストに過ぎません。埋め込むオブジェクトがないのに代替テキストだけを用意するのは、無から有を生む行為です。奇怪といわざるをえません。

W3C の作成した仕様が我慢ならないなら、独自仕様を作って準拠する手も。DTD にはさして文句がないわけだから、解説部分だけ独自に書き直すのです。そして例えばこんな文書型宣言をつけるわけですね。

<!DOCTYPE html PUBLIC "-//managaki//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

凡ゆる要素をobjectとしてマークアップしても何等問題は無い筈だ。「箇条書きのメモを埋め込む」的感覚。

object 要素の内容は埋め込みに失敗した場合の代替テキストであって、埋め込むオブジェクト自体は data 属性などで指定しなければなりません。そして残念なことに、URI で指定できない何か(例えばマークアップされた文字列そのもの)を埋め込む方法は、現状の object 要素の仕様には規定されていません。(私の読み落としでなければ)

object 要素は一見、テキストをオブジェクトとしてマークアップするための要素のようでいて、じつは違います。形式上の擬態ゆえに、野嵜さんの基本方針に賛同・共感する方々の誤解を招きやすい厄介な要素なんです。W3C は(あなたの)理想の代弁者ではない。だから、仕樣は仕樣として尊重する必要はあります。が、仕樣の見直しはあり得る。と心に銘じて、批判精神を忘れてはいけないのだと思います。

私は絶対にtableをレイアウト目的で使用するなとも、何時いかなる時でもblockquoteでマージンを取ってはならないとも、言った覚えはない。問題は、それを妥協として用いる正当な理由があるかどうかと云う点。私がそれらのマークアップを否定する場合は、必ず何か別の理由が存在している。

はじめにテキストありきと云う原則が仕様書の一部分と矛盾するから、ならばと言って即仕様書の決まりを守らなければならない訳でもない。<object>を噛ませるのは、はじめにテキストありきの原則にも仕様が想定しているような要素の使い方、マークアップの仕方をしましょうと云う原則にも反している。だからと言って、どちらかを採ると、最良とは言えない結果になる。だから、私はどちらも採らず、それ以外の妥協案を呈したに過ぎない。

なるほど、当方にいささかの誤解があり、失礼いたしました。

「何をもって妥協するに足る正当な理由とみなすか」が、今後も折々に提起されるであろう問題に取り組む際の争点となるのでしょうね。

object 要素の話題:雑感(2006-02-02)

p要素の中にブロックレベル要素を記述するという発想自体がおかしい」とした理由は、ブロック要素として最小の単位がp要素である、という意見に賛成だから。p要素内のobject要素は内容も含めてインライン要素として扱われるべきであり、そのインライン要素内にブロック要素を置くということは仕様と矛盾してしまうからである。

画像を埋め込むとして、その画像がリストを表す内容だったら、代替えとなる内容がリストになるのは至って自然である。

これは真名垣さんに賛成。

iframe 要素や object 要素は「文書」すら埋め込むことができる、とんでもないインライン要素。もともと無茶な存在なのであって、その代替テキストだけ「インラインの分を守っておしとやかに」といってもしょうがないような……。

まあ、現行の Firefox などの代替テキスト表現が素晴らしいかどうかは別問題だと思いますけど。強いて Firefox を擁護すれば、インライン要素を CSS で display:block; することは否定されていないのだし、といったところなんですかね。

IE6 では object 要素の内容として配置したブロックレベル要素は展開できないと思い込んでいたのですが、見出し要素の中なら展開されるのですね。私にとって、これはかなり衝撃的な発見でした。

そろそろ徒委記にリンク集を作成しないとなあ、と思って見てみると、どなたか有志の方が既に作成されていました。助かりました。

改めて私の主張を簡単にまとめておきます。

p 要素が日本語の「段落」に対応するなんて仕様書には一言も書かれていないわけだから、読点で p 要素を終了すればいい。あらゆる自然言語の文法に対応するのは不可能だから、仕様の中に「見た目依存」の部分を残してある、しかも非常に根本的な部分にそのような性質が取り込まれているのだと思う。

一方、野嵜さんの既に存在するW3Cの仕樣が既に「對應可能」な状態であるのならば「美しくない」「邪道」等と言つた偏見・極附けに固執しないでさつさと考へ方を變へてしまへば良い。という主張は正論なのだけれども、今回の議論に適用する際には注意が必要。

p>object>ul はたしかに DTD では許容範囲だけれども、勧告の本文で object 要素の内容は代替テキストであって、あくまでも埋め込むオブジェクトありきだと示されている。object 要素はテキストをオブジェクトとしてマークアップする要素ではないのだから、埋め込むべきオブジェクトを指定せずに代替テキストだけ書くのは間違い。だから、真名垣さんが示された例は、あくまでも「妥協」であって、仕様がそれを認めていると解するのは間違い。明らかに「問題」はある。

誰もが承認する前提から出發して、その前提に合致するから何うであると結論を出すのなら話は解る。けれども、或結論がある、その結論を出す爲に前提をでつち上げる、と云ふのをこの無名氏はやつてゐる。いわいもさうだが、自分の結論は正しいと盲信してゐる爲に、結論の出し方がおざなりになつてゐるのではないか。

……。object 問題について、「内容にブロックレベル要素を持ってよいかどうか」という論点に関しては、たしかに仕様は認めていることに異論はない。でも「埋め込むオブジェクトを指定せずに代替テキストだけ記述することの是非」という論点に関して、野嵜さんが態度を曖昧にしている理由は、よくわからない。

Information