euc版のpukiwiki plus!をutf8版に乗せ換えようとした。
すると、trackerプラグインでバグが出た。
trackerプラグインには
// "/page"の内容が長すぎるとpreg_match()が失敗するバグ(?)があるので
// "//////////"までをマッチ対象とさせる
というバグがあり、本家ではパッチにて対処がされている。
パッチの内容をutf版にもあてたところ、全てのページがリストされなくなっちまった。
以下が対処方法。
trackerプラグインを以下のように修正
- 18行目付近
define('TRACKER_LIST_SHOW_ERROR_PAGE',TRUE);
+ define('TRACKER_PLUS_LIST_APPLY_LIMIT_PARSERANGE',TRUE);
+ define('IGNORE_MESSAGE','//////////');
- 756行目付近
+ function getFooter()
+ {
+ if ($this->strFooter == null)
+ {
+ $default_source = join('',plugin_tracker_get_source($this->config->page.'/page'));
+ $this->strFooter = substr($default_source, strpos($default_source, IGNORE_MESSAGE));
+ }
+ return $this->strFooter;
+ }
function add($page,$name)
{
- 777行目付近
$source = join('',preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/','$1$2',$source));
+ // "/page"の内容が長すぎるとpreg_match()が失敗するバグ(?)があるので
+ // IGNORE_MESSAGE以降の文字列はpage宣言文字列を利用する。
+ if( TRACKER_PLUS_LIST_APPLY_LIMIT_PARSERANGE )
+ {
+ $source_pos = strpos($source, IGNORE_MESSAGE);
+ if( $source_pos > 0 )
+ {
+ $source_s = substr($source, 0, $source_pos);
+ $source = $source_s . $this->getFooter();
+ }
+ }
本家のパッチでは「"//////////"までをマッチ対象とさせる」とあるが、
どうやらutf版では
/pageで宣言した内容が全て含まれていないとlistが作れない
ような動きに見えた。なので、
- ページの内容取得
- マッチする文字列までを部分抽出
- マッチする文字列以降を宣言部分(:config/tracker/HOGE/page)から取得
- 上記2つの文字列を結合
とすることで対処。getFooterメソッドは一度しか宣言部分から取得しないようにしたが、
ほんとにこんな書き方でいいのかな?PHPのスコープ概念がよくわからん^^;
あと、この対処ができたから「今度は認証関係を設定するぞ!」
と意気込んで取り組んだところ、、、
新しく追加された認証関係のプラグインってちゃんと動かないっぽい。
(IDの検証だけしてパスワード情報を無視してる!?)
乗せ換えはまだまだ先のようだ。