* 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からの引数    ※$varsの使用を推奨します
  $post : POSTメソッドによるHTTPからの引数  ※$varsの使用を推奨します
  $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のタグの属性値として出力する場合、プラグイン内で「>」や「&」、「"」などを実体参照に変換しておく必要があります。htmlspecialcharsを通すことで簡単に変換できますので、忘れずに処理しておきましょう。))。

// ウソついていたら直修正してください。
ただし、インライン型プラグインの場合、{ }内の文字列はサニタイズ済みなので、
 &plugin(foo){bar};
形式の bar を得るには、
 $args = func_get_args();
 $bar = array_pop($args); // サニタイズ済み。そのままHTMLに出力できる
のようにします。
barが省略された
 &plugin(foo);
の場合でも、$barには空の文字列が入ります([[上記>#z3423080]]参照)。

***1.4用プラグイン作成時の注意(part2) [#vf244e1e]
~1.4用のプラグインもしくはスキンで、amazonアソシエートによるamazonへのライブリンクを導入する場合、
+<iframe>を<object>に置き換える必要があります。src="..."をdata="..."に書き換え、type="text/html"を指定します。
+属性値の中の&を&amp;amp;に書き換える必要があります。属性値を必ず引用符で囲む必要があります。タグ名や属性名は小文字にする必要があります。
+<map>タグのname属性をid属性に変更する必要があります。
+<area>タグ、<img>タグなどを<area ... /><img ... />のように閉じタグ付きに書き換える必要があります。
+<img>タグ、<area>タグにalt属性を追加する必要があります。<img>タグのborder属性をstyle="border-width"に書き換える必要があります。
+クライアントサイドイメージマップを指定する<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用に書き換えると次のようになります。
-スキンに導入したサンプル
 <?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">
~1.3系用の[[amazonkey.inc.php>pukiwiki:自作プラグイン/amazonkey.inc.php]]も上記の修正で簡単に1.4系で使用できます。
~ただし、Internet Explorerの<object>にはバグがあり、<object>内のリンクをクリックした場合、フレームでもないのに<object>内でリンク先のページを表示してしまいます。W3C準拠のブラウザではこのような症状は発生しません。

*** 1.4系(1.4.4rc1~)プラグイン作成時の注意(part3) [#v9b54129]
~独自プラグイン等での管理者パスワードのチェックはpkwk_login()を利用する事が推奨されています。(see PukiWiki/1.4/1.4.3以前からの移行, 開発日記/2004-07-18) 
----
[[:CategoryDev]]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.014 sec.

SourceForge