簡単なPukiwikiプラグインを作ってみました
時々、CUIのツールを作成することがあるのですが、それをWebアプリとして提供するともっと便利になるかも?と思うことがあります。ただし、ゼロからWebアプリ開発をすると手間がかかり、簡単に作成できませんね。でも、Pukiwikiなど既存のWeb環境にプラグインとしてツール開発を行うと手軽に作成できるかもしれませんね。
ということで、Pukiwikiのプラグイン開発がどんな感じで出来るのか調査してみました。
初めてのプラグイン
まずは、本当に簡単なプラグインを作成しました。
test20090327.inc.php
<?php function plugin_test20090327_convert() { return 'テスト20090327プラグイン(plugin_test20090327_convert)です!'; } function plugin_test20090327_inline() { return 'テスト20090327プラグイン(plugin_test20090327_inline)です!'; } ?>
外部コマンドの実行結果を表示するプラグイン
test20090327b.inc.php
<?php function plugin_test20090327b_convert() { $output = shell_exec('dir'); $output = htmlspecialchars($output); $output = str_replace(array("\r\n", "\n", "\r"), "\n", $output); return '<pre>' . mb_convert_encoding($output, "EUC-JP", "SJIS") . '</pre>'; } ?>
フォームを使用するプラグイン
test20090327c.inc.php
<?php function plugin_test20090327c_convert() { $args = func_get_args(); return plugin_test20090327c_form($args[0]); } function plugin_test20090327c_action() { global $post, $vars; $instr = isset($vars['instr']) ? htmlspecialchars($vars['instr']) : ''; return array('msg' => "test20090327cプラグインの結果", 'body' => "入力された文字列は[" . $instr . "]です。"); } function plugin_test20090327c_form($instr) { return <<<EOD <form action="$script" method="get"> <div> <input type="hidden" name="cmd" value="test20090327c" /> <input type="text" name="instr" value="$instr" size="20" /> <input type="submit" value="実行" /> </div> </form> EOD; } ?>
ページソースを表示するプラグイン
test20090327d.inc.php
<?php function plugin_test20090327d_convert() { global $vars; $count = 0; $postdata = ''; // 気になる変数を表示してみる $postdata .= "\$vars['refer']: " . $vars['refer'] . "<br />\n"; $postdata .= "\$refer: " . $refer . "<br />\n"; $postdata .= "\$vars['page']: " . $vars['page'] . "<br />\n"; $postdata .= "<br />\n"; // $varsの全内容を表示してみる foreach ($vars as $item) { $postdata .= $item . "<br />\n"; } $postdata .= "<br />\n"; // Wikiページの内容を取得する foreach (get_source($vars['page']) as $line) { $count++; $postdata .= $count . ": " . rtrim($line) . "<br />\n"; } return $postdata; } ?>
ページソースを編集するプラグイン
test20090327e.inc.php
function plugin_test20090327e_convert() { global $vars; $script = get_script_uri(); $s_page = htmlspecialchars($vars['page']); $string = <<<EOD <br /> <form action="$script" method="post"> <input type="hidden" name="plugin" value="test20090327e" /> <input type="hidden" name="refer" value="$s_page" /> <input type="text" name="msg" size="50" /> <input type="submit" name="comment" value="追加" /> </form> EOD; return $string; } function plugin_test20090327e_action() { global $vars, $_title_updated; // 入力テキストがなかったら何もせずに元のページを表示する if (! isset($vars['msg'])) return array('msg'=>'', 'body'=>''); // Do nothing // 元のページソースに入力テキストを箇所書きで追加する $comment = '-' . $vars['msg']; $postdata = ''; foreach (get_source($vars['refer']) as $line) { if (preg_match('/^#test20090327e/i', $line)) { $postdata = rtrim($postdata) . "\n" . $comment . "\n" . "\n"; } $postdata .= $line; } // 変更したページソースを保存する page_write($vars['refer'], $postdata); // ページタイトルと内容を設定する // 内容はブランク設定だとページソースの内容が表示される $retvars['msg'] = $_title_updated; $retvars['body'] = ''; return $retvars; } ?>