先頭の方( DOCTYPE 宣言やら XML 宣言やら)をごにょごにょしたり、空要素タグを置換したりしただけですが、一応 HTML での出力ができました。
PHP で出力をフックさせることって出来ないのかな。
なんてことを言っていたのですが、本当にまんま同じことが出来ました。
toHTMLStart 関数で以降の出力を toHTML 関数に通す。 toHTMLEnd 関数でフックを終了。みたいな。
/*
* HTMLの場合、空要素タグを置換
*/
// グローバル変数を設定
function setIsHTML() {
global $isHTML;
$isHTML = ( preg_match( '/[,^]\s*application\/xhtml\+xml\s*([,;$])/', $_SERVER["HTTP_ACCEPT"] ) == 0 ) || ( $_GET['type'] == 'html' );
}
setIsHTML();
// 値を取得
function GetIsHTML() {
global $isHTML;
return $isHTML;
}
// 置換
function toHTML( $buffer ) {
if( GetIsHTML() ) {
$buffer = ereg_replace( ' ?/>', '>', $buffer );
}
return $buffer;
}
// 以降の出力をフック
function toHTMLStart() {
ob_start( 'toHTML' );
}
// フックを終了
function toHTMLEnd() {
ob_end_flush();
}
// 投稿内容とコメント本文が置換されるようにアクションを設定
add_action( 'the_content', toHTML, 100 );
add_action( 'comment_text', toHTML, 100 );
アクションを設定しているので投稿内容とコメント本文は自動で置換されます。後は本当に空要素を使っているところを、 <?php toHTMLStart(); ?> から <?php toHTMLEnd(); ?> で囲むだけ。いや、空要素を使っているところを部分部分でなく、全部をしちゃっても別によさそうな気がしますけど、何か問題があったときに被害が最小限の方がいいかなぁ?という感じ。
空要素タグを変換するだけなので、XHTML 以外の要素や属性のことや、 XHTML にはあって HTML にはない要素や属性はどうするかとか全然考えてないです。とりあえず今はそういうのは使ってないので、必要になったときに考えることにします。