* PukiWikiでいじったところ [#e0879141]
 ** floatcontents [#edef6615]
 floatcontentsでlist3が表示されないようにplugin.css中にdisplay:noneを入れた。
 
 ** lib/html.php [#gc4c866e]
 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 [#p32bd531]
 *** .htaccessの設定 [#se9a1980]
 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]は「このルールに一致したらそれ以上変換しない」という意味みたいです。
 
 *** リンクの書き換え [#va1d3ccc]
 .htaccessだけを書き換えただけでは、まだページ内にあるリンク先は''?COOT''のままです。~
 次にこれを何とかします。そこで、パフォーマンスが下がるかもしれませんが、''出力されたHTMLのリンクを後から書き換える''、作戦を試みます。つまり・・・~
  PukiWikiの出力 -> フィルタ -> 出力フラッシュ
 というように行います。出力フィルタをかけてしまうわけですね。
 
 - ''リンク先の変換''~
 まずはリンクの書式をどのように変換するかと言うことですが、単純に、''/?COOT''をそのまま''/COOT.html''に書き換えればよいわけです。これは正規表現を使えば簡単に実現できます。しかし、mod_rewriteには落とし穴があって、%2Fつまりエンコードされたスラッシュがあると変換が機能しないようです((Apache2系列なら%2Fがあっても変換するオプションがあるようですが、httpd.confを編集する権限が必要になります))((しかもBioKidsが使っているサーバは1.3系列なのです))。例えば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の修正 [#w48ef09d]
 以上のやり方を実装します。変更するファイルは''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(&|&amp;)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になる [#d2fb6a70]
  #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()の第二引数は省略されると現在時刻を取得するようです。
 - 参考:http://pukiwiki.sourceforge.jp/dev/?BugTrack2%2F141
 
 ** カスタムプラグイン [#i0a4937f]
 #anno2(2011-12-15 : 追加)
 プラグインを作ったときに、ファイル末尾に空行があると、ページ表示時に空行が入ってしまうので、文字化けすることがある。