まんぼう日記

takataka's diary

PukiWiki 1.5.0 + PHP 5.4 で paraedit プラグイン

PukiWiki でパラグラフ単位でのページ編集ができる paraedit プラグインを使おうとしたら,PHPの関係でちょっと手直しが必要だったので,インストールの仕方を含めてメモ. 環境は次の通り.

症状

リンク切れ・消失 自作プラグイン - taru memo の「設置方法」にしたがってインストールする(後述のように,PukiWikiのバージョンがあがってるせいで設定ファイルの修正の仕方が微妙に違うところがありますが)と,ウェブサーバのエラーログにPHP

PHP Deprecated:  Function split() is deprecated in /usr/local/www/pukiwiki-1.5.0-utf8/tlab/plugin/paraedit.inc.php on line 180
    

というエラーを吐く. PHP: split - Manual によると,split() は非推奨になったので,preg_split() か explode() を使ってね,ってことらしい.

対処込みのインストール方法

lib/pukiwiki.phpを書き換え

上記リンク先の「設置方法 lib/pukiwiki.php に次のコードを追加」の通りでもよいが,そのページの下の方のコメントを参考に,次のようにした.

/////////////////////////////////////////////////
// Main

の直前に以下を挿入(↓のpreの箱,横にスクロールするかも).

/////////////////////////////////////////////////
// for paraedit

if (exist_plugin('paraedit')) {
   $post["msg"] = _plugin_paraedit_parse_postmsg($post["msg_before"], $post["msg"], $post["msg_after"]);
}

lib/convert_html.phpを書き換え

「設置方法 convert_html() の書換え」と同じことをしたらよいのだけれど,PukiWikiのバージョンが違う(リンク先はたぶん1.4.7までを対象とした記述で,たかたかが入れようとしてるのは1.5.0)ので,convert_html.php のが微妙に変わっていた.たかたかはPHPをしゃべれる人ではないけれど,推測で次のようにしてみたらうまくいったみたい. class Heading extends Element 内の function toString() 内の

return $this->msg_top .  $this->wrap(parent::toString(),
        'h' . $this->level, ' id="' . $this->id . '"');

という2行を以下の4行に置き換え(1行目はただのコメント,2行目を追加,3行目は変更なし,4行目は書き換え).

// ParaEdit
$paraedit_flag = (preg_match("/^content_1_/", $this->id)) ? ' paraedit_flag=on' : '';
return $this->msg_top .  $this->wrap(parent::toString(),
        'h' . $this->level, ' id="' . $this->id . $paraedit_flag . '"');

skin/pukiwiki.skin.phpを書き換え

↑の「lib/pukiwiki.phpを書き換え」と同様.

// ------------------------------------------------------------
// Output

の直後に以下を挿入.

// ParaEdit
if(exist_plugin('paraedit')) {
   $body = _plugin_paraedit_mkeditlink($body);
}

paraedit.inc.php

入手した paraedit.inc.php を plugin ディレクトリに置き,次のように修正.

  1. split()をexplode()に書き換え
  2. paraedit バージョン 0.8 では2カ所,いずれも正規表現必要ないので preg_split() ではなく explode() でよい.
  3. function _plugin_paraedit_mkeditlink($body) 内の
    $link = "$script?plugin=paraedit&parnum=$para_num&page=" . rawurlencode($vars[page]) . '&refer=' . rawurlencode($vars[page]); // v 1.4
    
    という行の vars[page] の pageを 'page' に書き換える(2カ所). ここ書き換えなくてもエラーにはならないが,PHPが warning 出してた(たぶん).

おまけ

paraedit.inc.php 内の

// 編集リンクの挿入箇所を指定

の所を「</h2>の前」にしてみたら,セクションタイトルに改行が入って2行になってしまった. とりあえず次のようにしてみた.

// 編集リンクの文字列・スタイルを指定
// %s に URL が入る
//define(_EDIT_LINK, '<div style="text-align: right; font-size: x-small; padding: 0px; "><a href="%s">[edit]</a></div>');
define(_EDIT_LINK, '<span style="float:right; font-size: small; font-weight: lighter; padding: 0px 0px 0px 1em; ">[<a href="%s">edit</a>]</span>');