Another HTML-lint

はじめに

Another HTML-lint は、わたし個人が興味本位に Ringオープンラボラトリ の場をお借りして運営しています。 貧乏な作者のためにビールをおごってください :-)

HTMLの文法チェッカとして、Neil Bowers氏Weblint、および、それを日本語対応した石川雅康氏jweblint や、矢野啓介氏Libra が有名です。 Another HTML-lint の多くのアイデアは、これらから頂戴したものです。 また、Another HTML-lint は jweblint ではありません。 くれぐれも、そのような誤解から石川氏に迷惑がかからないようにお願いいたします。

先日(といっても1997年初頭だからずいぶん前のことだ)、jweblint を社内にインストールし、社内向けにゲートウェイサーヴィスを開始しました。 その際、提供されているHTMLやPerlスクリプトなどに若干の手直しをしました。 しばらく使用してみて、いろいろおかしな判定が気にかかるようになり、どのような方式でHTMLをチェックしているのか、 また、RFCなどで提供されているDTDがどの程度正確に反映されているのか、などの興味を抱き、Weblint (jweblint) のPerlスクリプトを解析し出したわけなんです。 その結果は、あまり納得のいくものではありませんでした。

もともと Weblint は厳密なチェックを目指していないので、結構お手軽に書かれています。 それにしても、お手軽すぎてあまりにも多くの情報を捨ててしまっていますし、データ構造はほとんどないに等しく、 ここの場面でこういうときはこうする、ああいうときはああする、といった場当たり的な処理の羅列に終始しています。 例えば、タグの出現順序、出現回数に関する情報は、<HTML>〜</HTML>タグに関するものしか持っていません。 しかも抽象化されていないので、他への応用が利きません。 また、終了タグを省略できる場合の処理もあまり正確ではありませんし、タグの要素として書くことを許されているタグに何があるのか、という情報は皆無です。 一部<A>とヘディング<Hn>の入れ子関係をチェックしていたり、<LI>などのリスティング関係のタグをチェックしているくらいです。 もうちょっとDTDの情報をうまく利用すれば、どのタグがどのタグ要素として許されるのか明白です。(1997/06時点の話なので、最新版は違うかも知れません)

というような調子なので、しばらくは手直ししながら利用していましたが、そのうちに、好みに改造するのも手間だし、 今後の拡張を正確に反映させていくにはそうとうな労力を要求されそうだと判断し、新規にHTMLチェッカを書き起こすことにしました。

あまりDTDぎちぎちのチェックをすると、ゆるやかなHTML評価をしている多くのWWWブラウザにとってはかえってありがた迷惑だし、 そんなのは専門のSGMLパーサがやればいい話なので、DTDの情報はなるたけ吸収するけれども、チェックはほどほどに、という態度でDTDの簡易パーサから作成しています。 だから、完全にDTDが反映されるわけでもないですし、実際DTDの記述と現実のWWWブラウザ(主にMozillaとMSIEなんだけど)の動作を比べて、 DTDの方を歪曲しちまってることすらあります。

専門のSGMLパーサとの最大の違いは、DTDでは規定されない多くの事柄をチェックしたり、望ましくないと判断されるスタイルもチェックすることです。

このように、チェックのよりどころはDTDなのですが、具合の悪いことにNavigator(Mozilla)用のDTDは存在しないのか公開されていないのかなので、捏造しなけりゃなりませんでした。

なにしろ本格的には書いたことのないPerl初心者なので、まずPerlから勉強し、あとは週末と夜中でだいたい片が付くだろうという予想で始めたんですが、だいたいそんなもんでした。難しいですね、Perlって。今はなき日経MIXでいろいろ教えていただきました。

Perl4入門的に書き始め、大幅な書き換えもせずに無理矢理 Perl5に移行しています。ソースは非常に汚いです。ご注意を。