- 追加された行はこの色です。
- 削除された行はこの色です。
**PukiWikiのPlug-inの仕様 [#vf7eca73]
#contents
***プラグインディレクトリについて [#n4fa1cbf]
PukiWikiのページのHTMLへのコンバート時と、プラグイン機能からの値を受け取って処理を行うプラグインを設置することができます。
***ページ内でのプラグインの呼び出し [#a8ccd0ba]
#プラグイン名
#プラグイン名(arg1,arg2...)
-行頭にスペースは含めることはできない。
-引数内に括弧()を使用することができる。ただし ) 単体は不可。
-引数を指定しなくても呼び出せる
実際には プラグインディレクトリ/プラグイン名.inc.php 内の plugin_プラグイン名_convert() が呼ばれます
***URL指定でのプラグインの呼び出し [#q74b9870]
pukiwiki.php?plugin=プラグイン名
実際には プラグインディレクトリ/プラグイン名.inc.php 内の plugin_プラグイン名_action() が呼ばれます
***ファイル名 [#k4a8a55f]
プラグイン名.inc.php
***関数 [#z3423080]
function plugin_プラグイン名_convert()
function plugin_プラグイン名_inline()
-HTMLへのコンバート時に呼び出される。
-引数は func_get_args() で配列へ格納できる。([0]~[n])
-func_num_args() によって、渡された引数の数を求めることができる。
但し、
&hoge(引数リスト);
形式と
&hoge(引数リスト){[文字列]};
形式の互換のため、function plugin_プラグイン名_inline()では、前者は[文字列]部分が省略されている、という扱いになり、func_get_args() で格納した配列の最後が空文字列('')になり、引数の数も()内に記述した引数の数+1になります。
関連:[[BugTrack/404]]
function plugin_プラグイン名_action()
-GET・POSTメソッドでpluginを指定されたときに呼び出される
//-返値に array("msg" => "$1 is page") などを返すと $1 をページ名としてページタイトルに置換される
-返値に array("msg" => "page's name", "body" => "contents of a page") とするとページ名とコンテンツを返すことができる。
-die() を実行することにより、ページに戻らないようにできる。head()で別ページに飛ばしたい時に便利。
***ファイル内容 [#z1aca986]
ユーザに設定させる初期値などについては、define で定義する。
コンバート時のGET・POSTの出力内容に必要なものは refer と plugin という値で、
>
refer : そのページの名前($vars["page"])~
plugin : プラグイン名
とします。
以下の値を global でグローバル変数にすることによって値を取得できます。
$script : スクリプト名
$get : GETメソッドによるHTTPからの引数
$post : POSTメソッドによるHTTPからの引数
$vars : GET・POST両方のメソッドによるHTTPからの引数
$vars["page"] : 開いているページ名
(strip_bracket関数により[[]]を取り除ける)
*** 1.4系プラグイン作成時の注意 [#v243f7d2]
PukiWiki1.4にはアクセス制御が組み込まれ、プラグインからページを直接読み込んでいる場合はアクセス権のチェックをしないとセキュリティホールになります。
詳しくは[[PukiWiki/1.4/ちょっと便利に/任意のページごとの閲覧・編集制限]]の[[プラグインの改造>PukiWiki/1.4/ちょっと便利に/任意のページごとの閲覧・編集制限#b5bf2187]]を参照して下さい。
プラグインの中でJavaScriptなどを記述するために<script>タグを出力する場合、PukiWiki 1.4はXHTMLですので、<script>と</script>の間に直に「<」や「&」を記述することができません(HTML 4.01ではCDATAだが、XHTML 1.1ではCDATAではなく#PCDATA)。XMLのCDATAセクション(<![CDATA[~]]>で囲む)を使用するか、scriptを外部ファイルにする必要があります。XMLに対応していないブラウザとの互換性を重視して、外部ファイルにするのが無難です。
*** クロスサイトスクリプティング(XSS) [#md2baa47]
func_get_args()でプラグインに渡される引数はサニタイズされていませんので、引数の値を出力するプラグインでは、プラグインの中でサニタイズして出力しないとクロスサイトスクリプティング(XSS)の脆弱性が発生します((引数の値をHTML・XHTMLのタグの属性値として出力する場合、プラグイン内で「>」や「&」、「"」などを実体参照に変換しておく必要があります。htmlspacialcharsを通すことで簡単に変換できますので、忘れずに処理しておきましょう。))。
// ウソついていたら直修正してください。
ただし、inline プラグインの場合、最後の引数はサニタイズ済みなので、
ただし、inline プラグインの場合、{ }内の文字列はサニタイズ済みなので、
&plugin(foo){bar};
形式の bar を得るには、
$args = func_get_args();
$bar = array_pop($args); // サニタイズ済み。そのままHTMLに出力できる
のようにします。
barが省略された
&plugin(foo);
の場合でも、$barには空の文字列が入ります([[上記>#z3423080]]参照)。
----
[[:CategoryDev]]