** netdraw.inc.php [#h6da1008] |RIGHT:100|LEFT:360|c |~サマリ|お絵描き(ドロー)プログラムのプラグイン| |~リビジョン|1.0| |~対応バージョン|1.4.7| |~投稿者|[[takashi yamanoue:http://yama-linux.cc.kagoshima-u.ac.jp/~yamanoue]]| |~投稿日|&new{2009-04-11 (土) 08:29:37};| 文書と同様に、絵も共有したいと思うことがよくあります。pukiwiki では、ビットマップの画像を作成するペイントプログラムのプラグイン paint はあるのですが、線や多角形などの画素を配置して絵を作成するドロープログラムのプラグインは見当たりませんでした。そこで、dsr(または solar-cats)に備わっているドロープログラムをpukiwiki で利用できるようにしました。 ** 詳細, ダウンロード方法, インストール方法, 利用方法, バグ情報など [#k66d8f7a] - http://yama-linux.cc.kagoshima-u.ac.jp/netdraw をご覧ください。 ** ライセンス [#dbf0df0f] - 個人利用や教育利用の場合は自由にご利用ください。改造も自由です。再配布も自由です。 - 商用利用の場合は yamanoue at cc.kagoshima-u.ac.jp にご相談ください。 ** 今後の予定(いつになるかわからないので、やりたい人がやってくれると嬉しいです) [#b466a7ef] - dsr (solar-cats)のお絵描きプログラムの改善 -- undo は必須 -- グループ化も必須 -- 絵の間のリンク機能の有効化 --- http://yama-linux.cc.kagoshima-u.ac.jp/class/coins/fig/fig2.html では動いているのだが...(play をボタンクリックしてください) -- dsr (solar-cats) の操作記録/再生機能の有効化 ** コメント [#q22c0f55] - Install のページにあるnetdraw のプラグインのソース、見ただけでもツッコミどころ満載なんですが。 -- &new{2009-04-11 (土) 19:58:08}; -- $source にページの内容を入れているが、その後で使っていない。 -- $width と$height に縦横のサイズを入れているのに、出力では$f_w と$f_h を使っている。(paint プラグインの途中の処理を消したので、食い違っているのだと・・・) -- $numbers を頭で定義しているが、出力では$f_no を使っている。(これも、途中の処理を・・・) -- $uri にサイトアドレスを入れているのに、出力では$script を使っている。(名称変更を反映してないだけかと・・・) -- $f_page にページ名を入れているのに、出力では$r_refer を使っている。(名称変更を、以下略) -- $f_digest を定義する部分が消えている。。(これも、途中の処理を・・・) -- $_paint_messages をそのまま使っているが、global 宣言で呼び出していないので、大概のPHP環境はエラーになりそう。 - ツッコミ、どうもありがとうございます。paint.inc.php を書き変えさせてもらっているのですが、それがかなり残っていたようです。applet 側ではほとんど使っていないので、修正します。$script は使っていますが、これは gloval の値がそのまま使っている、ということになると思いますが、バグや脆弱性の温床になる場合があるでしょうか? -- &new{2009-04-11 (土) 20:15:07}; - あ、gloval 宣言してるのを見逃してました。ただ、[[dev:BugTrack2/213#hb0abc89]] で各ソースの修正が開始されてますので、後々のためにgloval の値ではなくget_script_uri() の値を使うことが推奨されてます。 -- &new{2009-04-11 (土) 21:02:28}; -- あと、おせっかいかもしれませんが、[[dev:BugTrack2/61/まだの物一覧#vd314968]] で調査中のpaint プラグインの著作クレジットを、併記しておいたほうがいいかもしれませんよ。($id に残っている残骸からすると、paint.inc.php Rev. 1.13 がベースで、PukiWiki Developers Team が直接変更をかけたのは2003年までみたいですけど) -- &new{2009-04-11 (土) 21:02:28}; - どうもありがとうございます。今、手元で以下のように修正しました。どうでしょうか? -- &new{2009-04-11 (土) 21:32:51}; <?php // PukiWiki - Yet another WikiWikiWeb clone // // netdraw.inc.php // t.yamanoue, 2009 // // Acknowledgement // This plugin is based on the paint.inc.php // Copyright (C) 2002-2005,2007 PukiWiki Developers Team // Copyright (C) ? -2002 panda // /* * Usage * #netdraw * パラメータ // 文字コード (EUC_JP, UTF-8, ...) 例 #netdraw(EUC_JP) */ function plugin_netdraw_convert() { if (PKWK_READONLY) return ''; // Show nothing //戻り値 $ret = ''; //引数 $args = func_get_args(); $charset="UTF-8"; if(count($args)==1){ $charset= array_shift($args); } $uri=get_script_uri() ; $ret = <<<EOD <div> <applet codebase="./dsr/classes" code="application/draw/PukiwikiApplet.class" archive="lib/commons-codec-1.3.jar,lib/commons-httpclient-3.1.jar,lib/commons-logging-1.1.1.jar" width="100" height="100"> <param name="action" value="$uri" /> <param name="param1" value="plugin=netdraw" /> <param name="return.URL" value="uri" /> <param name="charset" value="$charset" /> </applet> </div> EOD; return $ret; } ?> - ほぼ大丈夫そうですね。&br;欲を言えば、いたずら防止のために$charset をエスケープするか、入力値が不正でないか(スクリプトが受け付ける値なのか)をチェックするか、したほうが無難です。&br;もうひとつおせっかい、1.4.5以降で改造していなければ「テキストの文字コード = ブラウザで表示する文字コード」なので、CONTENT_CHARSET 定数を使えば初期値が自動化されて楽になるかもしれません。(EUC_JP だけじゃなくEUC-JP もスクリプトが受け付けてくれるならですけど) -- &new{2009-04-11 (土) 22:33:02}; - さっそくありがとうございます。引数のエスケープ、完全に忘れてました。大河原哲さんの “PukiWiki による Web コラボレーション”を見ながらプラグインを作成したのですが、CONTENT_CHARSET 定数を見つけきれませんでした。これがあれば利用者は余計な気遣いをしなくていいので、ぜひ使おうと思います。 -- &new{2009-04-11 (土) 23:20:14}; -- 上の修正を手元で行いました。だいぶ短くなりました。 <?php // PukiWiki - Yet another WikiWikiWeb clone // // netdraw.inc.php // t.yamanoue, 2009 // // Acknowledgement // This plugin is based on the paint.inc.php // Copyright (C) 2002-2005,2007 PukiWiki Developers Team // Copyright (C) ? -2002 panda // /* * Usage * #netdraw * パラメータ なし */ function plugin_netdraw_convert() { if (PKWK_READONLY) return ''; // Show nothing //戻り値 $ret = ''; $charset=CONTENT_CHARSET; $uri=get_script_uri() ; $ret = <<<EOD <div> <applet codebase="./dsr/classes" code="application/draw/PukiwikiApplet.class" archive="lib/commons-codec-1.3.jar,lib/commons-httpclient-3.1.jar,lib/commons-logging-1.1.1.jar" width="100" height="100"> <param name="action" value="$uri" /> <param name="param1" value="plugin=netdraw" /> <param name="charset" value="$charset" /> </applet> </div> EOD; return $ret; } ?> - CONTENT_CHARSET 定数は、PukiWiki 1.4.5 以降ならlib/init.php で定義されています。普通なら、スキンとかでしか使わないですけど。(関連情報: [[dev:開発日記/2004-09-19]])&br;ツギハギな構成ですが、プラグインを作成するための情報が[[dev:プラグイン/開発者向け]] やそのリンク先にあります。もしかしたら、何かの役に立つ日が来るかもしれません。 -- &new{2009-04-11 (土) 23:52:19}; - どうもありがとうございます。将来役に立つと思います。 -- &new{2009-04-11 (土) 23:56:27}; - 上記の修正を、http://yama-linux.cc.kagoshima-u.ac.jp/netdraw でも行いました。 -- &new{2009-04-13 (月) 08:08:14}; - </applet> が消えてしまっているので、プラグインを呼び出した以降の文章が(編集のプレビュー時は、編集領域なども)表示されない場合があるようです。勝手ながら、上の修正には閉じタグを書き込んでおきました。&br;あと素朴な疑問なのですが、1つのページ中で複数回プラグインを呼び出した場合、プラグインを書き込んだ数だけウインドが表示されますが、競合などの問題はないのでしょうか?(リミッターを仕込んでいないので、こうなるのだと思いますが・・・) -- &new{2009-04-13 (月) 13:41:53}; - 閉じタグ、ありがとうございます。閉じタグを付けなくても applet は起動されて、ついでに、絵を表わす文字列が隠れて見えないので良いかなと思いましたが、文法的には間違いですね。競合についてはまだ何も考えていませんでした。考えてみます。この点についてみなさまのアドバイスをいただけると幸いです。 -- &new{2009-04-13 (月) 15:09:26}; #comment