PukiWikiでいじったところ
floatcontents
floatcontentsでlist3が表示されないようにplugin.css中にdisplay:noneを入れた。
lib/html.php
IE6を標準準拠モードで実行させるために、1行目に<xml>タグを出力しないようにしてみました。
IE6はどうやら1行目に<!DOCTYPE>がないと後方互換モードで動くらしいですね。やっかいなやつめ。
497 // Output XML or not 498 // If browser is MSIE, xml tag will not appear 499 if (UA_NAME != 'MSIE' && $type == PKWK_DTD_TYPE_XHTML) echo '<?xml version="1.0" encoding="' . $charset . '" ?>' . "\n";
ここではUA_NAMEがブラウザの種類が入っている定数らしいです。
mod_rewriteによる書き換え -- 2008/06/28
.htaccessの設定
Apacheモジュールのmod_rewriteでURLを書き換えてみます。例えば/?COOTで表示されるページを/COOT.htmlというURLで表示させることが可能になります。以前はGoogleなどの検索エンジンでは?が入ったURLだとインデックス化されにくいといわれていましたが、現在このサイトが登録されているところを見ると最近はあまり関係ないのかもしれません。
せっかく試してみましたのでメモとして残しておきます。
- .htaccessに以下の行を追加
RewriteEngine on RewriteOptions MaxRedirects=1 RewriteBase / RewriteRule ^(.+)\.html$ index.php?$1 [L]
こんな風にすると正規表現(.+)\.htmlに一致する名前がindex.php?$1に変換されます($1にはマッチした文字列が入ります)。変換ルールは最後の行のRewriteRuleの部分ですね。末尾の[L]は「このルールに一致したらそれ以上変換しない」という意味みたいです。
リンクの書き換え
.htaccessだけを書き換えただけでは、まだページ内にあるリンク先は?COOTのままです。
次にこれを何とかします。そこで、パフォーマンスが下がるかもしれませんが、出力されたHTMLのリンクを後から書き換える、作戦を試みます。つまり・・・
PukiWikiの出力 -> フィルタ -> 出力フラッシュ
というように行います。出力フィルタをかけてしまうわけですね。
- リンク先の変換
まずはリンクの書式をどのように変換するかと言うことですが、単純に、/?COOTをそのまま/COOT.htmlに書き換えればよいわけです。これは正規表現を使えば簡単に実現できます。しかし、mod_rewriteには落とし穴があって、%2Fつまりエンコードされたスラッシュがあると変換が機能しないようです*1*2。例えばPukiWikiのページ名でCOOT/Installというのがあったら、/?COOT%2FInstallというURLになりますが、これをそのまま/COOT%2FInstall.htmlと変換してもmod_rewriteは機能せず、404(not found)エラーが出てしまいます。
これを防ぐために%2Fをスラッシュに変換します。つまりURLを/COOT/Install.htmlになるようにすればOKなはずです。
- 出力フィルタ
リンクの変換はこれで解決しました。続いてPukiWikiの出力をフィルタにかけます。
これはPHPのob_start(callback)とob_end_flush()という関数を組み合わせればよいらしく、ob_start()で出力のバッファリングを開始し、ob_end_flush()でフラッシュするというものです。
バッファリングされた出力は文字列としてcallbackに引数として渡されます。
lib/pukiwiki.phpの修正
以上のやり方を実装します。変更するファイルはlib/pukiwiki.phpになります。
このファイルの末尾の
// Output catbody($title, $page, $body); exit;
となってる部分を修正します。
// Output function rewrite_filter($buf) { $pat = preg_quote($GLOBALS['script'],"/"); return preg_replace_callback( "/\"$pat\?(cmd=read(&|&)page=)?(((%[0-9A-F][0-9A-F])|\w)+)\"/", create_function('$m', 'return "/" . preg_replace("/%2F/","/",$m[3]) . ".html";'), $buf ); } ob_start("rewrite_filter"); catbody($title, $page, $body); ob_end_flush(); exit;
これで出力文字列がrewrite_filter()に渡され、preg_replace_callback()で変換された後に出力されます。
preg_replace_callback()で正規表現にマッチした部分文字列がcreate_function()で作成された無名関数に渡されて変換されます。この無名関数ではマッチしたも部分文字列中の%2Fを「/」に変換して.htmlを付加する、という動作を行っています。
カウンターPluginのyesterdayのカウント数が0になる
#counter
でトータル、今日、昨日、のアクセス数を表示できますが、昨日のカウントが0になります。どうやらcounter.inc.phpを修正する必要があるようです。
- plugin/counter.inc.php
81 if ($counters[$page]['date'] != $default['date']) { 82 // New day 83 $modify = TRUE; 84 # $is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', strtotime('yesterday', UTIME))); 85 $is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', strtotime('yesterday'))); 86 $counters[$page]['ip'] = $_SERVER['REMOTE_ADDR']; 87 $counters[$page]['date'] = $default['date'];
84行目をコメントアウトして85行目の内容を追加しました。strtotime()の第二引数は省略されると現在時刻を取得するようです。
カスタムプラグイン
2011-12-15 : 追加
プラグインを作ったときに、ファイル末尾に空行があると、ページ表示時に空行が入ってしまうので、文字化けすることがある。