記事本文
Movable Type において、 IE にのみ text/html を指定する
Another HTML-lint と text/html と XHTML 1.1 - IE にのみ text/html を指定するで書いたコードを Movable Type のテンプレートに組み込む場合はどうすればいいのか。 これは PHP を用いた UA 判別ですので、 Movable Type を設置しているサーバに PHP がインストールされている必要があります。
テンプレート内に直接記述
判別部分のコードをテンプレートの先頭 ( XML 宣言や DOCTYPE 宣言よりも前 ) に書けばいいので、テンプレートの記述は以下のようになります。 なお、この例は文字コードを EUC-JP とし、 DOCTYPE 宣言を XHTML 1.0 Strict として記述しています。
<?php
$accept = $_SERVER['HTTP_ACCEPT'];
$ua = $_SERVER['HTTP_USER_AGENT'];
if (eregi("Opera", $UA)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} elseif (eregi("Another_HTML-lint", $_SERVER['HTTP_USER_AGENT'])) {
header ("Content-type: application/xhtml+xml; charset=EUC-JP");
} elseif (ereg("application/xhtml\+xml",$accept)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} else {
header ("Content-Type: text/html; charset=EUC-JP");
}
?>
<?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'."\n"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
( 以下省略 )
別ファイルに書き出してテンプレートから include
判別部分のコードの記述は、テンプレートの種類には全く関係がありません。 すなわち、 RSS などを除いた全テンプレートで共通の記述となります。 よって、判別部分のコードのみを記述したファイルをサーバに put しておき、 include で呼び出すようにすれば、ソースの簡略化が図れます。
この例では、判別部分のコードを ua.inc というファイルに記述し、ローカル・サイト・パス 直下に put したとして記述しています。
<?php include_once("<$MTBlogSitePath$>ua.inc");?>
<?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'."\n"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
( 以下省略 )
実際に生成される XHTML ソース
前項の例を用いたテンプレートで作られた記事の XHTML ソースを見ても、成功しているかどうかは確認できません。 HTTP ヘッダとして Media Type や Charset を送っていますので、実際のソース中には何も現れないからです。
これを確認するためには、 View HTTP Request and Response Header などのサービスを使うと良いでしょう。 ( ただし、このサービスで使われる UA である Web-Sniffer は、今回の判別コードでは考慮されていないため、 text/html として送出されます。 ) また、 Another HTML-lint と text/html と XHTML 1.1 - Another HTML-lint の小技で紹介している方法で確認するのも良いでしょう。
Another HTML-lint に拘りすぎないように
この方法は、 Another HTML-lint に対して、決め打ちで application/xhtml+xml として送出するようにするという方法なので、必ず行わなければならないというものではありません。 XHTML 1.0 を宣言している場合は text/html でも Another HTML-lint と text/html と XHTML 1.1 - XHTML 1.1 において、 text/html で Another HTML-lint による検証を行うで述べたようなエラーは出力されませんし。
XHTML 1.1 を宣言した文書は、 application/xhtml+xml として送出することが Should であると XHTML Media Types では述べられています。 しかし一部の未対応 UA に配慮して、 Should not と自覚しながら text/html として送出する際に、 Another HTML-lint ではエラーとして取り扱われる。 ならば text/html という妥協 ( この表現は適切でないかもしれません ) を行った時点で、このエラーが出力されることは致し方ないものとして捉えても良いのではないでしょうか。
404 : Another HTML-Lint の挙動に困惑にて
Another HTML-lint gateway が頑としてこれに OK サインを出さない
と書かれているのを読んで、そこまで気にするエラーじゃないですよ、と思いつつ一応の解決方法をそっと教えてみる次第。

