Geocities で valid な HTML を - マークの付けかた

はじめに

目次

1. 書き方

文書の冒頭に次の SGML 宣言と文書型宣言を記述して下さい。

<!SGML HTML
     PUBLIC "+//IDN satoshii.org//SD HTML for Geocities//EN"
            "http://www.satoshii.org/dtd/geo/geo-html.sd" >
<!DOCTYPE html
     PUBLIC "+//IDN satoshii.org//DTD HTML for Geocities//JA"
            "http://www.satoshii.org/dtd/geo/geo-html.dtd" >

面倒臭かったらシステム識別子だけでも結構です。

<!SGML HTML SYSTEM "http://www.satoshii.org/dtd/geo/geo-html.sd" >
<!DOCTYPE html SYSTEM "http://www.satoshii.org/dtd/geo/geo-html.dtd" >

後は普通に文書インスタンスを記述すれば、大概 valid になるはずです。HTML 4.01 、XHTML 1.x 、ISO-HTML などのバージョンの HTML の構文に対応しています(フレームセットにも対応しています)。

なお、SGML 宣言の前に空白文字( #x9 | #x20 | #xA | #xD )以外の文字を記述することはできません。注釈宣言なども不可なので、注意して下さい。

2. 注意

2.1. 広告のパターンと定義のバージョン

挿入される広告のソースは刻一刻変化します。このため、ここに記述した SGML 宣言及び文書型宣言にも適合しないようなパターンの広告が挿入される場合もありますが、それについては勘弁を。

なお、新しい問題(広告の記述ミス)を見付けた場合、適宜定義を改変していきます。もし「現在の」バージョンの定義を利用したい場合には、前書きを次のように記述して下さい。

<!SGML HTML
     PUBLIC "+//IDN satoshii.org//SD HTML for Geocities 1.1//EN"
            "http://www.satoshii.org/dtd/geo/geo-html11.sd" >
<!DOCTYPE html
     PUBLIC "+//IDN satoshii.org//DTD HTML for Geocities 1.1//JA"
            "http://www.satoshii.org/dtd/geo/geo-html11.dtd" >

過去のバージョンについても同様です。過去のバージョンの識別子については、改訂履歴をご覧下さい。

3. 細かい文法の話

3.1. 元の文書が旧来の HTML の場合

3.2. 元の文書が XHTML の場合

4. SGML宣言、文書型定義など

4.1. 使用した定義

作成した定義は次の通りです。他は Modularization of XHTML のモジュール群を利用しています。

+//IDN satoshii.org//SD HTML for Geocities//EN
SGML 宣言本体です。
+//IDN satoshii.org//DTD HTML for Geocities//JA
文書型定義です。
+//IDN satoshii.org//ENTITIES XHTML to HTML Module 1.1//JA
XHTML のモジュールを HTML のモジュールとして使用するためのモジュールです。

文書型定義の記述方法は、基本的に XHTML 1.1 などのモジュール利用 XHTML と同様です。ただし、一部ジオシティーズの記述を正当化するための定義変更をしています。また、XHTML のモジュール群を HTML のモジュールとして利用するために、若干トリッキーな方法を用いています。

4.2. ジオシティーズの広告の問題点と、それについての対処

未定義の実体が出現する。

属性値リテラル中の & をそのまま記述しているために、未定義の実体参照と見なされてしまう場合があります。以前 foo.html?foo=foo&fr=foo という記述がなされていたことがありました。この場合、fr という実体が宣言されている必要があるわけです。

広告の意図を変えずにこれを定義するには、次のような定義が考えられます。

<!ENTITY fr CDATA "&fr" >

こうしておけば、&fr&fr に置換されることになります。同様に以下の一般実体を定義してあります。

  • fr
  • state
  • snow
  • snb
  • snbn
  • top_from
  • top_to
  • course
  • diff
  • ticket
  • coupon
  • day
  • fa_spas
  • on
tr の開始タグが省略されている。

<table><td> という記述がなされている箇所があります。このため、tr の開始タグを省略できるように変更しました。なお、table の定義は HTML 4.01 のものを用いているため、上の記述は実際には <table><tbody><tr><td> と見なされます。

独自拡張の属性を追加

table 要素に height 属性が記述されているので、これを追加定義しました。

必須属性を省略可能に

img 要素の alt 属性、area 要素の alt 属性、script 要素の type 属性が省略されているため、これらの属性の省略時値を #IMPLIED として上書きしました。

不正な属性値が記述されている

属性値リテラルとして記述されるべき文字列を、属性値として記述してしまっている場合があります。これらについては、SGML 宣言で名前文字を追加することによって対応しました。以下の文字を名前文字として追加してあります。

  • #
  • /

/NESTC に割り当てられているので、余り名前文字にしたくない(区切り子が曖昧になることがあるかも知れない)のですが、背に腹は代えられないということで一つ。なお、# の方は RNI ですが、文書インスタンスには無関係なので特に問題ないでしょう。

4.3. XHTML のモジュールを HTML のモジュールとして流用する

XHTML モジュールでの要素型宣言は次のような形式で記述されています。

<!ELEMENT %foo.qname; %foo.content; >

foo.qname の実体は要素名であり、foo.content の実体は内容モデルです。XML ならこれで問題ないわけですが、旧来の HTML ではタグ省略が可能です。ジオシティーズの広告にもタグが省略されている箇所があるので、SGML 宣言は OMITTAG YES でなければなりません。しかし OMITTAG YES の場合、要素型宣言にはタグ省略最小化(- O など)の記述が必須になります。つまり、上のような記述がなされているモジュールをそのまま利用することはできないわけです。

これについては、やむを得ず foo.content にタグ省略最小化も記述してしまうという不思議マークアップで対処しました。具体的には、全ての要素型に対して <!ENTITY % p.content "- O ( #PCDATA | &#37;Inline.mix; )*"> というような定義をしています。これらの定義は xhtml-html11.mod に記述されています。

4.4. SGML 宣言

SGML 宣言については、面倒なので Web SGML 関連の解説などをご覧下さい。以下に SGML 宣言本体の主要な定義を抜粋しておきます。

"ISO 8879:1986 (WWW)"  -- SGML Annex K 準拠 --

     CAPACITY NONE  -- 量的制限はなし --

     SYNTAX
         NAMING
             LCNMCHAR "#-./:_"  -- 名前文字は HTML 4.01 に同じのつもりでしたが --
             UCNMCHAR "#-./:_"  -- 不正な属性値に対応するため若干追加 --
             NAMECASE
                 GENERAL YES  -- 共通識別子などの大文字小文字は区別しない --

         DELIM
             GENERAL  SGMLREF
             HCRO     "&#38;#x"  -- 区切り子は XML に同じ --
             NESTC    "/"
             NET      ">"
             PIC      "?>"

     FEATURES
         MINIMIZE
             OMITTAG YES  -- タグ省略は可能 --
             SHORTTAG
                 STARTTAG
                     EMPTY    NO  -- 空タグ・閉じないタグは禁止 --
                     UNCLOSED NO
                     NETENABL IMMEDNET  -- 空要素には NET を記述可能 --
                 ENDTAG
                     EMPTY    NO  -- 空タグ・閉じないタグは禁止 --
                     UNCLOSED NO
                 ATTRIB
                     DEFAULT  YES  -- 属性関係の省略は全て使用可能 --
                     OMITNAME YES
                     VALUE    YES
             EMPTYNRM  YES  -- 空要素の終了タグも他の要素と同様に扱う --

         OTHER
             FORMAL   NO  -- 記法モジュールのため --
             KEEPRSRE YES  -- 空白は保持 --
             VALIDITY TYPE  -- 型妥当性を検証する --

     SEEALSO NONE  -- XML などの記法は無視 --

特に重要なのは OMITTAG YESSHORTTAG STARTTAG NETENABL IMMEDNETEMPTYNRM YES です。これらの定義によって、空要素は次の三通りで記述することができます。

<br>
OMITTAG YES であり、空要素は終了タグの位置が自明(開始タグ直後に出現する)であるため、終了タグを省略することができます(厳密には、OMITTAG YES かつ EMPTYNRM YES であり、空要素が - O EMPTY と宣言されているため)。
<br />
EMPTYNRM YES であり SHORTTAG STARTTAG NETENABL IMMEDNET (NET "/" NESTC ">") であるため、空要素の開始タグを <br / として、終了タグを > として記述できます。ただし、/ を名前文字に含めているため、要素名や属性値と /> の間には必ず空白文字をはさんで下さい (ご指摘感謝 > SuikaWiki の中の人)。
<br></br>
EMPTYNRM YES であるため、他の要素同様に空要素の終了タグも記述できます。

A. 改変等はご自由に

SGML 宣言本体・文書型定義などファイルの再配布・改変等はご自由にどうぞ。ジオシティーズに .dtd や .sd のファイルをアップロードすることはできないようですが、拡張子を .txt にすればアップロードすることは可能です。

なお、このページを含む全ての関連リソースへのリンクは、当然ながら自由です。

C. 改訂履歴

2004年2月23日

SuikaWiki での突っ込みを受けて SGML 宣言に追記。

2003年11月30日

id に関して、やっぱり id の定義を修正する方向に転換 (参照: マーク付けノート, 2003-11-30)。細かい文法の話に更に追記。

2003年11月26日

HTML のフラグメント識別子 #概要 の問題に関連して、細かい文法の話に追記。

2003年11月16日

一般実体 on を定義しました。バージョン変わらず。(情報感謝 > Jehoshaphat さん, えむしぐまさん)

2003年11月04日

www.satoshii.org への移転に伴い、各定義ファイルの所有者識別子・システム識別子などを変更しました。度々申し訳ない。

また、暫定的に "2.2. システム識別子のオーバーライン" の項を削除しました。というか、あれは要するに文字コードのごにょごにょが原因であって、パーザ云々は直接関係ありませんよね?

2002年04月25日

所有者識別子を -//Mark no Tsukekata から +//IDN math.oheya.to に変更しました(下らねー)。

2002年04月24日

また若干定義を変更しました(バージョンは 1.1 のまま)。

  • フレームセットに対応。
  • 一部記述を簡略化。
2002年04月23日

各リソースを http://math.oheya.to/dtd/geo/ へ移動、それに伴って一部の記述を変更しました。

また、それぞれの定義を見直してリファインしたバージョン 1.1 を公開しました。

バージョン 1.0 からの変更は以下です。

  • pre 要素型の内容モデルが不正確だったので、修正。
  • xhtml-notations-1.modINCLUDE に変更、併せて SGML 宣言の FORMAL YESFORMAL NO に変更。
  • 実体 XHTML.profile (head 要素の profile 属性のデフォルト値)にこのページの URI を設定。
  • legacy-model10.mod 及び legacy-qnames10.mod を不使用にし、代えて xhtml-legacy-redecl.mod を使用。
  • デフォルトで INCLUDE されるマーク区間・重複するパラメタ実体などの宣言を簡略化。
2002年04月18日

都立大 PCC サーバへの外部からのアクセスが制限されてしまったので、暫定の注記を追記。

2002年02月19日

XML 宣言に関する注意リンク集を追記しました。あと、isweb 版 DTD の解説を記述(このページではありません)。

2002年02月16日

W3C 勧告の HTML からの変更は以下です。

  • 以下の一般実体を追加。
    • state
    • snow
    • snb
    • snbn
    • top_from
    • top_to
    • course
    • diff
    • ticket
    • coupon
    • day
    • fa_spas
  • area 要素型の alt 属性を省略可能に。

XHTML に対応するため、文書型定義を一部改訂し、SGML 宣言本体を公開しました。また、それぞれのファイル・モジュールの識別子(FPI 及び参照 URI)を変更しました。公開・変更後のリソースは以下の通りです。

その他、この解説を公開しました :-)

2001年12月18日

W3C 勧告の HTML からの変更は以下です。

  • 一般実体 fr を追加。
  • tr の開始タグを省略可能に。
  • table 要素型に height 属性を追加。
  • img 要素型の alt 属性、script 要素型の type 属性を省略可能に。

以下を公開しました。

その他、特になし。文書型定義を公開しただけです。

E. この文書のステータス

URI
http://www.geocities.co.jp/Hollywood-Studio/8691/
初版
2001-12-18
最終更新
2004-02-23
著者
石川哲志
Copyright © 2001-2004 Satoshi ISHIKAWA, All Rights Reserved.