謎文書は「謎文書」と宣言すれば謎文書ではない、と云ふ事。
文書の冒頭に次の 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 )以外の文字を記述することはできません。注釈宣言なども不可なので、注意して下さい。
挿入される広告のソースは刻一刻変化します。このため、ここに記述した 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" >
過去のバージョンについても同様です。過去のバージョンの識別子については、改訂履歴をご覧下さい。
普通に記述していれば問題ありません。
W3C の validator は、xmlns 属性が記述されている文書を無条件に XML と見なしてしまう節があるので、チェッカでエラーが返るのが嫌な人は xmlns 属性を省略して下さい。
XML 宣言を記述する場合は、SGML 宣言と文書型宣言の間に記述して下さい。xml-stylesheet 処理命令についても同様です。なお、処理命令閉じは XML 同様 ?> にしてあります。
ただし、XML 宣言があると WinIE 6 がコケる
らしいので、書かない方が無難でしょう (情報感謝 > 沢渡さん, Piro さん)。
空要素の終了タグを記述できます。また、内容が空の要素は <br /> のように記述して構いません。
style 要素型と script 要素型は、どちらも CDATA の要素型して定義してあります。そのため、これらの要素の内容に注釈宣言を記述しても、注釈宣言とは見なされないので注意して下さい。
lang 属性と xml:lang 属性の両方に対応しています。
SGML の構文として検証を行うため、XML の構文として不正かどうかはチェックされません。従って、旧来の HTML として正しい範囲でタグや属性名が省略されていても、エラーにはなりません。
作成した定義は次の通りです。他は Modularization of XHTML のモジュール群を利用しています。
文書型定義の記述方法は、基本的に XHTML 1.1 などのモジュール利用 XHTML と同様です。ただし、一部ジオシティーズの記述を正当化するための定義変更をしています。また、XHTML のモジュール群を HTML のモジュールとして利用するために、若干トリッキーな方法を用いています。
属性値リテラル中の & をそのまま記述しているために、未定義の実体参照と見なされてしまう場合があります。以前 foo.html?foo=foo&fr=foo という記述がなされていたことがありました。この場合、fr という実体が宣言されている必要があるわけです。
広告の意図を変えずにこれを定義するには、次のような定義が考えられます。
<!ENTITY fr CDATA "&fr" >
こうしておけば、&fr が &fr に置換されることになります。同様に以下の一般実体を定義してあります。
<table><td> という記述がなされている箇所があります。このため、tr の開始タグを省略できるように変更しました。なお、table の定義は HTML 4.01 のものを用いているため、上の記述は実際には <table><tbody><tr><td> と見なされます。
table 要素に height 属性が記述されているので、これを追加定義しました。
img 要素の alt 属性、area 要素の alt 属性、script 要素の type 属性が省略されているため、これらの属性の省略時値を #IMPLIED として上書きしました。
属性値リテラルとして記述されるべき文字列を、属性値として記述してしまっている場合があります。これらについては、SGML 宣言で名前文字を追加することによって対応しました。以下の文字を名前文字として追加してあります。
/ は NESTC に割り当てられているので、余り名前文字にしたくない(区切り子が曖昧になることがあるかも知れない)のですが、背に腹は代えられないということで一つ。なお、# の方は RNI ですが、文書インスタンスには無関係なので特に問題ないでしょう。
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 | %Inline.mix; )*"> というような定義をしています。これらの定義は xhtml-html11.mod に記述されています。
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 "&#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 YES 、SHORTTAG STARTTAG NETENABL IMMEDNET 、EMPTYNRM 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 であるため、他の要素同様に空要素の終了タグも記述できます。SGML 宣言本体・文書型定義などファイルの再配布・改変等はご自由にどうぞ。ジオシティーズに .dtd や .sd のファイルをアップロードすることはできないようですが、拡張子を .txt にすればアップロードすることは可能です。
なお、このページを含む全ての関連リソースへのリンクは、当然ながら自由です。
これらの定義 (isweb 用を含む)を実際に使用しているサイトの一覧です :-)
SuikaWiki での突っ込みを受けて SGML 宣言に追記。
id に関して、やっぱり id の定義を修正する方向に転換 (参照: マーク付けノート, 2003-11-30)。細かい文法の話に更に追記。
HTML のフラグメント識別子 #概要 の問題に関連して、細かい文法の話に追記。
一般実体 on を定義しました。バージョン変わらず。(情報感謝 > Jehoshaphat さん, えむしぐまさん)
www.satoshii.org への移転に伴い、各定義ファイルの所有者識別子・システム識別子などを変更しました。度々申し訳ない。
また、暫定的に "2.2. システム識別子のオーバーライン" の項を削除しました。というか、あれは要するに文字コードのごにょごにょが原因であって、パーザ云々は直接関係ありませんよね?
所有者識別子を -//Mark no Tsukekata から +//IDN math.oheya.to に変更しました(下らねー)。
また若干定義を変更しました(バージョンは 1.1 のまま)。
各リソースを http://math.oheya.to/dtd/geo/ へ移動、それに伴って一部の記述を変更しました。
また、それぞれの定義を見直してリファインしたバージョン 1.1 を公開しました。
バージョン 1.0 からの変更は以下です。
INCLUDE に変更、併せて SGML 宣言の FORMAL YES を FORMAL NO に変更。INCLUDE されるマーク区間・重複するパラメタ実体などの宣言を簡略化。都立大 PCC サーバへの外部からのアクセスが制限されてしまったので、暫定の注記を追記。
XML 宣言に関する注意とリンク集を追記しました。あと、isweb 版 DTD の解説を記述(このページではありません)。
W3C 勧告の HTML からの変更は以下です。
XHTML に対応するため、文書型定義を一部改訂し、SGML 宣言本体を公開しました。また、それぞれのファイル・モジュールの識別子(FPI 及び参照 URI)を変更しました。公開・変更後のリソースは以下の通りです。
その他、この解説を公開しました :-)
W3C 勧告の HTML からの変更は以下です。
以下を公開しました。
その他、特になし。文書型定義を公開しただけです。