まずはXHTML + MathML + SVG文書フォーマットで書かれた文書をダウンロードく
$ wget 'http://www.w3.org/TR/XHTMLplusMathMLplusSVG/sample.xhtml' --2011-10-29 00:16:51-- http://www.w3.org/TR/XHTMLplusMathMLplusSVG/sample.xhtml Resolving www.w3.org... 128.30.52.37 Connecting to www.w3.org|128.30.52.37|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 11298 (11K) [application/xhtml+xml] Saving to: “sample.xhtml” 100%[============================================>] 11,298 50.5K/s in 0.2s 2011-10-29 00:16:56 (50.5 KB/s) - “sample.xhtml” saved [11298/11298]
このファイルをhtmllintでチェックすると以下のような結果が得られる。DOCTYPEが不明なためmathmlに含まれるタグが不明といわれていることがわかる。このような場合はrule fileを作成する必要がある。
$ perl htmllint sample.xhtml | nkf -w sample.xhtml(2): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml(3): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml(4): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml(5): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml を XHTML1.0 Strict としてチェックします。 sample.xhtml(8): 6: 不明な DOCTYPE宣言です。XHTML1.0 Strict とみなします。 sample.xhtml(11): 2: <title> に xml:lang 属性を指定するときは lang 属性も指定するようにしましょう。 sample.xhtml(12): 1: 空要素タグ <link> を閉じるときは `/>` に空白を先行させましょう。 sample.xhtml(13): 1: 空要素タグ <link> を閉じるときは `/>` に空白を先行させましょう。 sample.xhtml(14): 1: 空要素タグ <link> を閉じるときは `/>` に空白を先行させましょう。 ... sample.xhtml(545): 8: <mo> は不明なタグです。 sample.xhtml(545): 8: </mo> は不明なタグです。 sample.xhtml(546): 8: <mo> は不明なタグです。 sample.xhtml(546): 8: </mo> は不明なタグです。 sample.xhtml(547): 8: <mn> は不明なタグです。 sample.xhtml(547): 8: </mn> は不明なタグです。 sample.xhtml(548): 8: </mrow> は不明なタグです。 sample.xhtml(549): 7: </math> は他のHTML用のタグです。 sample.xhtml(9): 2: <html> には lang 属性を指定するようにしましょう。 776個のエラーがありました。このHTMLは -2159点です。タグが 28種類 100組使われています。文字コードは UTF-8 のようです。
sample.xhtmlのDTDのURIを確認すると、http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd ということがわかる。
$ head sample.xhtml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/css" href="style/xhtml-default.css"?> <?xml-stylesheet type="text/css" title="ruby" href="style/ruby.css"?> <?xml-stylesheet type="text/css" href="style/style.css"?> <?xml-stylesheet type="text/css" href="style/hover.css"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr"> <head>
これをダウンロードする。
$ wget 'http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd' --2011-10-29 01:03:45-- http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd Resolving www.w3.org... 128.30.52.37 Connecting to www.w3.org|128.30.52.37|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 573471 (560K) [application/xml-dtd] Saving to: “xhtml-math-svg-flat.dtd” 100%[==============================>] 573,471 214K/s in 2.6s 2011-10-29 01:03:53 (214 KB/s) - “xhtml-math-svg-flat.dtd” saved [573471/573471]
Another HTML-lint : Rule fileに従って規則ファイルの雛形を作成する。
$ perl parsedtd.pl xhtml-math-svg-flat.dtd > xhtml-math-svg-flat.rul 0: Open 'xhtml-math-svg-flat.dtd' 189: Already defined parameter entity 'SVG.xmlns.decl.attrib' 190: Already defined parameter entity 'SVG.xmlns.decl.attrib' 202: Already defined parameter entity 'XHTML.xmlns.decl.attrib' 214: Already defined parameter entity 'MATHML.xmlns.decl.attrib' 273: Already defined parameter entity 'NS.decl.attrib' 353: Already defined parameter entity 'MATHML.math.class' 362: Already defined parameter entity 'SVG.pfx' 363: Already defined parameter entity 'SVG.svg.class' 5987: Already defined parameter entity 'SVG.prefix' ... 15403: Already defined general entity 'hellip' 15403: Already defined general entity 'loz' 15403: Already defined general entity 'mdash' 15403: Already defined general entity 'ndash' 15403: Already defined general entity 'spades' 15403: Already defined general entity 'thinsp' 15403: Already defined parameter entity 'plane1D' 15403: Already defined general entity 'Upsilon' 15403: Already defined general entity 'upsilon' 0: Close 'xhtml-math-svg-flat.dtd'
出来上がったルールファイルにunknownStyleElementsが含まれないことを確認する。この配列が含まれる場合はうまく変換できなかったということ。
$ grep unknownStyleElements xhtml-math-svg-flat.rul
common.rulの編集を行う。この中で作成したxhtml-math-svg-flat.rulがどの文書に適用されるかの定義を行う。common.rulに含まれるXHTML1.1の定義を確認すると以下のようになっている
'xhtml11' => { doctype => 'html\s+PUBLIC\s+["\']-//W3C//DTD\s+XHTML\s+1\.1//EN["\']', system => 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd', name => 'xhtml1\.?1', guide => 'XHTML1.1', abbr => 'XHTML1.1', group => 'XHTML1.1', order => ++$doctypescnt, version => 4.6, scheme => 'urn', charref => 1114112 },
このハッシュに対応した説明はcommon.rulの最初に書かれており、以下の内容
# DOCTYPE に関する情報 (キーはファイル名) $doctypescnt = 0; # doctype => DOCTYPE 宣言 (手抜きのため引用符の対応はいいかげん) # system => システム記述子 # guess => 不完全な宣言 (これから宣言を類推する) # superset => ここで示されたHTMLのサブセットであることを示す # name => 起動時オプションによる DOCTYPE 指定 # guide => ガイド文字列 # abbr => 短縮名 # expired => 廃棄された DOCTYPE のとき abbr と同じものを指定 # obsoleted => 旧式になったとき代替として abbr と同じものを指定 # group => グループ名 # order => 順序 # version => HTMLヴァージョン (XHTML1.0 は 4.5 XHTML1.1 は 4.6) # charref => 文字参照限界 # doclimit => 文書サイズ限界 (KB) # scheme => 追加スキーム # allschemes=> 利用可能なスキーム (未定義なら $allSchemes) # restrict => SJIS限定等 $restrictkana = 1; # 半角カナ可 $restrictsjis = 2; # SJISのみ $restrictsjiseuc = 4; # SJIS/EUCのみ $restrictsjisutf = 8; # SJIS/UTF8のみ # alloweuc => 機種依存文字から除外する文字コード (範囲を示す対で指定) # allowsjis => 機種依存文字から除外する文字コード (範囲を示す対で指定)
xhtml11の内容を参照して以下のように書いた。これを'xhtml11'の前に挿入。
'xhtml-math-svg-flat' => { doctype => 'html\s+PUBLIC\s+["\']-//W3C//DTD\s+XHTML\s+1\.1\s+plus\s+MathML\s+2\.0\s+plus\s+SVG\s+1\.1//EN["\']', system => 'http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg(|-flat).dtd', name => 'xhtml-math-svg', guide => 'XHTML1.1 MathML2.0 SVG1.1', abbr => 'XHTML1.1 MathML2.0 SVG1.1', group => 'XHTML1.1 MathML2.0 SVG1.1', order => ++$doctypescnt, version => 4.6, scheme => 'urn', charref => 1114112 },
再度チェックすると以下の結果が得られる。作成したルールファイルが使用されていることがわかる。ただし、エラーの内容がおかしい。
$ perl htmllint sample.xhtml | nkf -w sample.xhtml(2): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml(3): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml(4): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml(5): 0: 処理命令 `<?〜>` は理解できません。 sample.xhtml を XHTML1.1 MathML2.0 SVG1.1 としてチェックします。 sample.xhtml(16): 0: <head>〜</head> 内に <link rev="made" href="mailto:〜" /> が含まれていません。 sample.xhtml(16): 0: <head>〜</head> 内に <link rel="next" href="〜" /> などのナヴィゲーション用のリンクが含まれていません。 sample.xhtml(36): 0: <th> には abbr 属性を指定するようにしましょう。 sample.xhtml(37): 0: <th> には abbr 属性を指定するようにしましょう。 sample.xhtml(38): 0: <th> には abbr 属性を指定するようにしましょう。 sample.xhtml(39): 0: <th> には abbr 属性を指定するようにしましょう。 sample.xhtml(296): 9: <svg:svg> の属性 `viewBox` は小文字で書かなければなりません。 sample.xhtml(297): 9: </svg:title> に対応する開始タグ <svg:title> が見つかりません。 sample.xhtml(301): 0: <svg:polygon> の points の属性値が複数行に渡っています。 sample.xhtml(301): 9: </svg:polygon> に対応する開始タグ <svg:polygon> が見つかりません。 sample.xhtml(302): 9: </svg:svg> に対応する開始タグ <svg:svg> が見つかりません。 sample.xhtml(310): 9: <svg:svg> の属性 `viewBox` は小文字で書かなければなりません。 sample.xhtml(314): 0: <svg:polygon> の points の属性値が複数行に渡っています。 sample.xhtml(314): 9: </svg:polygon> に対応する開始タグ <svg:polygon> が見つかりません。 sample.xhtml(316): 9: タグ <svg:foreignObject> は小文字で書かなければなりません。 sample.xhtml(551): 9: タグ </svg:foreignObject> は小文字で書かなければなりません。 sample.xhtml(551): 9: </svg:foreignobject> に対応する開始タグ <svg:foreignobject> が見つかりません。 sample.xhtml(552): 9: </svg:switch> に対応する開始タグ <svg:switch> が見つかりません。 sample.xhtml(553): 9: </svg:g> に対応する開始タグ <svg:g> が見つかりません。 sample.xhtml(554): 9: </svg:svg> に対応する開始タグ <svg:svg> が見つかりません。 24個のエラーがありました。このHTMLは 41点です。タグが 39種類 338組使われています。文字コードは UTF-8 のようです。
エラーをひとつも検出できなかった場合は、以下のような出力になる。
$ perl htmllint 01-01.html | nkf -w 01-01.html を XHTML1.1 MathML2.0 SVG1.1 としてチェックします。 エラーは見つかりませんでした。\(^o^)/ このHTMLは 100点です。タグが 27種類 226組使われています。文字コードは UTF-8 のようです。