PukiWiki改造要領
概要:PukiWikiを改造するに当たっての備忘録です。
内容が正しいかは保証できませんが、私の調べた範囲でまとめてみました。
1. はじめに †
- ) プラグインの仕様
PukiwikiのHPのPukiWiki/Plug-inの仕様を参照して下さい。
- ) 開発チュートリアル
Sonots' PukiWiki プラグインの
PukiWikiプラグイン開発チュートリアルを参考にして下さい。
2. プラグインのタイプ †
プラグインのタイプ(関数)と簡単な説明です。詳細は上記PukiwikiのHPを参照して下さい。
- plugin_<プラグイン名>_convert()
インラインプラグインで行頭に「#プラグイン名」形式を書くことによって呼び出されます。
引数は func_get_args() で取得できます。
- plugin_<プラグイン名>_inline()
インラインプラグインで行頭、行中で「&プラグイン名;」形式で呼び出されます
引数は func_get_args() で取得できます。
- plugin_<プラグイン名>_action()
GET・POSTメソッドでpluginを指定されたときに呼び出されます。
- plugin_<プラグイン名>_init()
初期化関数。プラグインが呼び出されるとまず最初に実行されます。プラグイン実行毎ではなく、最初の呼び出し時にだけ実行されます。
3. 引数 †
プラグインの書式と引数の関係 †
プラグインの引数は func_get_args() で配列へ格納できます。
プラグインの書式とfunc_get_argsで取得される引数の関係は以下のようになっています。
#プラグイン名(option1,option2,....,optionN){ 文字列 };
$args = func_get_args();
$args[0] = option1
$args[1] = option2
:
:
$args[n-1] = optionN
$args[n] = 文字列
func_num_args() = n + 1
従って、func_get_argsで得られる引数は{}で囲まれた文字列部分のを含み、文字列は配列の最後になり$args[func_num_args() -1 ]の値です。文字列が無い場合や#プラグイン名(option1,..)の書式で{}が省略された場合には空データが入ります。
()内のoptionと{}内のtextの境が無いので、引数の数とoption部分とtext部分をチェックする必要があります。
引数の参照方法 †
以下はプラグインの中で、引数を参照する例です。引数のチェックはしていません。
$arg_num = func_num_args();
$args = func_get_args();
$option = array();
// forを使用した例
for ( $i = 0; $i < $arg_num -1; $i++ ) {
$option[] = $args[$i];
} // End of for
// foreachを使用した例
if (func_num_args() > 0) {
foreach ( $args as $arg ) {
$option[] = $arg;
}
}
文字列の処理 †
文字列部分はconvert_html関数で以下のようにWiki変換できます。
$arg_num = func_num_args();
$args = func_get_args();
$text = $args[ $arg_num - 1 ];
$html = convert_html( $text );
return $html;
次は文字列部分の各行をWiki変換して、処理する場合の例です。(単なる例として前後に<p>タグを追加したものです。)
$arg_num = func_num_args();
$args = func_get_args();
$new_lines = array();
$text = $args[ $arg_num - 1 ];
$lines = mbsplit("\r" ,$text); // 文字列を改行で各行に配列に分解します。
foreach ( $lines as $line ) {
$new_lines[] = '<p>' . convert_html($line) . '</p>';
}
$html = implode($new_lines); // 配列を1つの文字列に連結します。
return $html;
4. グローバル変数 †
以下の値を global でグローバル変数で参照することによって値を取得できます。
$script : スクリプトのurl ※get_script_uri() の使用を推奨します
$get : GETメソッドによるHTTPからの引数 ※$varsの使用を推奨します
$post : POSTメソッドによるHTTPからの引数 ※$varsの使用を推奨します
$vars : GET・POST両方のメソッドによるHTTPからの引数
$vars['page'] : 開いているページ名
5. PukiWikiの処理の流れ †
index.php
・lib(ライブラリーのディレクトリー)を設定 ← 設定の変更でライブラリーの切替えが可能。
↓
pukiwiki.phpをロード&実行
・各ライブラリーをロード&実行
func.php,plugin.php,html.php,convert_html.php,etc. ← expan.phpを追加する。
init.php.
pukiwiki.ini.phpをロード
PKWK_READONLY、PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK、
SKIN_DIR、$defaultpage、$auth_users、$agentsなどを設定
↓以下SKIN_FILEを設定するまでが複雑
$agents = array(array('pattern'=>'xxxxxxxxx', 'profile'=>'default'),);
'LANG_FILE_HINT', 'LANG_FILE'をロードする。
$user_agent['profile'] = isset($agent['profile']) ? $agent['profile'] : '';
define('UA_PROFILE', isset($user_agent['profile']) ? $user_agent['profile'] : '');
define('UA_INI_FILE', DATA_HOME . UA_PROFILE . '.ini.php');
require(UA_INI_FILE); ← default.ini.phpをロード
default.ini.php
define('SKIN_FILE', DATA_HOME . SKIN_DIR . 'pukiwiki.skin.php');
↑default.ini.php中でSKIN_FILEを設定
・cmd,pluginの場合
do_plugin_action($plugin)でプラグインをロードして実行 ← plugin.php中
・プラグインの返り値$retvarから$body(本文部分)を取り出す。
・catbody($title, $page, $body); ← html.php中
ページの表示で使用する$_LINK配列変数のセット。
SKIN_FILEで設定されたSKINのモジュールを実行。 ← オリジナルはDATA_HOME/skin/pukiwiki.skin.php
SKIN_FILEでページを作成。
6.Wikiファイル †
- ) ファイル名
ページを編集したファイルはディレクトリーwikiの中にあります。
ファイル名一覧から分かるようにファイル名はページ名をbyteの数字変換したものに.txtの拡張子を付けたものです。
従ってファイル名を変更するとページ名も変わります。
- ) 差分(diff)
ページを編集するとその差分データがディレクトリーdiffに保存されます。内容は以下のようになっていてよくあるdiffの結果です。(例はUnderEditのページで文字を赤色から青色に変更したものです。)
-&color(red){編集中};
+&color(blue){編集中};
メニューから差分を削除するとこのファイルが削除されます。また、renameプラグインではファイル名を変更した時にこの差分のファイル名も変更しています。
- ) 凍結(freeze)
ファイルを凍結するとファイルの初めに#freezeという行が追加されます。ファイルが凍結されているかどうかチェックするには最初の行をチェックすればいい訳です。
これはライブラリーのfunc.phpの中のis_freeze()関数の中で処理されています。
使用することはないと思いますが、プラグインの中で使用する場合は、以下のようになります。
if (is_freeze($page)) {
処理;
}
Wikiファイルは#freezeの部分を除けば、編集ページのそのままの内容が保存されます。
(当然のことですが編集可能な状態の時は#freezeの行がありません。)