#author("2025-03-23T07:49:08+09:00","","") #author("2025-03-23T12:13:56+09:00","","") //[[Web Collaboration by PukiWiki]] *chapter7 プラグインの仕組みと開発の基本 [#i740cf92] #access(); //**7-1 プラグインについて [#r751e7a0] //**7-2 自作プラグイン [#k397f3f9] //**7-3 プラグインの開発 [#i99c7922] //**7-4 プラグイン作成にあたって [#g8719660] **プラグイン作成の基本 [#t37ce155] #contents(); ***プラグインの役割 [#n0bc732a] 多くのプラグインを使用することで、pukiwikiを文書作成ツールとして使う以上、様々なようとで使うことができるようになったり、 より手軽に表現できたり、より便利な使い方が可能になります。 pukiwikiには、標準配布パッケージに80個ほどのプラグインが収録されています。 プラグインには書式としてページ内に記述して活用できるものと、pukiwiki内部のコマンドとして使用できるものがあります。 そのため80個のプラグインすべてを、ユーザーが直接意識的に使用するわけではありません。 多数のプラグインがどのような動きをするのかを知っておくと、こうしたいんだけと何とかならないかな...、というときに役に立つことでしょう。 // ***プラグインの型 [#j1fb6fcb] pukiwikiプラグインには、3種類の型があります。まず大きく分けてページ内で書式としてページ内で記述して使用するタイプと、 URLとして呼び出すタイプ(コマンド型)の2種類に分かれます。 また、書式として使用するタイプの中には段落として取り扱うタイプ(ブロック型)と行中で使用するタイプ(インライン型)があります。 コマンド型の多くの場合、pukiwikiが動作する際に内部的に使用されたり、メンテナンス用のコマンドとして使用することが多いので、pukiwiki管理者以外のユーザーが直接使うのことはありません。 |タイプ|内容|使用方法| |コマンド型|URLかあ呼び出すタイプ|URL内のcmd=またはplugin=で呼び出される| |ブロック型|書式で段落として取り扱われるタイプ|行頭で#から始まる| |インライン型|書式で行中に記入できるタイプ|行頭・行中で&から始まり;で終わる| **プラグインスクリプトファイルの作成 [#l57f4592] 例えば、「test」という名前のプラグインを作成するならば、「test.inc.php」という名前のファイルをPukiWikiのプラグインフォルダに作成する。 ファイルは、適当な文字コード(通常はEUC)で保存する。 ***インラインプラグインの作成 [#j6ae2f5d] インラインプラグイン(「&test();」と書いて使用するもの)では、「plugin_プラグインの名前_inline」という名前の関数を作る。 testプラグインでは、「plugin_test_inline」となる。 この関数では、表示する文字列を返すようにする。例えば、「&test();」で「こんにちは」と表示されるようにするには、次のようにする。 <?php function plugin_test_inline() { return 'こんにちは'; } ?> ■プラグイン実行結果 [#d4a50ab1] &test(); ここで返す文字列はそのまま出力されるので、注意が必要(つまり、HTMLタグなども有効になる)。 そのまま出力するのが危険な場合は、htmlspecialchars関数などで変換しておく。 ***ブロックプラグインの作成 [#w37ee5a7] ブロックプラグイン(「#test()」と一行に書いて使用するもの)では、「plugin_プラグインの名前_convert」という名前の関数を作る。 testプラグインでは、「plugin_test_convert」となる。 この関数では、表示する文字列を返すようにする。例えば、「#test()」で「こんにちは」と表示されるようにするには、次のようにする。 <?php function plugin_test1_convert() { return 'こんにちは'; } ?> ■プラグイン実行結果 [#d4a50ab1] #test1(); **コマンドプラグインの作成 [#kb712c8e] コマンドプラグイン(「./?plugin=test」のようなURLを呼び出して使用するもの)では、「plugin_プラグインの名前_action」という名前の関数を作る。 testプラグインでは、「plugin_test_action」となる。 この関数では、ページのタイトルとページの内容が格納された配列を返す。ページのタイトルは「msg」、内容は「body」というキー名で格納する。 例えば、「./?plugin=test」でタイトルが「テスト」で、内容が「こんにちは」と表示されるようにするには、次のようにする。 <?php function plugin_test_action() { return array('msg'=>'テスト', 'body'=>'こんにちは'); } ?> ■プラグイン実行結果 [#d4a50ab1] [[http://www.kisnet.or.jp/~kanou/index.php?plugin=test2:http://www.kisnet.or.jp/~kanou/index.php?plugin=test2]] **指定されたパラメータを取得する [#e471ff83] インラインやブロック型プラグインを呼び出す時に指定されたパラメータを取得するには、plugin_test_inlineやplugin_test_convert関数でfunc_get_args関数を呼び出す。 <?php function plugin_test3_convert() { //パラメータの数の確認 if (func_num_args() < 1) return 'パラメータの数が不正です。'; //パラメータの取得 $args = func_get_args(); //はじめのパラメータを表示 return htmlspecialchars($args[0]); } ?> ■プラグイン実行結果 [#d4a50ab1] #test3(1); #test3(0); ***インラインプラグインの最後のパラメータについて [#v4103be4] インラインプラグインの「{}」で囲まれた最後のパラメータは、WikiテキストからHTMLに変換されている。 この最後のパラメータは、指定されていなくてもfunc_get_args関数で返される配列の最後に格納されるため、array_pop関数でこの部分を取得できる。 <?php function plugin_test_inline() { //パラメータの取得 $args = func_get_args(); //{}で指定されたパラメータを取得 $lastparam = array_pop($args); return $lastparam; } ?> // ***自作する前に探してみよう [#e9d57a7e] 自作プラグインを作る前に、希望する機能を持つプラグインがすでに開発されていないかどうかを探してみましょう。 pukiwkiには公式サイトで自作プラグインとして紹介されているもののほかにも、 インターネット上のプラグイン作者が直接提供しているものもあります。 検索エンジンを活用して探してみることをおすすめします。 また、既存のプラグインに望む機能が既に実装されていないか確認しましょう。 プラグインの機能をあまり把握してなくて、実はできるのに知らなかったということもよくある話しです。 標準プラグインであれば配布パッケージに含まれるプラグイン説明ページをじっくり読んで、プラグインの動作をきちんと把握することが重要です。 // ***自作プラグインは公開しよう [#ica84643] 自作プラグインか完成してある程度機能することが確認できたら、ぜひほかの人にも使えるように公開しましょう。 公開するときに公式サイトの自作プラグインページに登録するといいでしょう。 ここでは多くのユーザーの目に触れることになり、より多くのユーザーからの感想や報告を受けることができるようになります。 また、プラグインに不具合が含まれてるいのに気づかない場合にも、ほかのユーザーが使用することで新たに発見される機会が増える可能性も考えられます。 作成したプラグインの感想をもらいことは、今後の開発の励みにもなると思うので、ぜひ公開してみてください。 // 7-4プラグイン作成にあたって プラグインを作成しようとしたときき、何も資料がない状態から作成するのは無理があります。 pukiwikiの配布パッケージにはプラグイン作成について取りまとめている文章はありません。 また、開発サイトにも参考になるページもありますが、プラグイン開発について1から理解するための文書は残念ながら見当たりません。 しかし、pukiwikiのプラグイン開発にあたって最高の資料として、標準プラグインが多数用意されています。 実際に動くソースコードに勝る最高の資料はないでしょう。 自作プラグインを開発する際に自分が望む作りたいプラグインに近い動作をするプラグインや、部分的に参考になりそうな実装されているプラグインを解析することが、開発の近道ともいえます。