「ruby 要素をいわゆるルビの形に整形するスタイル」というのは、北村さんが "Mozilla でルビ表示" で提案し、Piro さんが "N6 & Moz 用コンテキストメニュー拡張" に実装したりしています。そこでふと思い付いて、この逆を行く「ルビに整形しない ruby 要素のスタイル」というものを考えてみました。
ruby, rbc, rb, rtc, rt { /*[共通] ルビに整形されぬよう、ユーザスタイルを上書き*/
position:static;
display:inline;
}
rp { /*[単純ルビ] 生テキストの括弧を除去*/
display:none;
}
ruby > rt:before { /*[単純ルビ] rtに開き括弧を追加*/
content:"(";
}
rbc + rtc:before { /*[複雑ルビ] 最初のrtcに開き括弧を追加*/
content:"(";
}
rtc > rt:before { /*[複雑ルビ] rtの前に区切りのハイフンを挿入*/
content:"-";
}
rtc > rt:first-child:before { /*[複雑ルビ] 各rtcの最初の子rtにはハイフンを追加しない*/
content:"";
}
rtc + rtc:before { /*[複雑ルビ] 後側ルビがある場合、区切りのスラッシュを挿入*/
content:" / ";
}
ruby:after { /*[共通] rubyの後に閉じ括弧を追加*/
content:")";
}
/*
CSS3勧告待ち(上のruby:afterより、こちらの方が好ましい)
ruby > rt:after,
rtc:last-child:after {
content:")";
}
*/
具体的な例で考えてみます。
<ruby><rb>妥当</rb><rt>だとう</rt></ruby>
<ruby>
<rbc><rb>整</rb><rb>形</rb><rb>式</rb></rbc>
<rtc><rt>せい</rt><rt>けい</rt><rt>しき</rt></rtc>
<rtc><rt rbspan="3">well-formed</rt></rtc>
</ruby>
上のruby要素は、それぞれ次のようにレンダリングされます。
妥当(だとう) 整形式(せい-けい-しき / well-formed)
テキストブラウザなどでは、こういう実装が現実的なのではないでしょうか。
その前に取り敢えず更新履歴を。妥当 XML の仕組みを公開しました。XML が SGML でどのように定義されているのか、という解説です。
Mozilla 0.9.8 / Mac OS9 、カナかな団の躁鬱や遠吠えなどでスクロールバーが機能しなくなる(スクロールアローは有効)という現象が発生しているのですが、うちだけでしょうか?
何となくCSS絡みのような気がするものの、原因は特定できず。
整形式 XML の仕組みを公開しました。整形式の XML で、何故 &
などの実体参照を宣言せずに記述できるのか、何故文書型宣言を省略することができるのか、といったことを解説しています。
妥当 XML の仕組みの続きなので、先にこちらを読まないとよく解らないかも知れません。ちなみにこちらでは、XML では何故空要素の終了タグを記述できる(記述しなければならない)のか、何故 NET を使用できるのに空タグや閉じないタグは使用できないのか、といったことを解説しています。
祝バージョン2.0リリースということで、スタイル無効化に使われるユーザスタイルシートから。
br + br + br { /* 3つ以上連続するbrをブチ殺す 「フォントいぢり系」への皮肉だけども 他のフツーのレガシー HTML ページへの 悪影響が大きいのでとりあえず保留。 */ /* display: none !important; */ }
これは世に聞く侍殺し
ってやつですか。
# ローカルで br + br
にして適用しておきました :-)
妥当 XML の仕組みに容量集合と量集合を追記しました。Web SGML 適応では SGML 宣言に CAPACITY NONE
、SYNTAX QUANTITY NONE
という宣言値が認められる、というだけのことですが。
# 流石にこんな所までですます調で書くのはたるい。ので普通の文章にします。
今更ながら、XML では CDATA 区間を記述する際に <![ CDATA [
のように記述してはいけないということに気付く。Extensible Markup Language (XML) 1.0 (Second Edition) によれば、CDATA 区間の定義は次の通り。
[18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '<![CDATA['
つまり、マーク区間の状態見出し語が "CDATA"
の時には、見出し語の前後に空白を入れられないことになっているのである。
丸二日掛かって、ようやくFTPクライアントで接続できる状態に回復。
ここのサーバは幾ら何でもトラブルを起こし過ぎだと思うのだが。どうにかして下さい。
これは都立大 PCC サーバ (pcc.metro-u.ac.jp) 当時の話です。
またダウンしています。
あなたのブラウザは、次の記述をどのように描画するでしょうか。
tbody {
border:solid thin black;
}
table, tr, td {
border:none;
}
<table>
<tr><td>item 1-1</td><td>item 1-2</td></tr>
<tr><td>item 2-1</td><td>item 2-2</td></tr>
</table>
この文書が HTML 4.01 などであれば、table 要素の直下には tbody 要素があることになりますから、表には枠線が付くのが正しい挙動です。一方、XHTML の場合にはタグの省略という概念がありませんから、当然表に枠線は付きません。
手元のブラウザで HTML 4.01 Strict (文書型宣言システム識別子あり/なし)、XHTML 1.0 Strict 、XHTML 1.1 それぞれのバージョンの文書と、文書型宣言のない文書を表示させてみたところ、こんな結果になりました。
MacIE 5.x が枠線を表示する辺り、流石という感じでしょう。まあ XHTML の場合にも表示してしまうんですが、これは XHTML 1.0 の勧告(2000年01月26日)と MacIE5.0 のリリース(2000年03月27日)の時期を考えれば仕方ないように思います。
Mozilla 辺りは文書型宣言を見ての表示の切換に対応していても良さそうなんですけどね。誰か bugzilla に言ってないのかな?
以前に公開した Geocities 用の DTD (-//bungaku-shitsu//DTD Geo-HTML 0.93//JA) を若干修正し、SGML 宣言を新たに加えました。主な変更は XHTML に対応するためのものです。なお、今回の更新にあたってきちんと解説も書きました。
それから、ついでに isweb 用の DTD も公開しました。この辺りもまあ何とか定義できます。文書要素が html 要素じゃありませんけど。全ての記述の前にスクリプトを挿入するような広告形式でない限りは、大概何とかなります。
1.0 バージョンの SD/DTD はどこかに行ってしまいました…というか、1.0 → 1.1 のバージョンアップは上書きしてた気もするような。
いや、なんでこんなものを書いたかというと、広告が入って valid にならないのは仕方ないとばかり、HTML 4.01 Transitional ですらなく ISO-HTML や 果ては XHTML の文書型宣言を書いているサイトを見掛けるので。少なくともパーザの挙動なんかを考慮する限り、そんなことは絶対にしてはいかんと思います。
Strict にあらずんば HTML にあらず
とは言いますが、文書が SGML に適合しているっていうのはそれ以前の大前提です。パーザは「妥当じゃないのは広告のせいなんだ」なんてことを汲んでくれたりはしません。HTML を読むの相手はあくまで人間ではなくパーザなのですから、この辺りはシビアに考えるべきだと思います。
つまり何を言いたいのかというと、妥当でない文書を公開している人間が Strict について語ってはいかんだろうということです。…主に自戒ですが。
TCUP 掲示板を捨てて isweb のアカウントを取ろうかと考慮中。
W3C の URI は http://www.w3.org/ なのですが、実は http://www.w3c.org/ にアクセスしても前者の URI に転送されます。
さて、ここで問題です。XHTML の名前空間は http://www.w3.org/1999/xhtml ですが、次の例文は XML として妥当でしょうか。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
<html xmlns="http://www.w3c.org/1999/xhtml">
<head>
<title>Sample</title>
</head>
<body>
<p>Hey world!</p>
</body>
</html>
解答…妥当ではありません。
何故かというと、xmlns 属性の定義が以下のようになっているからです(展開後)。
<!ATTLIST html
xmlns CDATA #FIXED 'http://www.w3.org/1999/xhtml'
>
xmlns 属性の値は "http://www.w3.org/1999/xhtml" で固定ですから、たとい最終的な意味合いが同じでも、異なる文字列である "http://www.w3c.org/1999/xhtml" を指定することはできないわけです。おしまい。
というか、そもそも名前空間の URI ってそういうものじゃありませんけどね。
XML Blueberry Requirements を日本語のページから検索したら、6件しかヒットしなかったという。後者のページはヒットしたものの一つ。CSS コミュニティへの参画を推奨します(謎)。
ていうか、コミュニティの人の別サイトじゃありませんよね?
予想通りに復旧しました。
そこまでして、geocitiesっていうのがすごいのか、単純にDTD作っちゃうところがすごいのか、そういう発想をしたのがすごいのか、誰にも使われないのに自己満足で公開しちゃってるとこがすごいのか、今ひとつわからない。が、スゲー。
何が凄いって、某方面には実際に使ってしまう人がいるという辺りがキモかと。
Unicode Technical Report #20
だそうです。今日はもう寝るので、神崎さんの解説待ち。やや他力本願。
IE6 ってやつは、 SGML 宣言と XML 宣言が同時にあると XML パースエラーでコケやがるのな。脱力。
ありがちな罠でした。注記を書いておきました。
以下ついでに、isweb の方の DTD についての解説を書いておきます。isweb の広告の問題点と、それについての対処。
適宜追加定義しました。
#REQUIRED
を適宜 #IMPLIED
に上書き定義しました。
body.content を上書きしました。
文書作成者が OMITTAG YES
な HTML を使い、html 要素と body 要素の終了タグを省略していれば問題ありませんが、これらのタグを記述していてもよいように変更。(html, div?)
を内容に持ち、開始タグ・終了タグともに省略可能な Pre-HTML 要素型を定義し、文書要素を html 要素から Pre-HTML 要素に変更しました。
<!DOCTYPE Pre-HTML ..>
<html>
...
</html>
<div>
...
</div>
このマーク付けは、次のマーク付けと等価になります。
<!DOCTYPE Pre-HTML ..>
<Pre-HTML>
<html>
...
</html>
<div>
...
</div>
</Pre-HTML>
きちんと文書は一つの文書型宣言に対して一つの文書要素を持つ
という制約を守っていると見なされるわけです。
# 既に HTML 文書ではなくなってしまっていますが、気にしないように。
table 要素内に <td><spacer><form></td>...<td><spacer></form></td>
という記述があり、form 要素のネストが不正になっています。これを無理矢理正当化するために、td 要素型の内容モデルを (form)
に、form 要素型の内容モデルを ( #PCDATA | %Flow.mix; )*
にそれぞれ変更し、form 要素型の開始タグ・終了タグどちらも省略可能に変更しました。併せて、form 要素の必須属性である action 属性を省略可能に変更しています。
<table>
<tr>
<td><spacer></td>
</tr>
<tr>
<td><spacer><form></td>
<td><a><img></a></td>
<td><a><img></a></td>
<td><input></td>
<td><input></td>
<td><input></td>
<td><input></td>
<td><spacer></form></td>
</tr>
</table>
結果的に、このマーク付け(属性略)は次のマーク付けと等価であると見なされます。
<table>
<tr>
<td><form><spacer></form></td>
</tr>
<tr>
<td><form><spacer><form></form></form></td>
<td><form><a><img></a></form></td>
<td><form><a><img></a></form></td>
<td><form><input></form></td>
<td><form><input></form></td>
<td><form><input></form></td>
<td><form><input></form></td>
<td><form><spacer></form></td>
</tr>
</table>
つまり、前者のマーク付けでの <form>
と </form>
はそれぞれ別々の要素として扱われ、特に </form>
の方は「自明な終了タグだから省略してもよいものをわざわざ記述したもの」というように見なされるわけです。
かくしてこの文書は valid になったのでした。めでたしめでたし。
後に isweb の広告が変更されて、この DTD では対応が不可能になってしまいました。新しい SD/DTD については、2003-02-21: SD/DTD for isweb ver. 2.0 を参照して下さい。
他に HTML/4 な割りに ruby 要素仮対応も考えてる。base の下に書くのは遣らない予定だけど、何か意見有る?
ルビに整形しない ruby 要素方式なら複雑ルビへの対応も簡単(?)ですよ、と言ってみるテスト。いや、ルビっぽくはないというか、見た目地味ですけど。
MacIE 5.x が XML + CSS (xml-stylesheet 処理命令) で撃墜される、というのはあんまり知られていないのかも知れない。
このサイトのスタイルは、XHTML 文書を text/xml にして、xmlns 属性を外した上で Mozilla に表示させて確認しています。で、その時には勿論 xml-stylesheet 処理命令を使っているので、うっかりこれを IE にドロップしてしまうと即クラッシュしてしまうという。
問1:次の文書に妥当でない点があれば指摘しなさい。
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd" >
<html>
<head>
<title>例1</title>
</head>
<body>
<p>
これは"HTML"という形式で記述された<文書>です。
体育座りのアスキーアート → &&&&&&&
</p>
</body>
</html>
さて、どうでしょうか。解答は後ほど。
問1:次の文書に妥当でない点があれば指摘しなさい。
title 要素が二つ存在する。
うわ、お恥ずかしい限りです。修正しました。
当時は ins で修正していたのですが、Module-based XHTML では pre の内容に ins を書けないということを考慮して、直接 PCDATA として記述することにしました。(一応 XHTML 1.0 的には pre > ins はセーフなんですが、互換性のため)
何の気無しに昔のねこめしにっきを読み直していたら、僕が初めて Another HTML-lint を知った記事を見付けた(闇黒日記を知ったのも多分この記事)。しかも、記事の日付が丁度去年の今日。今日は Another HTML-lint を知って一周年という記念すべき日であるらしい。
それでも去年の今頃はまだ、一回 lint でチェックしてえらいことになって、「とりあえず DOCTYPE 宣言って何だか解んないから放置」とかやっていたわけで。DOCTYPE 宣言なるものを初めて書くのは、それから一ヶ月とちょっと後のことになる。
何かコメントアウトしてあったのですが(雑記っぽかった(*)からかな?)、公開することにします。
* 当時、日常の雑記やネタは皆無
という注意書きをしていた。
取り敢えず、解答は「この文書は妥当である」です。エラーは何一つありません。
HTML では <
という文字が開始タグの始まりと見なされることがあります。こういった「実体参照の開始」や「タグの終了」を示す文字列を区切り子と呼ぶのですが、こうした文字列が実際に区切り子と見なされるためには、その文字列が幾つかの条件を満たしている必要があります。
この「区切り子と見なされるための条件」を満たさない文字列は、単なる文字データとして扱われます。これはエラーの結果そう扱われるのではなく、完全に適切な記述としてそう扱われるという点に注意して下さい。例えば p 要素の内容としての <! ---->
という記述は、<! ---->
という記述と全く等価です。
さて。<
>
&
"
という文字列を文字データとして記述する場合、多くの人は(その必要がなくとも)これらを文字参照として表現します。しかし、タグ閉じ >
を特別扱いする割に、参照閉じ ;
や NET 可能開始タグ閉じ /
を特別扱いする人はまずいません。あるいは、リテラル識別子 "
を特別扱いする割に、これと全く同じ働きをする代替リテラル識別子 '
を特別扱いする人もほとんどいないでしょう。これは若干矛盾していますね。
;
がエスケープされないのと同じ理由で、実際には >
のエスケープが必要になることもまずありません。どうしても >
をエスケープする必要があるのは、マーク区間の中外で ]]>
という文字データを記述する場合だけです。
しかし、こうした記述が SGML 的に正しいということには、パーザが書き損じに寛大になってしまうというデメリットもあります。例えばタグ閉じをうっかり二度打ちして <p>>
としてしまっていても、SGML 的には妥当であるためエラーにはなりません。しかし、こうしたタグや属性に関する typo はウェブブラウザの処理結果を大きく変えてしまいがちです。
Another HTML-lint には、こういった書き損じを検証するためのメタ文字 `X` は `&xx;` と書かなければなりません。
というチェック項目があります。結果の解説に書いてある通り、このチェックは本来妥当な記述に対してもエラーを返しますが、チェッカの挙動としては親切であると思います(ある意味お節介かも知れませんが)。
こうしたチェック方法を有効にする意味では、やはり「頻繁に区切り子として使う文字列」を文字参照として記述することにも一理あるわけです。ただ、厳密な文法としては不要な記述であるということも、知識として知っていてもよいのではないかと思います。
なお、上記の「ある文字列が区切り子と見なされるための条件」とは、下記のようなものです (HTML 4.01 の場合)。
<
(開始タグ開き) 及び etago </
(終了タグ開き)要素内容(またはその中のマーク区間)、またはタグの中でのみ認知する。タグの中で認知するのは「閉じないタグ」の機構のため(例えば <p<em>
)。ただし、直後に名前開始文字ないし tagc >
が続かない場合には認知しない。tagc は空タグのため。
>
(タグ閉じ)タグの中で認知するか、または文脈区切り子としてのみ認知する。文脈区切り子として認知するとは、直前の文字列と組で区切り子として認知されるということ。例えば空の開始タグ <>
を記述した場合、stago は直後の etago によって制約を満たすが、>
が etago と認知されるのは、これが文脈区切り子として解析されるためである。
# 要素内容やリテラル内での >
は、XML でも直接記述できます。
/
(NET 可能開始タグ閉じ)タグの中でのみ認知する。
/
(簡略終了タグ)開始タグが NET 可能開始タグとして記述されている要素の内容、またはその中のマーク区間の中でのみ認知する。
=
(値標識)タグの中でのみ認知する。
"
(リテラル識別子) 及び lita '
(リテラル識別子(代替))タグ、マーク宣言、またはリテラルの中でのみ認知する。タグないしマーク宣言の中で認知する場合にはリテラル開始として、リテラルの中で認知する場合はリテラル終了として、それぞれ認知する。
# 従って、要素内容に "
という文字列を記述しても区切り子と見なされることはなく、妥当な文字データとして扱われます。もっとも前述の通り、他のミスをチェックするためには文字参照として記述する方が「便利」ではあるでしょう。
# 以前議論になった「文字データとしての "
は "
とすべきか」という問題の結論としては、「lit で開始したリテラル内で記述する場合は必須。要素内容や、lita で開始したリテラル内では任意。ただし、常に "
とした方が便利ではある」ということになります。つまり、<p title="…"…"…">
の場合は必須、<dfn title='…"…"…'>
や <p>…"…"…</p>
の場合は任意です。
&
(実体参照開き)要素内容(またはその中のマーク区間)、またはリテラルの中でのみ認知する。ただし、直後に名前開始文字が続かない場合には認知しない。
&#
(文字参照開き)要素内容(またはその中のマーク区間)、またはリテラルの中でのみ認知する。ただし、直後に数字ないし名前開始文字が続かない場合には認知しない。
&#x
(十六進数文字参照開き)要素内容(またはその中のマーク区間)、またはリテラルの中でのみ認知する。ただし、直後に十六進数([0-9a-fA-F])が続かない場合には認知しない。
# もっとも、&#x
に十六進数が続かない場合には、これは cro + 名前開始文字 と見なされてエラーになります(HTML 4.01 には x で始まる機能文字はありません)。
<!
(マーク宣言開き)要素内容(またはその中のマーク区間)、または宣言サブセット(またはその中のマーク区間)の中でのみ認知する。
ただし、直後に名前開始文字ないし mdc >
ないし com --
ないし dso [
が続かない場合には認知しない。mdc は空の注釈宣言のため、com は注釈宣言のため、dso はマーク区間宣言のため。
>
(マーク宣言閉じ)マーク宣言の中で認知するか、または文脈区切り子としてのみ認知する。例えば空の注釈宣言 <!>
を記述した場合、mdo は直後の mdc によって制約を満たすが、>
が mdc と認知されるのは、これが文脈区切り子として解析されるためである。
--
コメント識別子マーク宣言の中で認知するか、または文脈区切り子としてのみ認知する。例えば注釈宣言 <!-- -->
を記述した場合、mdo は直後の com によって制約を満たすが、最初の --
が com と認知されるのは、これが文脈区切り子として解析されるためである。