FSWikiLiteはFSWikiとは違い、Wikiページに記述して使用するタイプのプラグイン(インラインプラグインとパラグラフプラグイン、ブロックプラグイン)しかサポートしていません。ただし、FSWikiでアクションプラグインと呼ばれているものについては別のCGIスクリプトを用意することで対応することができます(Liteのcategory.cgiなどがこれにあたります)。
プラグインは〜.plという名前を付けてpluginディレクトリに配置します。そしてlib/setup.plでrequireします。デフォルトのsetup.plではcore.plのみ読み込むよう設定されています。
require "./plugin/core.pl";
インラインプラグインはWiki::Pluginパッケージで定義されたPerl関数のリファレンスです。関数の引数にはWikiソースで記述した引数がそのまま渡されます。関数は戻り値としてHTMLを返すように実装します。また、スクリプトのBEGIN節で関数のリファレンスをインラインプラグインとして登録します。
package Wiki::Plugin; BEGIN { $main::I_PLUGIN->{hello} = \&hello; } sub hello { my $name = shift; if($name eq ''){ return "名前を入力してください。"; } else { return "こんにちは".&Util::escapeHTML($name)."さん"; } } 1;
ページ編集時に以下の書式で使用することができます。
{{hello たろう}}
パラグラフプラグインも実装方法はインラインプラグインと同様です。ブロック要素を含むHTMLを返却する場合にはパラグラフプラグインとして実装します。BEGIN節での登録方法のみが異なります。
BEGIN { $main::P_PLUGIN->{hello} = \&hello; }
ブロックプラグインも実装方法はインラインプラグインと同様です。複数行に渡るパラメータを使用する場合にはブロックプラグインとして実装します。
BEGIN { $main::B_PLUGIN->{hello} = \&hello; } sub hello { my $text = shift; my $name = shift; if($name eq ''){ return "名前を入力してください。"; } else { return "こんにちは".&Util::escapeHTML($name)."さん<br>\n".$text; } } ---- Wikiコード ---- {{hello たろう ご機嫌いかがですか? 今日は良い天気ですね。 }}
プラグイン内部からリクエストパラメータにアクセスするには%main::inという変数を利用します。これはcgi-lib.plでパースされたリクエストパラメータが格納された連想配列です。
# ページ名を取得 my $p = $main::in{'p'};
プラグイン内部ではUtilパッケージに定義されたユーティリティ関数を使用することができます。Utilパッケージには以下のような関数が定義されています。
関数名 | 説明 |
---|---|
url_encode | URLエンコードします。 |
url_decode | URLエンコードされた文字列をデコードします。 |
escapeHTML | HTMLをエスケープします。 |
format_date | 日付をフォーマットします。 |
trim | 文字列の前後の空白を取り除きます。 |
delete_tag | タグを削除して文字列のみを取得します。 |
check_pagename | 文字列が使用可能なページ名かどうかチェックします。 |
check_numeric | 文字列が数値かどうかチェックします。 |
send_mail | メールを送信します。 |
error | エラー画面を表示します。 |
handyphone | 携帯電話かどうかを判断します。 |
smartphone | スマートフォンかどうかチェックします。 |
FSWikiでアクションプラグインとして実装されているプラグインは別途CGIスクリプトを作成することで対応することが出来ます。actionパラメータの代わりにそのCGIスクリプトを呼び出すようにします。CGIスクリプトからはcommon.plに定義された関数群を使用してページの取得や保存などを行うことが出来ます。
FSWikiLiteではデフォルトでedit.cgi(ページの編集)、download.cgi(添付ファイルのダウンロード)、category.cgi(カテゴリ表示)という3つのアクションスクリプトが用意されていますので、これらを参考にしてください。