Another HTML-lint : Notice

# Another HTML-lint

目次 | はじめに | ゲートウェイサーヴィス
| いくつかの覚え書き | 簡易ゲートウェイ
| htmllint.cgiの使い方 | 結果の解説
| htmllintの使い方 | タグ一覧
| 規則ファイルの生成 | 色見本
| ダウンロード
| メーリングリスト
| 参考までに | 作者にビールをおごる
| よくある質問と答 | プライマリサイト

## いくつかの覚え書き

- UTF-8
- XHTML™ 1.1
- XHTML™ Basic
- XHTML™ 1.0
- HTML4.01
- HTML4.0
- HTML3.2
- HTML3.0
- HTML+
- HTML2.0
- HTML1.0
- Mozilla
- MSIE5.0
- MSIE4.0
- MSIE3.0
- MSIE3.0β
- WebExplorer
- NCALS HTML2.0
- ISO/IEC 15445
- HTML4.0 Mobile
- Compact HTML
- iモード
- J-SkyWeb
- ドットi
- HDML
- 特許出願用HTML
- RFC2368
- RFC2396

慶應義塾大学内のサイトはW3Cをミラーしているわけではないそうです。

結果の解説に、どうしてもブロックレベル要素とインライン要素の話が出て来てしまう。ここら辺は、なるべくうやむやに、しかし間違いではないように、妙な気を使って書いていましたが、だんだんとそうもいかなくなってきました。これらを解説しようとすると、どうしたってHTMLの基礎を解説することになっちまって、かなりの馬力が必要です。困ったな。他にいくらでも優秀なサイトがあるので、そっちを見てもらうことにしよう。

### UTF-8

Jcode.pmを使ってUTF-8をハンドリングしています。いくらか制約があります。

- 0.57より前の版では、文書から自動的にそれがUTF-8であるかどうかを判定できません。したがって、CHARSETなどによって明示的にUTF-8と指定された場合のみUTF-8として評価します。
- 変換できない文字は、`\xa2\xf7` のように変換されます。
- 0.40より前の版では、JIS第一、第二水準以外にマップされる文字などは、正しく表示されないかも知れません。特に、ASCII文字中の \ (0x5C)、~ (0x7E) も該当します。

(1999/07/15)

### XHTML™ 1.1

XHTML™ 1.1が勧告された (2001/05/31)。

XHTML™ 1.1は勧告案 (2001/04)、Modularization of XHTML™は、勧告された (2001/02/22)。

XHTML™ 1.1は、まだドラフトである(2000/03)。次のような特徴があります。

- HTML4のTransitionalやFramesetな要素が排除された。
- <a> などの name 属性が廃止された。
- DTDで、要素がモジュール化され、見通しがよくなり、カスタマイズが容易になった。
- ルビ(内田明訳)モジュールが含まれている。

(2000/03/27)

### XHTML™ Basic

XHTML™ Basicは、2000/12/19 に勧告されました。

XHTML™ BasicというXHTML1.1のサブセットもある。これは、携帯電話やPDAなどの小型情報機器向けの仕様になっていて、イメージ、フォーム、基本的なテーブルなどが含まれています。
規則ファイル作成にあたっては、xhtml-framework-1.mod 内の xhtml-arch.module を IGNORE にしました。

(2000/03/27)

### XHTML™ 1.0

XHTML™ 1.0はHTML4をベースにしたXMLで、HTMLとしての上っ面だけ見ると次のような特徴があります。

- 要素名や属性名は小文字で書かなければならない。大文字はだめ。

  ○ | `<a href="http://k16.org/">`
  × | `<A HREF="http://k16.org/">`

- 開始タグや終了タグの省略はできない。

  ○ | `<p>ほにゃらら</p><p>ぴー</p>`
  × | `<p>ほにゃらら<p>ぴー`

- 属性値はすべて引用符で囲まなければならない。

  ○ | `<col span="5">`
  × | `<col span=5>`

- 属性名の省略はできない。(属性値の省略ではありません)

  ○ | `<dl compact="compact">`
  × | `<dl compact>`

- 空要素タグは `/>` で終わらせる。(`/>` の前には空白を空けるよう薦められています)
  実はすべての要素には終了タグがあるので、`/>` で終わらせるのは、単なる短縮形です。非空要素タグを短縮形で書くことは禁止されています。

  ○ | `<img src="panda.jpg" alt="panda" />`
  ○ | `<img src="panda.jpg" alt="panda"></img>`
  △ | `<img src="panda.jpg" alt="panda"/>`
  × | `<img src="panda.jpg" alt="panda">`
  × | `<td />`

- SCRIPTやSTYLEの内容がCDATAではなく#PCDATAとなりました。
  これは非常に大きな違いで、CDATAを直接記述するためには内容をコメントで囲めばいいわけではなく、マーク区間を利用します。ただし、CDATAマーク区間中に `]]>` を記述することはできません。CDATA以外のマーク区間では、`<`、`&` も記述することはできません。つまり、`]]>` を含むスクリプトやスタイルシートの記述を直接HTML中に埋め込むことはできませんし、`--` などを含ませることも薦められていません。そのようなときは外部にスクリプトやスタイルシートを用意しなければなりません。

  ○ | `<script> <![CDATA[ ... if (var > 100) ... ]]> </script>`
  △ | `<script> <!-- ... if (var &gt; 100) ... //--> </script>`
  × | `<script> <!-- ... if (var > 100) ... //--> </script>`
  × | `<script> <![CDATA[ <!-- ... if (var &gt; 100) ... //--> ]]> </script>`
  ○ | `<script> <![CDATA[ ... if (var < 100) ... ]]> </script>`

と、ここまではチェックしています。この他にも、次のようなのがあります。

- 属性値の先行後行する空白を捨て、連続空白をひとつの空白にする、というのは行なっています。
- name 属性は使わずに id 属性を使うように、警告されます。
- XML名前空間に関しては、対応できていません。
- 除外要素に関してDTDからは読めずに、Appendix B. にあったりする。これは、XMLの制約による。
- HTML4.01で追加された属性をDTDに追加しましたが、もしかしたら余計なお世話なのかも。
- MIMEタイプの変更はありません。text/html のままです。text/xhtml ではありません。text/html ならばHTMLとして評価され、text/xml ならXMLとして評価されます。

(2000/02/08)

### HTML4.01

HTML4.0は、HTML4.01 に改訂されました(1999/12/24)。これに伴って HTML4.0 は obsolete になっています。
それほど多くの改訂があるわけではありません。次の属性が追加されています。

- <IMG NAME>
- <FORM NAME>
- <INPUT ISMAP>

あとはいくらかのDTDの修正などです。
仕様書本文にも、いろいろ修正がありますが、ちゃんとは目を通していません。(1999/09/12)

### HTML4.0

HTML4.0では、親しまれている "URL"(Uniform Resource Locator) の代わりに、より広義の "URI"(Uniform Resource Identifier) を用いています。これらは、ちゃんと使い分けなければならないのですが、きちんとできてません。詳しくは Web Naming and Addressing Overview。

HTML4.0の赤枠で囲まれている ILLEGAL EXAMPLE はすべて警告されるようにした、つもり。

HTML4.0 (Cougar) のDTDで、loose.dtd にあり strict.dtd にないタグのうち、以下を薦められないタグとしました。

- <APPLET>
- <CENTER>
- <DIR>
- <MENU>
- <ISINDEX>

これら以外で、loose.dtd にあり strict.dtd にないタグで、フレーム関係以外のものは以下のとおりなんですが、これらは、スタイルシート(CSS1/CSS2)で行なえ、という主旨らしいです。これらも薦められないタグとしましたが、スタイルシートをサポートしていないWWWブラウザのためには使わざるを得ないような気もするんだけど、使っちゃいかんというのならそれはそれでよい。

- <U>
- <S>
- <STRIKE>
- <FONT>
- <BASEFONT>

loose.dtd にあり strict.dtd にない属性は以下のとおりです。しかし、<OL START>などは、だめと言われてもCSS1には代替がないので、どうするつもりなんでしょ(CSS2にはある?)。

- <BODY BACKGROUND BGCOLOR TEXT LINK VLINK ALINK>
- <BR CLEAR>
- <CAPTION ALIGN>
- <DIV ALIGN>
- <DL COMPACT>
- <Hn ALIGN>
- <HR ALIGN NOSHADE SIZE WIDTH>
- <IMG ALIGN BORDER HSPACE VSPACE>
- <INPUT ALIGN>
- <LEGEND ALIGN>
- <LI TYPE VALUE>
- <OBJECT ALIGN BORDER HSPACE VSPACE>
- <OL TYPE COMPACT START>
- <P ALIGN>
- <PRE WIDTH>
- <TABLE ALIGN BGCOLOR>
- <TD NOWRAP BGCOLOR WIDTH HEIGHT>
- <TH NOWRAP BGCOLOR WIDTH HEIGHT>
- <TR BGCOLOR>
- <UL TYPE COMPACT>

<TD>、<TH>の要素を空にできないと、空のセルを作れないので、空にできるとみなしました。HTML4.0 11.4.2 には、実際にそのような例が出てきます。
<TABLE>、<TD>、<TH>のWIDTH属性が%Pixels;となっていますが、%指定できるように%Length;に変更しました。
loose.dtdでは、<BASE>のHREF属性が必須ではなくなりましたが、HREF属性とTARGET属性のどちらかが必要だとしました。
<SCRIPT>と<STYLE>にTYPE属性が必要となっています。値はContentTypeです。それぞれ、text/javascript とか text/css とか書いてください。
Mozillaにはあるが、<FORM>にNAME属性がない。SCRIPT書くのにちょっと困るかも知れない。しかし、NAME属性はID属性に取って代わられる方向のようだ。
<OBJECT ARCHIVE> は space separated archive list なのに、<APPLET ARCHIVE> は comma separated archive list なんだ。

HTML4.0では、16進の文字参照ができる。&#x6C34; みたいに。

HTML4.0では、IDやNAMEに "_" や ":" が使えると書いてある。つまり、SGML宣言の

        LCNMCHAR ".-_:"
        UCNMCHAR ".-_:"

の部分だ。`SHORTTAG YES` はデフォルトなので、HTML4.0では、属性値に "_" や ":" を含む文字列を与えるときに、引用符で囲まなくてもよいということになる。

### HTML3.2

HTML3.2のDTDでは、<INPUT>などが<FORM>の外にも書けるようになっているが、HTML 3.2 Reference Specification では "INPUT, SELECT and TEXTAREA are only allowed within FORM elements." と書かれていて矛盾しています。これはおそらくDTDの方が正しい。HTML 4.0 Specification 17.2 Controls では、"The following control elements generally appear within a FORM element declaration. However, these elements may also appear outside of a FORM element declaration when they are used to build user interfaces." と<FORM>の外側に書けるようにした理由が書かれている。
Mozillaでは、<INPUT>などを<FORM>の外に書くと、そういう要素は無視されて表示されない。MSIEでは表示される。

HTML3.2 のDTDには、実体宣言に &quot; が欠落しています。これはW3Cも認めている誤りです。完全DTDベースの W3C HTML Validation Service ではエラーになりますが、補正してある Another HTML-lint ではエラーになりません。

### HTML3.0

HTML3.0 (Arena) は、すでに破棄されてしまった仕様です。このHTMLは仕様が大きく、ちょっと荷が重かったのですが、かなり手抜きをして何とか規則ファイルを作ることができました。
DTDの次のような記述は実装されていません。

- SHORTREF/USEMAPによる短縮参照
- NOTATIONによる記法宣言

短縮参照は、<MATH>タグなど用に宣言されていて、X2 みたいな表現を、X^2^ と書くだけで済まそう、とかいう代物で、他にもいろいろな短縮形が宣言されています。記法宣言は<STYLE>で行なわれています。

### HTML+

HTML+は、HTML文書を<HTMLPLUS>〜</HTMLPLUS>で囲むことになっていて、ちょっと異色だ。つまり、

        <!DOCTYPE HTMLPLUS [ 〜 ]>

となっている。
文字参照の定義をHTML1.0のDTDからコピーしたらしく、&amp;と&lt;に同じ間違いがある。&quot;などがあるように書いてあるけど、DTDには欠落している。

DTD中の次の部分

        <!ELEMENT HTMLPLUS O O ((HEAD, BODY) | ((%setup;), (%main;)*))>
        <!ELEMENT HEAD - - (%setup;) -- delimits document wide properties -->
        <!ELEMENT BODY - - (%main;)* -- delimits the document's body -->

は次のように書き換えた。

        <!ELEMENT HTMLPLUS O O (HEAD, BODY)>
        <!ELEMENT HEAD O O (%setup;) -- delimits document wide properties -->
        <!ELEMENT BODY O O (%main;)* -- delimits the document's body -->

これは、オリジナルと若干の意味の相違がある。つまり、オリジナルでは、HEADやBODYの開始タグを書いて終了タグを書かないなどということが禁止されている。
また、ADDRESSとBLOCKQUOTEが定義されているがどこからも参照されていない。

### HTML2.0

HTML2.0は破棄されました。(RFC2854)

HTML2.0では、以下のようなDTDのヴァリエーションが書かれていますが、Another HTML-lint では、DOCTYPEにどれを書いてもすべて同じ扱いです。

- `PUBLIC "-//IETF//DTD HTML//EN"`
- `PUBLIC "-//IETF//DTD HTML 2.0//EN"`
- `PUBLIC "-//IETF//DTD HTML Level 2//EN"`
- `PUBLIC "-//IETF//DTD HTML 2.0 Level 2//EN"`
- `PUBLIC "-//IETF//DTD HTML Level 1//EN"`
- `PUBLIC "-//IETF//DTD HTML 2.0 Level 1//EN"`
- `PUBLIC "-//IETF//DTD HTML Strict//EN"`
- `PUBLIC "-//IETF//DTD HTML 2.0 Strict//EN"`
- `PUBLIC "-//IETF//DTD HTML Strict Level 2//EN"`
- `PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 2//EN"`
- `PUBLIC "-//IETF//DTD HTML Strict Level 1//EN"`
- `PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 1//EN"`

### HTML1.0

参考までに、HTML1.0のDTDも見てみました。実用的価値は皆無です。(1998/07/07)
DTDの以下の部分を修正しました。

        <!ENTITY % bodyelement
                 "P | %heading |
                 %list | DL | HEADERS | ADDRESS | PRE | BLOCKQUOTE
                | %literal">

の `HEADERS` というのがどこにも出て来ないので削除した。

        <!ENTITY amp "&amp;" -- ampersand -->
        <!ENTITY lt "&lt;" -- less than -->

は、それぞれ、`"&#38;"`、`"&#60;"` とした。

よく見ると、HTML1.0でも<PRE>内に<IMG>は書けない。Laura Lemay女史は、何を参考にしたのだろうか。HTML+では<PRE>内に<IMG>が書けるのだが、こういう都合のいいところだけ先取りしていたのだろうか。

### Mozilla

HTML Tag Reference (1998/01/26) には記述がないが、<TABLE BACKGROUND> が有効なようだ。<TD>、<TH>なども。いつから有効は、例えば http://www.blooberry.com/indexdot/html/supportkey/t.htm に記述がある。(2000/01/22)

1998/04/24版のHTML4.0の 3 On SGML and HTML を MacのMozilla(4.05/PPC)で開こうとするとMozillaが死ぬ。死なないようにするには、スタイルシートを無効にするか、41行目の <dfn> を削除すればいい(</dfn>も)。

Navigator/Communicator(Mozilla)のDTDは存在しないらしいので、HTML2.0/HTML3.2のDTDをベースに、Netscape社の HTML Tag Reference (1998/01/26) を参考にして捏造しました。その際、リファレンスの納得のいかない記述は曲解しました。それらや疑問点は以下のとおりです。また、リファレンスはDTDに比べて正確さが格段に落ちるため、DTD化にあたってはHTML2.0/HTML3.2を踏襲しています。これらにない部分は、HTML4.0を参考にしています。

- <LINK>はMozilla4.0からサポートされたが、どうもリファレンスがうそ臭い。REV属性がないようだが、補っておこう。また、HREF属性ではなくSRC属性であるが、実際にはHREFで動作する。HTML4.0を考慮してHREF属性も追加しておこう。
- <DT>、<DD>が空要素タグとされている。しかし、<DL>中にこれらだけが許されるようにするには、空要素タグではDTDで表現するのがとても面倒だ。終了タグ省略可能にした。
- <PLAINTEXT>が空要素タグだが、HTMLは</HTML>で終了する都合上終了タグ省略可能とした。
- <AREA>にALT属性がないが補っておこう。
- <FORM>の各コントロールは<FORM>の外に出せない。その代わりACTION属性が必須ではないようだ。
- <INPUT>のTYPE属性は省略可能か。記述がみつからない。HTML3.2は省略可能でTEXTが既定値となっている。実際にはMozillaもそのように動作する。
- リファレンスにはないが、<INPUT>にWIDTH、HEIGHT、BORDERなどが書けて、ちゃんと評価される。
- 同様に、<IMG NOSAVE>というのが存在する。
- <EMBED>にUNIT属性が追加されているが、新しく追加されたようなことは書いていない。
- <OBJECT>が追加されている。空要素タグになっているが、HTML4.0ではそうでないし、解説中にも許される要素の説明や、</OBJECT>が出てくるので、終了タグを補った。
- <LAYER>にはCLASS属性が含まれていない。しかし、Dynamic HTMLの方のサンプルにはしっかりと使われている。これはきっとSTYLE属性とかも書けるに違いない。
- <HYPE>という秘密のタグが存在する。

ソースが公開されているのだから、その気になればこういったことの実装を確認できるんだけれど、あまりやる気がないなぁ。

Netscape社の作ったものじゃないですが、MozillaのDTDがWebTechsのサイトにあることを発見しました(1997/07/31)。しかし、古いし、あまりよくありませんでした。

### MSIE5.0

MSIE5.0に対応したリファレンスがある。しかし、例によって内容は不正確だし矛盾だらけである。(1999/07/29)
きわめてお粗末な DynamicHTML のプログラミングのために、自社製品のIE5上でもランタイムエラーが頻発する。しかも、ダイナミックに変更されたものがすべて表示されているかというと、ちょん切れていたりするから始末が悪い。つまり、Members/Attributes に全属性が表示されている保証はない。再読込みしたり、All を選んだりと試行錯誤が必要だ。まあ、どうせ信用性に乏しいので、たいした問題ではないとも言える。MSIE4.0のときの問題点は、ほとんど解決されていないと思ってよい(問題意識がないのだろう)。<SCRIPT>のコメントは直っているみたいだけど。

- Syntax に出てくる属性と、Members に出てくる属性が、ほとんどのタグで一致しない。統一性もない。<SELECT> などめちゃくちゃだ(中身が空)。
- Events がでたらめに見える。MSIE4.0にあったものが落ちていたり、同一カテゴリのタグで使用できる Event が異なっていたり。なるべく多くを包含するようにDTDは作ってあります。
- The OL element is a block element and requires a closing tag. といっていながら Syntax には終了タグがなかったりする。だいたい closing tag なんてのは正しい用語か。
- <BODY> の Members には onblur/onfocus/onload/onunload が含まれていないが、Remarks に window object のためなら使えるようなことが書いてある。どういう意味かよくわからんが、追加しておこう (IE4にも)。
- <DL COMPACT=TRUE> みたいに、こういった属性は値に true/false を採ることができる。
- <BODY BGPROPERTIES> は、値に FIXED と "" を採り得る。
- <INPUT TYPE=PASSWORD VCARD_NAME="..."> 属性名に下線を使ってやがる。
- The NEXTID element does not require a closing tag. とあるのに NEXTID というタグに関する解説はない。
- <RUBY> は、W3Cのドラフトのサブセットのようにリファレンスからは読めるが、実験してみるとそのドラフト(著者はMSの方)の仕様をすべて満たしているようで、ちゃんと<RP>も解釈できている。つまり、

    `<RUBY>日本語<RP>(<RT>にほんご<RP>)</RUBY>`

  と書ける。ということは、<RB>も存在するということだが、<RB>は開始終了タグ共省略可能なので、本当にサポートしているのかを確かめるのは難しいんだけど。
  MSIE5なら次はちゃんとかっこの付いていないルビ付きで表示されるはずだ。そうでなければ、ルビがかっこ付きでふつうのテキストとして「日本語(にほんご)」とそのまま表示される。

    `日本語(にほんご)`

  この<RP>が解釈できることは、非ルビサポートのユーザエージェントのことを考えると、非常に重要だ。リファレンスに公開されていないのは単なるマヌケか。
- custom Element なんてサポートできない。
- <HTML XMLNS:namespace> は評価できない。<HTML XMLNS:Prefix1 XMLNS:Prefix2="www.microsoft.com"> なんてHTMLの文法じゃないじゃんか。いや、XMLNS:Prefix1 までで属性名とみなせなくもないか。なおさら評価できないや。
- <XML> は、うさんくさいのでちょっと保留。

<HTML XMLNS:namespace> と <XML> を解釈するようにしたが、XML名前空間などをちゃんと評価はできない。(1999/10/31)

- <XML>〜</XML> 内には、任意の名前の要素を書けるようにした。ただし、すべてに終了タグが必要。
- <HTML XMLNS:namespace> で宣言された namespace は、<STYLE> 内で要素名などの詳細を宣言されるが、そこまではチェックしていない。宣言された namespace を使った要素(custom Elemnt)は、インライン要素として評価される。

### MSIE4.0

MSIE4.0では、</P>の直前に<BR>があると、</P>が無視されるように見える。Mac版だけか? さらに、VScriptをサポートしてないって出るぞ。自分とこのページにわんさと使ってるのにいいのか?

MSIE4.0のリファレンスが公開されているのだが、ひどいねこりゃ。ダウンロードイメージがないので、あとでゆっくりというわけにいかないことからしてけしからんのだが、目次に挙がっているのと内容が一致しない、ナヴィゲーションが正しくない、ただ並べてあるだけで意味を理解させようとしているとは思えない(多くの属性の意味不明だ)、記述の正確さは微塵もない、HTMLソースはぐちゃぐちゃ(ど素人が書いたとしか思えん、FrontPageかも)。タグリファレンスのMembersって何だ? MSIE3.0と上位互換性がない。(1998/07/04)

- 専用のDOCTYPEがあってしかるべきなのに、HTML3.2やHTML4.0の例示があるのはどういうつもりなのか。
- 今に始まったことじゃないけど、要素限定の記述があいまいだ。というか皆無に近い。HTML4.0を参考にしようにも、ちと無理があるか。
- 今に始まったことじゃないけど、終了タグがあるのかないのかあいまいだ。
- 取り得るイベント属性が同じようなタグでも異なっていると、どうも信用できない。
- Deprecatedな要素がほとんどない。MSIE3.0なんかの流れから、CENTER、COMMENT、EMBED、LISTING、PLAINTEXT、XMPくらいはDeprecatedにしちゃおう。ISINDEXはHTML4.0でdeprecatedだとわざわざ書いてあるからこれも。XMPは no longer recommended て書いてある。
- ほぼすべてのタグに共通する属性に、CLASS、ID、TITLE、LANG、LANGUAGE、STYLEがあるんだけど、ちょっとづつ違うタグがある。あえてそうしているのかどうか判断が難しい。例えば、<BASEFONT>には、CLASS、ID、LANG属性だけが、<BGSOUND>には、CLASS、ID、LANG、TITLE属性だけが、<COMMENT>には、ID、LANG、TITLE属性だけがあって、他と違う。
- <BR LANG>がないけど、面倒なので補っておこう。イベントも書いてないけど、Membersにはある。
- <WBR LANG>がないけど、面倒なので補っておこう。また、これは空要素タグにした。
- <ISINDEX>は空要素タグだろうよ。<ISINDEX TITLE>がないけど、面倒なので補っておこう。イベント属性があるように書いてあるけど、Membersにはないぞ。
- <MAP LANGUAGE>がないけど、面倒なので補っておこう。
- DATAFLD属性、DATASRC属性って何? 属性の値は何?
- <DT>、<DD>、<LI>、<PLAINTEXT>が空要素タグだけど、それだと要素限定がうまくできないので、終了タグ省略可能にした。
- <PLAINTEXT>なんて<FRAMESET>と共存するとは思えないけど、DTDが複雑になるのでいつでも書けるとした。
- <INS>のイベント属性が書いてない。<DEL>と同じにした。
- <MENU LANGUAGE>がない。<DIR>にはある。補っておこう。
- <FRAMESET>に書いてあるイベント属性は<FRAME>のものだろう。
- <HTMLAREA>って何? <TEXTAREA>と似て非なるもののようだな。でも使えるイベント属性は違うんだ。他の属性は同一なのに。ちゃんと考えて違えてるのかな。
- <A URN>って何? HTML2.0のときにあったやつなんだけど、どうして突然復活するわけ? しかも<A>にだけ。ちなみに、URNてのは Universal Resource Number。
- <A>のRELとREVの値がSTYLESHEETだけだ。
- <LINK>のRELとREVの値がSTYLESHEETだけってのは嘘でしょう。と思ったら、何を指定してもSTYLESHEETだとみなして、揚げ句に「そんなスタイルシートはインストールされていない」とエラーが出たりするようです。HTML4.0なんかはなから眼中にないようで、これはちょっとひどいね。
- <LINK>にはイベント属性がないようで、あるようだ。
- <NEXTID>の中身がない。だいたいどうしてこんなのが出てくるわけ? HTML2.0にはあるけど、最近のHTMLにはないよ(MSIE3.0にもないけど3.0βにはあるな)。この要素はDTDに含めない。でも、しっかり対応イベントなんか書かれてるんだよな。つくづく何考えてるのかわからんな。
- <PARAM>は空要素タグとした。
- <SCRIPT>とか<STYLE>とかにはMembersにイベント属性がある。
- リファレンスのソースを見れば一目瞭然だけど、ことごとく

          <SCRIPT>
          //<!--
          ...
          // -->
          </SCRIPT>

  という風に書いてある。相当マヌケだ。

### MSIE3.0

MSIE3.0のリファレンス(注:デッドリンクです)に対する代表的な疑問点を挙げておきます。これらに対する規則ファイルの修正は、明記されていない場合は行なっていません。ちなみに、このリファレンスはものすごく雑です。漏れや矛盾がぼろぼろあります。"Last Updated: October 24, 1996" なんてことでは、このリファレンスも信頼に足るものではないかも知れません(ベータ版DTDよりも古い!)。

- HTML3.2のDOCTYPEを用いるように書かれている。しかし、中身は独自拡張を含んだり、HTML3.2とは異なる記述が多くあり、HTML3.2は大嘘の宣言だ。
- 要素の入れ子に関する記述がない。
- 開始タグや終了タグの省略可能性がわからない。
- 見出しに終了タグがないのに、例示に終了タグがあったりすると、どっちが正しいかわからない。
- <FONT SIZE=+4>とか<BODY BGCOLOR=#FFFF>とか間違った記述がある。
- <DD>、<DT>、<LI>が空要素タグ。これは、このリファレンス作成者があまりにも無知ゆえだろうから、終了タグ省略可能とした。
- <EMBED>には、任意の属性が指定できるようだが、そんなのはDTDでは表現できない。
- <IMG ISMAP=image>とは何か。
- <TD ALIGN>の既定値がCENTERとなっているが本当か。
- <UL TYPE>がない。
- 色名はHTML標準の16色しか示されていないが、Mozillaの色も補った。
- Deprecatedであろうタグはベータ版DTDと同じにした。

MSIE3.0のスタイルシート対応はめちゃくちゃです。font-size:2em の em を解釈しないので、この場合 2pt または 2px で表示されるようです。この、Another HTML-lint のHTMLは、見出し部などにこのような指定があるため、MSIE3.0ではうまく表示できません。スタイルシートを無効にすればちゃんと表示されます。

### MSIE3.0β

MSIE3.0はベータ版DTDが公開されています。このDTDには独自のDOCTYPEなどもちゃんと定義されているのですが、内容が古く、現在のMicrosoftのサイトで公開されているリファレンスとは大きく食い違っています。
公開されているベータ版DTDは、著者自らがいくつものバグやおかしな記述があることを述べています。以下はこのDTDを利用するにあたってのいくつかの疑問点です。これらに対する規則ファイルの修正は、明記されていない場合は行なっていません。

- <NOBR>が空要素タグである。したがって</NOBR>はない。
- <EMBED>は空要素タグではない。要素はどういう意味を持つのか。
- <NOEMBED>が <!ELEMENT NOEMBED - - EMPTY> と定義されている。これは、開始終了タグ共に必要だが要素に何も書けないという意味だ。
- <SCRIPT>は <!ELEMENT SCRIPT - - (#PCDATA)* -(%head.misc)> と定義されている。#PCDATAというのは普通のテキストだが、< や & などは実体参照を用いて書かなくちゃならないし、コメントも <!-- 〜 --> を解釈する。一般のどういう文法かわからないスクリプト言語を書かせるのにこれでは不自由である。CDATAに変更しました。
- <SPAN>がstrictじゃないと、なくなってしまう。補いました。

Strict版と非Strict版の両方用意されていますが、Strict版の方は採用しませんでした。

### WebExplorer

IBM WebExplorer 1.1 は、最近更新されているのかいないのかわからないけど、どうやら見捨てられてしまっているらしい。資料がほとんどないので、サポートしているタグに何があるのかよくわからない。独特な<ANIMATE>などのタグを解釈するようにはしてみたものの、いまいちです。HTML2.0ベースらしいんだけど、それほど互換性があるようにも見えないしなぁ。今更、こんなのやったってしょうがないといえば、そのとおりです。

### NCALS HTML2.0

DTD for NCALS HTML2.0 というのがあります。しかし、このDTDは相当おかしな代物です。

- <- 〜 -> というコメントらしい記述がある。<!- というのもある。
- かっこや引用符の閉じ忘れはざら。
- 未定義のパラメタ参照がむちゃくちゃたくさんある。

こんなのを信じろというのが無理な話です。

### ISO/IEC 15445

ISO/IEC 15445:2000 が改訂されている。FORMに関する改訂など、いろいろと手が加えられているが、DOCTYPEの変更はない。この変更に伴って、1999版DOCTYPEは受け付けなくした。(2001/03/20)

DTD中には、`<!ENTITY % Preparation "IGNORE">` という制御用のパラメタが定義されている。これは最終的なHTMLとしてはIGNOREとなるべきものだが、準備段階の文書に対してINCLUDEとして適用すると、`<H1>`〜`<H6>` の出現に関して厳密な構造を要求されるようになる。つまり、`<H1>` の次に `<H3>` が現れてはならない。しかし、`<H1>` を独立トップページにして、その下位の(複数の) `<H2>` を別のページに独立させることはできない。

この Preparation に対するDOCTYPEは特に用意されていないが、

         <!DOCTYPE Pre-HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">

などとして Preparation に対応させた。HTMLは `<Pre-HTML>`〜`</Pre-HTML>` で囲まれる。

ISO/IEC 15445:2000 は、1999からDTDの変更はない。この ISO/IEC 15445:2000 を翻訳したものが 日本工業規格 JIS X 4156:2000 となっている。(2000/11/28)

ISO/IEC 15445、いわゆる ISO-HTML はまだ策定作業中です。作業中であるが、せっかく公開されていることでもあり、そこにあるDTDを組み込んでみました。HTML4.0 にあって 15445 にないパラメタ参照、例えば

        <!ENTITY % Charset "CDATA">
        <!ENTITY % LanguageCode "NAME">

などを補って、DTDに多少手を加えました。(1999/05/01)

### HTML4.0 Mobile

HTML 4.0 Guidelines for Mobile Access (1999/03/15版) は、モバイル用コンテンツ作成者に向けたアクセス性などに関する注意書きなどをまとめたものです。この文書自体、単なるガイドラインに過ぎず、含まれるDTDは参考程度のものでしかない。が、せっかくDTDがあるので、組み込んでみた。このDTDは HTML4.0 Strict のサブセットであり、ISO/IEC 15445 のサブセットでもあるから、DOCTYPEにそれらを用いたとしても間違いではない。(1999/05/01)

### Compact HTML

W3Cに Compact HTML というノートがあり、ここにはDTDもある。タグリストの Elements に `!-` とか `!DOCTYPE` とか `&xxx;` とかが並んでるが、これらは Element じゃない。(1999/05/01)

- タグリストにある `!-` はなんだろう。
- `<DFN>`、`<ISINDEX>` は含まれないはずがDTDに中途半端に含まれている。削除した。
- `<META>` がDTD中でどこからも参照されていない。`<HEAD>` の要素に含めた。また、属性に NAME と CONTENT がない。タグリストにもあるし、明らかに間違いだろうから、補った。
- `<SELECT>` の文字数 4Kバイト、`<TEXTAREA>` の文字数 512バイトなどという制限が書いてあるが、チェックしていない。

### iモード

3.0になった。`<OBJECT>` と、`<A>` の属性が追加された。(2001/03/13)

- `<OPTION VALUE>` の長さ制限がなくなった。
- `<A>` の subject、body 属性の書式が

          <A href="mailto:メールアドレス"?subject="サブジェクト"&body="本文">

  となっている。どういう積りなのかわからん。引用符の位置を間違えているとも取れるが、属性てんだから属性なんだろう。
- `<A KANA>` の値は、属性名などから推察するに、半角カタカナのみのようだが、実際には英数字も登録できるようだ。
- `<A EMAIL>` の値はURLではない。09012345678@docomo.ne.jp の電話番号部分など。いずれにしても @ の前の部分で、電話番号以外は英数字、ハイフン、ピリオド、下線が許される。
- 「半角英数字」という属性値の制約が出てくる。これは字面どおりだとすると、空白やピリオドやハイフンなど記号類は含まないと読めるが、正解はどうなんだ。
- さらに突っ込みを入れると、「目安として題面(subject)は30バイト、本文(body)は500バイトにしてください」てのがあって、30バイト以下とは書いていないわけだ(題面て何?)。
- 2.0の改訂のときに見落としていたけど、CTIという属性が `<CTI>` として記述されている。MULTIPLE属性も `<MULTIPLE>` だ。

1.0 にあった一部の制限が、2.0のタグ一覧からは削除されている。また、`</P>` が明示されるようになったが、`</LI>` などは出てこない。(2000/05/26)

- 「HTML2.0、3.2、4.0のサブセットです」と書いてあるが、言っていることが矛盾しているし、そういうような仕様でもない。
- `<INPUT TYPE=TEXT>`、`<INPUT TYPE=PASSWORD>` の `SIZE` や `MAXLENGTH` の限界値の制限がなくなった。
- `<OPTION>` の件数の制限がなくなった。
- `<TEXTAREA>` の `COLS` や `ROWS` の限界値の制限がなくなった。
- `<PLAINTEXT>` が追加されている。HTML3.2の仕様とは異なる。どちらかというと、`<XMP>` のように振舞う。
- 扱える文字コードは Shift JIS のみとなっているが、EUC でも表示されるようだ。

iModeのHTML Versionが 2.0になっていた。(1999/12/05)
`<BLINK>` だとか `<MARQUEE>` だとか `<FONT color>` だとか、時流に逆らうような改訂であるが、利用者にはありがたいであろう。

NTT DoCoMo の iモードは、タグ一覧が公開されている。HTML3.2ベースと書いてあるが、ベースは明らかにW3Cにある Compact HTML である。iモードはこれをアレンジしたものである。サブセットではない。DTDは Compact HTML を元に作成した。(1999/04/09)

- コメントが `<! 〜 >` となっているが、これはあんまりじゃないのか。
- 文字参照は `&#127;` までということになっているが、`&copy;` など、その範囲を超えた実体参照を使用できることになっていたり、さらに、数多く内蔵している絵文字は、`&#63808;` などととんでもなく大きな値に対応している。これから、`&#65535;` まで参照できるようにしておいた。imode端末文字一覧などが参考になります。
- `<Hn>` の n は、1〜6なんだろうな。
- `<HTML>` の属性 `VERSION` で、HTMLバージョンを指定することができるようだ(DOCTYPEじゃないところがなんともいえないけど)。この属性値は何が指定できるのだろうか。2.0と3.2だろうか。これによってHTML解釈を制御しているのだろうか。
- `<A HREF="tel:0123456789">` とすれば電話がかけられる。HTML3.2にはない `ACCESSKEY` 属性をサポートしていて、これと組み合わせれば便利そうだ。
- `<A>` の解説に、タグとして `ACCESSKEY` が出てくるが、それは明らかに間違い。
- `ACCESSKEY` の値は、表紙とAタグの説明とでは指定できる文字に矛盾がある。
- `<BR CLEAR>` という表現を許すために、`<BR CLEAR=CLEAR>` を属性値に追加した。
- `<HR>` はヘアライン?? どっから持って来た訳だか。だいたいラインはLだろうが。レはレモンのレと言うのと同じだ。
- `<IMG>` は2階調GIFのみをサポートしている。URLの存在をチェックするようにしていれば、GIFかどうかはチェックされるが、2階調かどうかはチェックできない。
- CompactHTMLによって、`<A>` の要素に `<IMG>` が書けることになっているが、そのように実装されているか確認したい。
- `</P>` が出てこない。他にも `</DT>`、`</DD>`、`</LI>` が出てこない。当然CompactHTMLにはある。
- HTML3.2から追加したタグがあるように書かれているが、タグの追加はない。属性の追加はある。
- 文字セットはShiftJIS、文書サイズ2Kバイト以内という制限がある。この2Kバイトにはイメージファイルのサイズも含まれている。URLの存在をチェックするようにしていれば、それもチェックされる。
- いくつかの例を見ると、半角カタカナの使用を認めているようだ。

以下の制限はチェックしています。

- 文字セットと文書サイズ。
- `ACCESSKEY` の値。
- `<INPUT TYPE=TEXT>`、`<INPUT TYPE=PASSWORD>` での `SIZE` と `MAXLENGTH` の値。
- `<OPTION>` の件数と、`VALUE` の長さ。
- `<TEXTAREA>` の `COLS` と `ROWS` の値。

iモードで利用できる絵文字は、すべて機種依存文字の領域ですが、iモードチェック時には除外しています(SJISでのチェック時のみ)。(1999/10/19)

「ｉモード」は NTT DoCoMo の登録商標

### J-SkyWeb

だいぶタグが追加されていた。また、ステーション対応とかいうよくわからん機種があって、それだと、通常のJ-Sky対応機種よりも扱えるタグが多い。(2000/10/19)

J-フォン東京株式会社のスカイウェブの情報サービスメニュー向けのHTMLが公開されている。独自拡張した属性が多くあり、MML(Mobile Markup Language)という言語をベースにしている。W3Cにあるものではない。
利用者はHTMLで文書を記述しサーバに置く。スカイウェブサービスセンターは要求のあったHTMLを取得し、MMLに変換して端末に送信する。利用者がMMLそのものを意識する必要はない。(2000/06/18)

- 「エンコード形式 HTML4.0、3.2、2.0対応」というのはどういう意味か不明。どれでもMMLに変換しますよ、という意味か?
- `<P>` は空要素タグのようだ。なんと！
- `<IMG>` はPNGのみサポートしている。実際の表示はBMPに変換してから行なうようだが、そのときのサイズを32KBに収めろと言われても、利用者にそんなことはわかるまい。
- `<IMG>` の `MOTION` 属性は、アニメーションを実現するために同一タグ中にいくつも記述することができる。そんなのはSGMLじゃない！ってはじめからMMLって言ってるのか。
- `<A HREF="tel:0123456789">` とすれば電話がかけられる。
- 文字セットはShiftJIS、文書サイズ6Kバイト以内という制限がある。この6Kバイトにはイメージファイルのサイズも含まれている。URLの存在をチェックするようにしていれば、それもチェックされる。
- 半角カタカナが使えるのか使えないのか不明。`<INPUT MODE>` にはそのような選択肢はない。使えないことはないとは思うが?
- 実体参照に関する記述がない。MMLにあるものは書けるのであろう。`&#38;` なんてのは書けるのだろうか。これに関してMMLには言及がない。書けなくする実装は面倒なので `&#255;` までは書けるようにしとこう。
- `<UL>`、`<OL>` の入れ子は３階層まで、`<LI>` は99個まで、という制限がある。`<LI>` の制限は入れ子ごとに独立なのかどうかあいまい。入れ子も含めての制限と解釈した。

制限の多い SkyWeb には対応していません。

### ドットi

東京電話アステルのドットiと称する独自のHTML仕様が公開されている。iモードと非常によく似ているが、ちょっと違う。(2000/10/26)

- 「HTML2.0、3.2、4.0のサブセットです」と書いてあるが、言っていることが矛盾しているし、そういうような仕様でもない。どうも、iモードの仕様に書いてあるのをそのままコピーしたようにも見える。
- 「コンテンツ記述言語はＨＴＭＬのサブセットを使用しています」とも書いてある。意味不明。
- 「アステル絵文字が利用可能です」と書いてあるが、どういう風に利用するのか書いてない。
- 色の指定に "White" とか書けるのかわからない。すべての例示に色名は出て来ない。
- `<A HREF>` などのURLに指定できるスキームは http: mailto: tel: だけだと明記されている。

### HDML

EZwebなどで利用されている HDML(Handheld Device Markup Language)はHTMLではない。W3CにもDTDではなくBNFとして文法が示されている。だからSGMLでもない。

無理矢理DTDを作れば文法チェックできない話ではない。ただし、そのときでもデータ領域か、ファイル名の指定でのチェックとなる。HTTPでのアクセスはできない。

### 特許出願用HTML

特許庁では、HTML形式の書類によるパソコンでの特許の電子出願を受け付けています。ただし、専用のソフト(1998/12現在のバージョンは01.02b)を申請して取得しなければなりません。ソフト自体は無料です。また、パソコンはWindows95/NTのみを想定しているようですし、ISDN回線によるダイアルアップ接続のみをサポートしています。

ここで用いられる特許出願用HTMLはかなり異様なもので、SGMLとしての体裁を有していません。タグの少なさ以外に、特筆すべき性格として以下のようなものがあります。(*) 印の項目が例外扱いされて、チェックされたりされなかったりします。

- <HTML>以前にいかなる文字も書くことができない。DOCTYPEも書けない。(*)
- < とタグ名の間に空白を置くことを許している。
- <IMG>は行頭から始まらなければならない。
- <IMG>の後は行末まで空白以外の文字があってはならない。空白に全角空白が含まれるのかは明記されていない。
- 文字セットはShiftJISを想定しているが、実際に利用できる文字は限定されている。(*)
- Microsoft系の丸付き数字(ShiftJISコード0x8740〜0x8748)の使用を認めている。(*)
- 半角カタカナの使用を認めている。(*)

特許庁では、出願された文書を規定によって(HTMLではない文書に)再整形するわけですが、なぜ出願文書をこんなへんてこりんなHTMLにしたかは不明です。

### RFC2368

RFC2368は、RFC1738で定められている mailto: URL の構文の拡張を定義したものです。ここでは、mailto: URL が次のように定義されています。

         mailtoURL  =  "mailto:" [ to ] [ headers ]
         to         =  #mailbox
         headers    =  "?" header *( "&" header )
         header     =  hname "=" hvalue
         hname      =  *urlc
         hvalue     =  *urlc

これに対していくつか疑問があります。ご存知の方はお教えくださるとありがたいです。(1999/08/03)

- この構文はRFC1738から引用したように書かれていますが、RFC1738には `urlc` という構文要素は出てきません。RFC822にも出てきません(当然)。RFC2396の `uric` のことでしょうか。そもそもRFC1738にこのような構文は書かれていません。話の流れから言うと、uric から ? = & を取り除いたもののようです。
- 構文では `hname` と `hvalue` が共に空になり得るので、`=` だけのheader部が許されることになりますが、本当にそれでいいのでしょうか。

### RFC2396

RFC2396は、RFC1738をその後の経緯を踏まえて、一般化したURI構文を規定するものです。ここに書かれている構文で、「おや?」と思ったことを挙げてみます。(1999/08/28)

-           URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

  URI-reference は空でもよいということだが、ちょっと扱いにくいので、

            URI-reference = ( absoluteURI | relativeURI ) [ "#" fragment ] | "#" fragment

  としておこう。

-           absoluteURI   = scheme ":" ( hier_part | opaque_part )
            opaque_part   = uric_no_slash *uric

  一般URIとしてはいたしかたないのだが、opaque_part によって怪しげな文字列もマッチしてしまう。absoluteURI はあまり役に立たない。

            absoluteURI_hier = scheme ":" hier_part

  みたいなのを用意しておいた方がいいかも知れない。

-           abs_path      = "/"  path_segments
            path_segments = segment *( "/" segment )
            segment       = *pchar *( ";" param )
            param         = *pchar

  これによると、segment や param は空でよいので、path_segments も空でもよいということで、abs_path は "/" だけでもよいし、"/////////" のようなのでもよいということだ。segment は ";" だけでもOKなので、abs_path は "/;/;/;/;/;/;/" でもよいということだ。本当にそれでいいのか。

            abs_path      = "/" [ path_segments ]
            path_segments = segment *( "/" [ segment ] )
            segment       = 1*pchar *( ";" param ) | 1*( ";" param )
            param         = 1*pchar

  という風に解釈しておこう。

-           net_path      = "//" authority [ abs_path ]
            authority     = server | reg_name
            server        = [ [ userinfo "@" ] hostport ]
            userinfo      = *( unreserved | escaped |
                               ";" | ":" | "&" | "=" | "+" | "$" | "," )

  userinfo は空でもよいということだが、本当か。server も空でよいので、net_path が "//" だけでもよいということになる。本当か。

            net_path      = "//" ( authority [ abs_path ] | abs_path )
            authority     = server | reg_name
            server        = [ userinfo "@" ] hostport
            userinfo      = 1*( unreserved | escaped |
                               ";" | ":" | "&" | "=" | "+" | "$" | "," )

  という風に解釈しておこう。

-           IPv4address   = 1*digit "." 1*digit "." 1*digit "." 1*digit

  実際には 0〜255 までしか許されないはずなので、次のようにした方がいいかも知れない。

            IPv4part      = [ "0" | "1" ] digit [ digit ] |
                            "2" ( ( "0" | "1" | "2" | "3" | "4" ) digit |
                                  "5" ( "0" | "1" | "2" | "3" | "4" | "5" ) )
            IPv4address   = IPv4part "." IPv4part "." IPv4part "." IPv4part

  また、0.0.0.0 は禁止されているので取り除く必要があるのだが、それは面倒。

-           query         = *uric
            fragment      = *uric

  これはつまり、"http://www.uso800.ac.jp/hogehoge.cgi?" とか "http://www.uso800.ac.jp/hogehoge.html#" みたいに書いても問題なしということだ。

このサイトの運営は作者が行なっているわけではありませんのでご注意ください。作者が管理しているのはプライマリサイトだけです。