綾小路龍之介の素人思考

[Another HTML-lint] Another HTML-lintでXHTML + MathML + SVG文書をチェック

XHTML + MathML + SVG文書はデフォルトではルールファイルが無いために正しくチェックできない。dtdからルールファイルを生成して、このフォーマットで書かれた文書をチェックする

まずは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 のようです。

リファレンス

  1. An XHTML + MathML + SVG Profile
  2. Sample XHTML + MathML + SVG document
  3. http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd
  4. http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd
  5. Another HTML-lint : Rule file
  6. [Valid] Markup Validation of http://www.w3.org/TR/XHTMLplusMathMLplusSVG/sample.xhtml - W3C Markup Validator

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-02-19T02:21:46+09:00
  2. Modified: 2010-02-19T02:21:46+09:00
  3. Generated: 2017-04-08T23:09:24+09:00