この記事ではブラウザに応じて動的に最適のルビ用HTMLコードを生成するPHPを紹介し、それを一例に「PHPの生成物としてのHTML/XHTML/XML」について考える。
<p>あなたは<?php ruby('妖精','フェアリー')?>とか、何かそういったものを見たことがありますか。</p>
ごらんのように、ruby(文字列1, 文字列2)
というコードで、文字列1に文字列2というルビをくっつける。スタティックなHTMLを使う通常の方法では、次のように書くこともできる。
<ruby><rb>妖精</rb><rp>(</rp><rt>フェアリー</rt><rp>)</rp></ruby>
PHPを使えば、ルビを上につけるか、かっこに入れるかで、別々にスタイルを指定できるように、中間生成物のHTMLを動的に変更できる。例えば:
HTMLとして原理的には2.の書き方が正しいというタテマエになっているが、現実問題として、IE5以降には1.のHTMLを与えたほうがレンダリングが最適化される(すでに画像を例示したように、ルビがちゃんとベース文字の上に乗っかる)。このルビのレンダリングは良い機能なので、ここではIEに対してはIE用のタグを送ってしまうことにしよう。例えば次のような関数定義をincludeしておけば良い。
function ruby($rb, $rt) { global $HTTP_USER_AGENT; if( ereg("MSIE 5", $HTTP_USER_AGENT) || ereg("MSIE 6", $HTTP_USER_AGENT) ) { print("<ruby><rb>$rb</rb><rp>(</rp><rt>$rt</rt><rp>)</rp></ruby>"); } else { print("$rb<span class=\"ruby\">($rt)</span>"); } }
XMLでいえば、ちょうどXSLTにあたるレイヤだ。一般のUAを対象とする場合、クライアントサイドは信頼できないので、サーバサイドで変換して、クライアントには初等的なHTML+CSSレベルで送るのがぶなんだろう。しかし、Mozilla と IE に対しては同じページを XHTML や XML で送り、Netscape 4 に対しては HTML3.2 で送るようにしても良い。動的に処理する部分は増えるが、テーブルそのほかHTML4でNetscape 4に処理させると滅茶苦茶になる要素や属性について、それにみあった Netscape 4 用の最適化を行うこともできる。(現に存在する以上)非視覚系ブラウザや視覚障害者を困らせてはいけないのと同様、現に広く使われている以上、Netscape 4 のユーザを困らせるべきでない……たとえいかほど内心いまいましく思っていても……だ。なぜなら、わたしたちのミッションは良質な情報を提供することであって、“正しい”フォーマットを使うことそれ自体じゃないから……(もちろんあなたのミッションは違うかもしれないし、それはそれでかまわない。)
話を戻して、上記に対応するCSSは例えば次のようになる。
.ruby { font-size: 80%; color: #393; } rt { font: 63.15789% "MS ゴシック", "MS UI Gothic", sans-serif; } a rt { text-decoration: none; }