Top > PukiWiki > plugin > specification

PukiWikiのPlug-inの仕様 Edit

プラグインディレクトリについて Edit

PukiWikiのページのHTMLへのコンバート時と、プラグイン機能からの値を受け取って処理を行うプラグインを設置することができます。デフォルトでは plugin です。

ページ内でのプラグインの呼び出し Edit

#プラグイン名
#プラグイン名(arg1,arg2...)
  • 行頭にスペースは含めることはできない
  • 引数内に括弧()を使用することができる。ただし ) 単体は不可
  • 引数を指定しなくても呼び出せる

実際には プラグインディレクトリ/プラグイン名.inc.php 内の関数 「plugin_<プラグイン名>_convert()」 が呼び出されます

&プラグイン名(引数リスト);
&プラグイン名(引数リスト){[文字列]};
  • 文中で呼び出すことができる

実際には プラグインディレクトリ/プラグイン名.inc.php 内の関数 「plugin_<プラグイン名>_inline()」 が呼び出されます

URL指定でのプラグインの呼び出し Edit

pukiwiki.php?plugin=プラグイン名

実際には プラグインディレクトリ/プラグイン名.inc.php 内の関数 「plugin_<プラグイン名>_action()」 が呼び出されます

ファイル名 Edit

<プラグイン名>.inc.php

関数 Edit

function plugin_<プラグイン名>_convert() Edit

  • #プラグイン名形式で呼び出されます
  • HTMLへのコンバート時に呼び出されます
  • 引数は func_get_args() で配列へ格納できます([0]~[n])
  • func_num_args() によって、渡された引数の数を求めることができます

function plugin_<プラグイン名>_inline() Edit

  • &プラグイン名;形式で呼び出されます
  • HTMLへのコンバート時に呼び出されます
  • 引数は func_get_args() で配列へ格納できます([0]~[n])
  • func_num_args() によって、渡された引数の数を求めることができます

但し、

&hoge(引数リスト);

形式と

&hoge(引数リスト){[文字列]};

形式の互換のため、function plugin_プラグイン名_inline()では、前者は[文字列]部分が省略されている、という扱いになり、func_get_args() で格納した配列の最後が空文字列('')になり、引数の数も()内に記述した引数の数+1になります

function plugin_<プラグイン名>_action() Edit

  • GET・POSTメソッドでpluginを指定されたときに呼び出されます
  • 返値に array("msg" => "page's name", "body" => "contents of a page") とするとページ名とコンテンツを返すことができます
  • die() を実行することにより、ページに戻らないようになります。head()で別ページに飛ばしたい時に便利です。

function plugin_<プラグイン名>_init() Edit

  • 初期化関数。プラグインが呼び出されるとまず最初に実行されます。

$messages ハッシュ配列を設定し、set_plugin_messages($messages); に渡すのが通例のようです。例

function plugin_<プラグイン名>_init()
{
	$messages['_<プラグイン名>_messages'] = array(
		'msg_title' => '<p>メッセージ:%s</p>',
		'err' => <p>エラー:%s</p>);
	set_plugin_messages($messages);
}

この例では、$_<プラグイン名>_messages という名前の global 変数ができます。 値は $messages['_<プラグイン名>_messages'] で設定したものです。

plugin_<プラグイン名>_convert() などの関数中では

global $_<プラグイン名>_messages;

のように宣言して使用します。 $_<プラグイン名>_messages['msg_title'] のようにしてアクセスできることでしょう。

ja.lng, en.lng で設定するような値をダウンロードするユーザーの簡便性を考えてプラグイン中で設定しておく場合などに使用することでしょう。set_plugin_messages() を使用するとすでにその変数があった場合は上書きしません。つまり ja.lng, en.lng での設定のほうが優先されます。

ファイル内容 Edit

ユーザに設定させる初期値などについては、define で定義して下さい。

コンバート時のGET・POSTの出力内容に必要なものは refer と plugin という値で、

refer : そのページの名前($vars["page"])
plugin : プラグイン名

とします。

以下の値を global でグローバル変数にすることによって値を取得できます。

 $script : スクリプト名
 $get : GETメソッドによるHTTPからの引数    ※$varsの使用を推奨します
 $post : POSTメソッドによるHTTPからの引数  ※$varsの使用を推奨します
 $vars : GET・POST両方のメソッドによるHTTPからの引数
 $vars["page"] : 開いているページ名

(strip_bracket関数により[[]]を取り除かれている)

1.4系プラグイン作成時の注意 Edit

PukiWiki1.4にはアクセス制御が組み込まれているため、プラグインからページを直接読み込んでいる場合はアクセス権のチェックをしないとセキュリティホールになります。 詳しくは PukiWiki/1.4/ちょっと便利に/任意のページごとの閲覧・編集制限プラグインの改造 を参照して下さい。

プラグインの中でJavaScriptなどを記述するために<script>タグを出力する場合、PukiWiki 1.4はXHTMLですので、<script>と</script>の間に直に「<」や「&」を記述することができません(HTML 4.01ではCDATAだが、XHTML 1.1ではCDATAではなく#PCDATA)。XMLのCDATAセクション(<![CDATA[~]]>で囲む)を使用するか、scriptを外部ファイルにする必要があります。XMLに対応していないブラウザとの互換性を重視して、外部ファイルにするのが無難です。

クロスサイトスクリプティング(XSS) Edit

func_get_args()でプラグインに渡される引数はサニタイズされていませんので、引数の値を出力するプラグインでは、プラグインの中でサニタイズしてから出力しないとクロスサイトスクリプティング(XSS)の脆弱性が発生します*1

ただし、インライン型プラグインの場合、{ }内の文字列はサニタイズ済みなので、

&plugin(foo){bar};

形式の bar を得るには、

$args = func_get_args();
$bar = array_pop($args); // サニタイズ済み。そのままHTMLに出力できる

のようにします。 barが省略された

&plugin(foo);

の場合でも、$barには空の文字列が入ります(上記参照)。

1.4用プラグイン作成時の注意(part2) Edit

1.4用のプラグインもしくはスキンで、amazonアソシエートによるamazonへのライブリンクを導入する場合、

  1. <iframe>を<object>に置き換える必要があります。src="..."をdata="..."に書き換え、type="text/html"を指定します。
  2. 属性値の中の&を&amp;に書き換える必要があります。属性値を必ず引用符で囲む必要があります。タグ名や属性名は小文字にする必要があります。
  3. <map>タグのname属性をid属性に変更する必要があります。
  4. <area>タグ、<img>タグなどを<area ... /><img ... />のように閉じタグ付きに書き換える必要があります。
  5. <img>タグ、<area>タグにalt属性を追加する必要があります。<img>タグのborder属性をstyle="border-width"に書き換える必要があります。
  6. クライアントサイドイメージマップを指定する<img>のusemap属性は、HTML4.01ではURIを与えていましたが、XHTML 1.1ではイメージマップを定義している<map>のid属性の値を指定するよう変更されています。したがって、<img>タグのusemap属性の属性値が#で始まっている場合は#を削除する必要があります。
  • amazonアソシエーションで表示されたサンプル
     <iframe scrolling="no" frameborder=0 width=120 height=600  src="http://rcm-jp.amazon.co.jp/e/cm?t=hogehogesite-22&l=st1&search=%E3%82%A4%E3%83%A9%E3%82%AF&mode=books-jp&p=11&o=9&f=ifr">  
     <table border="0" cellpadding="0" cellspacing="0" width="120" height="600">
     <tr><td>
     <MAP NAME="boxmap11">
     <AREA SHAPE="RECT" COORDS="4,584,115,600" HREF="http://rcm-jp.amazon.co.jp/e/cm/privacy-policy.html?o=9" alt="プライバシー ポリシー">
     <AREA COORDS="0,0,10000,10000" HREF="http://www.amazon.co.jp/exec/obidos/redirect?tag=hogehogesite-22&path=tg/browse/-/489986">
     </MAP>
     <img src="http://rcm-images.amazon.com/images/G/09/extranet/associates/amzn_recommends/xproduct-skyscrapper120x600.gif" width="120" height="600" border="0" usemap="#boxmap11">
     </td></tr>
     </table>
     </iframe>

    これをPukiWiki 1.4用に書き換えると次のようになります。

  • スキンに導入したサンプル
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
    
     <?php if (ereg("MSIE (3|4|5|6)", HTTP_USER_AGENT) == FALSE) { ?>
     <object width="121" height="602" style="margin-left:auto;margin-right:auto;overflow:hidden" type="text/html" data="http://rcm-jp.amazon.co.jp/e/cm?t=hogehogesite-22&amp;l=st1&amp;search=%E3%82%A4%E3%83%A9%E3%82%AF&amp;mode=books-jp&amp;p=11&amp;o=9&amp;f=ifr">
     <?php } else { ?>
     <object width="140" height="620" style="margin-left:auto;margin-right:auto;overflow:hidden" type="text/html" data="http://rcm-jp.amazon.co.jp/e/cm?t=hogehogesite-22&amp;l=st1&amp;search=%E3%82%A4%E3%83%A9%E3%82%AF&amp;mode=books-jp&amp;p=11&amp;o=9&amp;f=ifr">
     <?php } ?>
       <table border="0" cellpadding="0" cellspacing="0" summary="amazon">
         <tr><td>
           <map id="boxmap11">
             <area shape="rect" coords="4,584,115,600" href="http://rcm-jp.amazon.co.jp/e/cm/privacy-policy.html?o=9" alt="プライバシー ポリシー" />
             <area coords="0,0,10000,10000" href="http://www.amazon.co.jp/exec/obidos/redirect?tag=hogehogesite-22&amp;path=tg/browse/-/489986" alt="" />
           </map>
           <img src="http://rcm-images.amazon.com/images/G/09/extranet/associates/amzn_recommends/xproduct-skyscrapper120x600.gif" width="120" height="600" style="border-style:none" usemap="boxmap11" alt="" />
         </td></tr>
       </table>
     </object>

<iframe>を<object>に書き換えるとき、widthとheightの値を微調整する必要があるのと、style="overflow:hidden"を指定しておくのが無難です。IEの場合、style="overflow:hidden"が効かないバグがあるので、widthとheightの値を大きくしておく必要があります。

ここではIEとその他のブラウザで条件分けしていますが、CSSファイルをIE用とその他のブラウザで分けている場合は、<object>のwidth、heightをCSSファイルで指定しておけば上記のような条件分けは必要ありません。width、height、styleをCSSファイルで指定した場合は<object>は次のように指定できます。

<object type="text/html" data="http://rcm-jp.amazon.co.jp/e/cm?t=hogehogesite-22&amp;l=st1&amp;search=%E3%82%A4%E3%83%A9%E3%82%AF&amp;mode=books-jp&amp;p=11&amp;o=9&amp;f=ifr">

ただし、Internet Explorerの<object>にはバグがあり、<object>内のリンクをクリックした場合、フレームでもないのに<object>内でリンク先のページを表示してしまいます。W3C準拠のブラウザではこのような症状は発生しません。

1.4系(1.4.4rc1~)プラグイン作成時の注意(part3) Edit

独自プラグイン等での管理者パスワードのチェックはpkwk_login()を利用する事が推奨されています。(see PukiWiki/1.4/1.4.3以前からの移行, 開発日記/2004-07-18)

pukiwiki 用の javascript を作成する際に考慮すべきブラウザは... Edit

もともとPukiWiki 1.3.2からNetscape 4.xやIE4などには対応していない(切り捨てている)


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes