あらかじめ言っておきますと、この本はまあそんなに悪くはないのです。ただ、自らの正しさに絶対不動の自信を持っているらしく、妙に高圧的な言動が目立ちます。それはそれで良いのですが、「その割には……」というところが多いのです。ですから、判定も厳しくなりがちです。
なお、この本については、Another HTML-lintの k16さんや、仕様書邦訳計画の内田さんなども面白い感想を述べられていますので、あわせてご覧になってみて下さい。
この本はこんな書き出しで始まります。
本書はHTMLのエレメントリファレンスだ。エレメントとは世間でタグと通称しているアレである──タグは間違いなのでエレメントと呼んで欲しい、と HTML の仕様書原文にも注意書きがあるので、本書はことさらエレメントと呼ぶ。
「タグは間違い、エレメントだ」──いきなりアクセル全開ですね。さて、HTML の仕様書原文にも注意書きがある
とのことですが、これは仕様書3.2.1のこの部分のことでしょう。
Elements are not tags. Some people refer to elements as tags (e.g., "the P tag"). Remember that the element is one thing, and the tag (be it start or end tag) is another. For instance, the HEAD element is always present, even though both start and end HEAD tags may be missing in the markup.
読めば分かると思いますが、タグは間違いなのでエレメントと呼んで欲しい、なんてことはどこにも書いてありません。the element is one thing, and the tag is another.
と書いてあるとおり、タグとエレメント(要素)は違うのものだと言っているのです。それを曲解して、この本は何でもかんでもエレメントと呼びます。タグとエレメントとを、見事にごっちゃにしているのです。ですから、文書の始めと終わりにHTMLエレメントを書くなどという謎の表現が出てきます。
さらに言えば、この本、中身(contents)のことを要素と呼んでしまっています。エレメントと要素。ものすごく混乱します。
その他にも、この本の用語はめちゃくちゃです。このめちゃくちゃさ加減については、内田さんの感想が良くまとまっていると思いますので、興味のある方はそちらをご覧下さい。
でも、実際にHTMLを書き出してから、「あれはなんだっけ」と手にするのは絶対にこの本だと断言する。
私はこの本を持っていますが、アレはなんだっけと思ったときにこの本を手にしたりはしません。W3C の仕様書についているリファレンスを見ます。正確な上に早いものですから。
HTMLには次のバージョンがある。
- HTML2.0 95年 9月 21日 公布
- HTML3.2 97年 1月 14日 公布
- HTML4.0 97年 12月 18日 公布
ここで二つの疑問を持つようなら、知っているようであいまいな中途半端な知識を持っていたということだ。一つはHTML3.0がリストに欠けているのではないかという点。そしてHTML4.0の公布日が意外に最近であるという点だ。
うーん、RFC2070 でもって 97年 1月に公布されたはずの HTML2.x(HTMLi18n) がリストに欠けているのではないか? という疑問は持ってはいけなかったのでしょうか。HTML2.x が破棄されたという話は聞いたことがないのですが……。
XHTML1.0 や HTML4.01 がないのは、この本が出た当時それらがまだ存在していなかったからで、これは全く問題ありませんが。
※ RFC2070 は 2000年6月、RFC2854 によって破棄されました。RFC1866も同時に破棄されています。
仮に「HTML4.0にしか対応していないブラウザ」が存在したとすると、世界中のWebページの多くは、まともに表示されない(書き手が考えたデザインが再現されない)だろう。逆に厳格なHTML4.0で書かれたページは、世界中の誰からもまともに表示できない。
このページも HTML4.0 Strict (と言うか HTML4.01 Strict) ですが、まともに表示されていないのでしょうか。そもそも、こういう発言は「HTMLは見た目を規定しない」という主張に真っ向から反していると思うのですが……。
省略できるものは省くという思想は嫌いではないが、以下はHTMLがHTMLであるための基本エレメントだ。だから次に示すエレメントだけは必ず書こう。
「エレメントを書く」というのも謎ですが、「必ず書こう」とはいったい何のことを言っているのでしょうか。HTML も HEAD も BODY もタグは省略できますが、タグを省略してもエレメントは厳然と存在しているのです。書こうもなにも、これらのエレメントを省略するなどということはできっこないのです。
上記引用部の「エレメント」を「タグ」に置き換えると、意味が通じます。やはり、エレメントとタグが区別できていないようです。
すでに書いたと思うが、HTML4.0以降はBODYに直接文章を書けなくなり、必ずPか他のブロックレベルエレメントでくくらなければならない(心配しなくても例によってブラウザは寛容だろうが)。
文章を書き出す前には必ず"<P>"を書くものだ、と思っていればよいだろう。ただし、BLOCKQUOTEなど他のブロックエレメント内では不要だ。
嘘はやめましょう。HTML4.0 Strict の BLOCKQUOTE は、このように定義されています。
<!ELEMENT BLOCKQUOTE - - (%block;|SCRIPT)+ -- long quotation -->
BLOCKQUOTE の中身は BODY の中身と同一です。ちゃんと DTD を見てからものを言いましょう。「正しい」を名乗るつもりなら。
次の書き方は許されていない。<BR>で改行すれば済むことだろう。
<DL> <DT>用語<DD>これは最初の用語に対する説明 <DD>DTなしで次の説明文を書く </DL>
定義リスト中で DD を連続させて良いかという問題ですが、確かに RFC1866 では、
The content of a <DL> element is a sequence of <DT> elements and/or
<DD> elements, usually in pairs. Multiple <DT> may be paired with a
single <DD> element. Documents should not contain multiple
consecutive <DD> elements.
と「やるべきではない」と書かれています( MUST not ではなく SHOULD not なので、「許されていない」というほどでもないのですが)。
しかし、HTML4.0仕様書10.3では
<DL>
<DT>Center
<DT>Centre
<DD> A point equidistant from all points
on the surface of a sphere.
<DD> In some field sports, the player who
holds the middle position on the field, court,
or forward line.
</DL>
という例が出ていて、DD の連続が許されているのです。これは時代の趨勢でしょう。DD の連続は、本来の定義リストという用法からすれば、必要なことのように思われます。
なにより、<BR>で改行すれば済む
という主張は、絶対に違います。DD の代わりに BR を使うと、見た目だけは同じになるかも知れませんが、意味は全く異なってくるのです。<P>……</P><P>……</P>
と <P>……<BR>……</P>
が同じことだと思いますか?
見た目に限って言っても、DD にスタイルシートで枠線をつけた場合、BR で改行するのと DD を二つ使うのとでは全く異なりますね。何を根拠に BR で済むなんて言っているのでしょう?
答え:当時、Another HTML-lint の結果の解説にそう書いてあったので、そのまま拝借した。今はもうその記述は改訂されています。
コメントの書き方についての記述で
つまり、次のような状態となるのである。
<!--見えない--見える--見えない--見える--見えない-->
嘘です。この論法で行くと、
<!ENTITY % lang.en --english/japanese switch-- "IGNORE" --english disabled-->
などと書いたときに、「ENTITY % lang.en "IGNORE"」が画面に表示されることになってしまいます。実際にはそんなことはありません。「見える」といっている部分は表示されるわけでも無視されるわけでもなく、SGML のマーク宣言として解釈されます。
……と言ってしまえれば簡単なのですが、話はもう少し複雑です。
マーク宣言は MDO (マーク宣言開始区切り子、"<!" ) の直後に予約名か COM (コメント区切り子、"--" ) のどちらかを続けなければならないことになっていて、COM を書いた場合、その宣言は「註釈宣言」となります。そして、註釈宣言の中にはコメント以外のものを書くことができません。つまり、「見える」といっている部分には何も書いてはいけないことになっているのです(空白文字の記述は許されます)。
結局、<!--見えない--見える--見えない--見える--見えない--> というマーク宣言は単に不正なのであって、「見える」と言っている部分が表示されるわけではありません。マーク宣言についての詳細は「SGMLの注釈宣言」を参照してください。
同じ理由で、"<TABLE border>" という記述もあり得ず、"<TABLE border="1">" と書かなければならない。
この人たちはホントに仕様書を読んだのでしょうか。TABLE BORDER については、仕様書11.3.1 に明記してあります。
- The value "border" in the start tag of the TABLE element should be interpreted as the value of the frame attribute. It implies rules="all" and some default (non-zero) value for the border attribute.
ということで、TABLE BORDER はあり得るし、HTML4.0 では <TABLE frame="border"> と見なされるのだとはっきり書かれています。仕様書の原文を全て読んだような口振りですが、いったいどこに目を付けているのでしょうか。
答え:これまた Another HTML-lint の結果の解説にそう書いてあった。もちろんこの記述も改訂されています。
なお、なぜこのようにみなされるのかについては、SGMLの短縮タグ機構 を参照してください。
余談ですが、HTML4.0 がわざわざこんなふうに言及しているのには理由があります。実は大昔の HTML+ や HTML3.0 では、TABLE はこのように定義され……る予定でした。
<!ELEMENT TABLE - - (CAPTION?, (TH|TD|TR)*) -- mixed headers and data --> <!ATTLIST TABLE id ID #IMPLIED border (border) #IMPLIED -- draw borders -- lang CDATA #IMPLIED -- ISO language abbreviation -- index CDATA #IMPLIED -- entries for index compilation -->
見て分かるとおり、TABLE border で枠線を描画するか否かを二者択一で選択する仕様だったのです。HTML 3.0 でも同様の提案がなされていましたが、この仕様は正式採用されませんでした。
ネットスケープ独自拡張のテーブルはこれを踏襲し、<TABLE border> を <TABLE border="1"> とみなすようになっています。
HTML4.0 では、frame=border と frame=box は同じです。同じ効果を持つ値をわざわざ2種類用意していますが、片方は(もちろん border の方ですが)この幻の仕様との互換性のためのものなのです。
IMG に align="left" などを指定した際にテキストの回り込み(流し込み)が生じる、という解説に続けてこんな事を言っていますが……。
なお、オブジェクトはIMG 及び OBJECT エレメントで生成される。IE では TABLE エレメントもオブジェクト扱いされるが、これは IE の行きすぎた解釈のようである。
本当に IE の行きすぎた解釈なのでしょうか。これについては仕様書15.1.3 に書かれています。
Float an object
The align attribute for object, images, tables, frames, etc., causes the object to float to the left or right margin. Floating objects generally begin a new line.
(強調は筆者による)
フローティングオブジェクトは IMG と OBJECT だけでなく、TABLE や IFRAME でも出来ると書かれています。<TABLE align="left">でテキストの回り込みが起きるのは、IE の行きすぎた解釈などではありません。
ちなみに、テーブルについて書かれた RFC1942 にも、回り込みが発生すると書いてあります。
この本の後半はエレメントリファレンスになっています。絶対正確であると自負しているこの部分にも誤りがあったりして……?
実のところ、COL と COLGROUP の区別は実に不鮮明である。
TABLE に rules="groups" という指定ができることを知らないのでしょうか。それがなくても論理マークアップなのですから、列をグループ化する COLGROUP と、単に一列に属性を継承させる COL とでは、意味が違います。
逆に、一項目ごとに空行を送って段落を広く取るには、DD の要素を P エレメントでくくるといいだろう。DD 末尾に BR を付加しても、ユーザエージェントによって行送りの仕方が変わってしまうので効果を発揮できない。
失格! これでは「 P は一行空き」と吹聴している連中となにも変わらないではありませんか。どうしてここでスタイルシートという発想が出てこないのでしょうか? この記述には本当に残念な思いをしました。
この本には CSS1 の付録が付いていますが、表題「正しいHTML4.0+CSS1リファレンス&作法」の「正しい」は CSS1 にはかかっていないようです。
background-color のところで、
'transparent' とは透明色のことでユーザーエージェントの背景色が透けて見える(つまり標準色のまま)
これにはのけぞりました。background-color は継承しません。そして初期値は transparent ですから、「ユーザーエージェントの背景色が透けて見える」が事実だとすると、BODY の背景色指定なんてのは意味をなしません。子要素全てにいちいち背景指定しなくちゃならないことになります。「background-color は継承しないが、初期値が transparent だから、親要素の背景色が透けて見える」と言うのが正解です。
どうやらこの著者、background-color が継承しないと言うことを知らないようです。それどころか、「継承」という概念そのものについて全く理解していない節があります。現に、CSS 解説の中に継承についての説明はありません。
のけぞり度自体は極めて高いのですが、のけぞり方が他の本と少し違います。「正しいんだ!」「原典に当たってるんだ!」と言いつつ、正しくなかったり原典に書かれていることを見逃していたりする様は、かなりお間抜けです。
スタンスそのものはとても良いと思うのですが、良い意味でも悪い意味でも、かなり「変な」本になっています。