kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

簡単な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" />
  &nbsp;<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;
}
?>