RIGHT:&size(12){Category:[[:Plugin]] [[:CategoryDev]]};
* PukiWikiのPlug-inの仕様 [#vf7eca73]
English version : [[PukiWiki/Plugin/en]]

---------------------
#contents
---------------------
** プラグインディレクトリについて [#n4fa1cbf]
PukiWikiのページのHTMLへのコンバート時と、プラグイン機能からの値を受け取って処理を行うプラグインを設置することができます。デフォルトでは plugin です。

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

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

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

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

** URL指定でのプラグインの呼び出し [#q74b9870]
 pukiwiki.php?plugin=プラグイン名

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

** ファイル名 [#k4a8a55f]
 <プラグイン名>.inc.php

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

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

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



関連:[[BugTrack/404]]

***function plugin_<プラグイン名>_action() [#s081a0ef]
-GET・POSTメソッドでpluginを指定されたときに呼び出されます
//-返値に array("msg" => "$1 is page") などを返すと $1 をページ名としてページタイトルに置換される
-返値に array("msg" => "page's name", "body" => "contents of a page") とするとページ名とコンテンツを返すことができます
-die() を実行することにより、ページに戻らないようになります。header()((実例は,pcomment プラグインの plugin_pcomment_action 関数などを参照))で別ページに飛ばしたい時に便利です。

***function plugin_<プラグイン名>_init() [#paf1243e]
-初期化関数。プラグインが呼び出されるとまず最初に実行されます。プラグイン実行毎ではなく、最初の呼び出し時にだけ実行されます。

$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 での設定のほうが優先されます。

** ファイル内容 [#z1aca986]
ユーザに設定させる初期値などについては、define で定義して下さい。

コンバート時のGET・POSTの出力内容に必要なものは refer と plugin という値で、
>
refer : そのページの名前($vars["page"])~
plugin : プラグイン名

とします。

以下の値を global でグローバル変数にすることによって値を取得できます。
  $script : スクリプト名                    ※get_script_uri() の使用を推奨します
  $get : GETメソッドによるHTTPからの引数    ※$varsの使用を推奨します
  $post : POSTメソッドによるHTTPからの引数  ※$varsの使用を推奨します
  $vars : GET・POST両方のメソッドによるHTTPからの引数
  $vars["page"] : 開いているページ名
             (strip_bracket関数により[[]]を %%取り除ける%% 取り除かれている)

-- [[BugTrack2/213>BugTrack2/213#hb0abc89]] グローバル変数 $scriptは参照せず、get_script_uri() を使用することを推奨
-- 意図的にGETメソッド、またはPOSTメソッドを禁止するのでなければ、$vars を利用してください。
--- 特に、他からも参照されるpage やrefer の値を書き換える必要のある場合は、$get や、$post だけでなく、$vars も書き換える必要があります。(PukiWiki のシステムが$vars["page"] 、$vars["refer"] と参照しているため)

*** 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属性の属性値が#で始まっている場合は#を削除する必要があります。

//pre内のコードが右に延びすぎて文書として大変読みづらくなっていた為修正致しました。
//文章表現としてのコードと見受けられましたので崩し書きでも問題ないと思われます。
//1024x768で見られる様に修正しました。
-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]]) 

*** pukiwiki 用の javascript を作成する際に考慮すべきブラウザは... [#v1859e9c]
もともとPukiWiki 1.3.2からNetscape 4.xやIE4などには対応していない(切り捨てている)

(参照: [[PukiWiki/1.4/NewTable]] reimy さんの2002-09-17のコメントより) 

**関連 [#z4a6d84f]
-[[プラグイン/開発者向け]]

-[[PukiWiki/技術資料]]
--[[PukiWiki/CSSのclass一覧]]
--[[PukiWiki/関数一覧表]]

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新の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.009 sec.

SourceForge