* [EXPERIMENTAL] 複数行のプラグイン引数を可能に [#z5c60ead] -ページ: [[BugTrack2]] -投稿者: [[henoheno]] -優先順位: 普通 -状態: 着手 -カテゴリー: 本体新機能 -投稿日: 2005-07-03 (日) 21:32:39 -バージョン: #contents ** 修正 [#y368b978] &color(red){この修正は広く評価を受けるための一時的なものであり、今後仕様が変更されたり、削除される事があります}; 定数 PKWKEXP_''DISABLE''_MULTILINE_PLUGIN_HACK を 0 にすることにより、有効となる実験的なコード(multiline_convert-16-for146.diff)を追加。 [[PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に]] の最新の成果ではあるものの、既存の「ページ書き換え方式」プラグインと干渉する事が判っています。PukiWikiのプラグイン''のような文字列''を複数行の引数の中に書かないのであれば、それなりに動作するでしょう。 - [[cvs:pukiwiki.ini.php]] (1.127) - [[cvs:lib/convert_html.php]] (1.14) - [[cvs:lib/file.php]] (1.30) - [[cvs:lib/plugin.php]] (1.15) **メッセージ [#r07f9e6e] このBugTrackは、複数行のプラグイン引数を可能にするためのハックに対するポインタを与えるためのものです。最終的に話題をまとめる場所にもなるでしょう。 - [[PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に]] - [[PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に/仕様検討]] - [[開発日記/2004-11-16]] - [[開発日記/2005-07-03]] ** 影響を受ける可能性のあるもの [#l9370dac] *** 利用時に影響を受ける可能性のあるもの [#l9370dac] - plugin/article.inc.php - plugin/comment.inc.php - (plugin/edit.inc.php [[見だし編集機能>BugTrack/585]]を使っている場合) - plugin/insert.inc.php - plugin/ls2.inc.php - plugin/memo.inc.php - plugin/paint.inc.php - plugin/pcomment.inc.php - plugin/vote.inc.php ---- ** コメント [#pb644cc4] ** 文章データの処理方法案 [#pb644cc4] - ちょっと考えてみました。こんなんどうでしょう? -- [[0]] &new{2005-12-24 (土) 12:47:52}; -- ↓追加関数。 function plugin_for_mph($line, $lines) {// for multiline plugin hack $multi = false; $matches = array(); if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK && preg_match('/^#[^{]+(\{\{+)\s*$/', $line, $matches)) { $multi = true; $len = strlen($matches[1]); while (! empty($lines)) { $next_line = $line .= array_shift($lines); if (preg_match('/\}{' . $len . '}/', $next_line)) { break; } } } return array($line, $lines, $multi); } -- 例えば、memoプラグイン↓。 diff -ur /org/plugin/memo.inc.php /dev/plugin/memo.inc.php --- /org/plugin/memo.inc.php +++ /dev/plugin/memo.inc.php @@ -22,15 +22,26 @@ @@ -22,11 +22,12 @@ $postdata_old = get_source($vars['refer']); $postdata = ''; $memo_no = 0; - foreach($postdata_old as $line) { - if (preg_match("/^#memo\(?.*\)?$/i", $line)) { + while (! empty($postdata_old)) { + $line = array_shift($postdata_old); + list($line, $postdata_old, $multi) = plugin_for_mph($line, $postdata_old); + if (preg_match("/^#memo\(?.*\)?$/i", $line) && $multi == false) { if ($memo_no == $vars['memo_no']) { - $postdata .= '#memo(' . $memo_body . ')' . "\n"; - $line = ''; + $line = '#memo(' . $memo_body . ')' . "\n"; } ++$memo_no; } - ただし、上記方法は自己書き換え型プラグインが複数行でない場合に限ります。 -- [[0]] &new{2005-12-24 (土) 13:10:38}; - pcomment で “$reply == true” 時、読み込むテキストが以下のような場合にも注意が必要なようです。参考までに。 -- [[0]] &new{2006-03-23 (木) 16:02:03}; - textA #multiline{{{ - textB }}} -- textB の md5 を書き込むが、convert_html($data) で <li> として返ってこないので置き換えが出来ないのが原因です。ここも回避しないとダメなようです。 -- [[0]] &new{2006-03-23 (木) 16:03:14}; - また微妙な関数を考えてみました。参考までに↓ -- [[0]] &new{2006-06-22 (木) 15:51:13}; // 前処理 function multi2single($lines) { if (PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { return $lines; } $return_lines = array(); while (! empty($lines)) { $line = array_shift($lines); if (substr($line, 0, 1) == '#' && preg_match('/^#[^{]+(\{\{+)\s*$/', $line, & $matches)) { $len = strlen($matches[1]); $line .= "\r";// Delimiter while (! empty($lines)) { $next_line = array_shift($lines); if (preg_match('/\}{' . $len . '}/', rtrim($next_line, "\r\n")) { $line .= $next_line ."\r"; break; } else { $line .= $next_line .= "\r";// Delimiter } } } $return_lines[] = $line; } return $return_lines; } // 後処理 $lines = str_replace("\r", "\n", $lines); -- 例えば memo プラグイン $postdata_old = multi2single($postdata_old); foreach($postdata_old as $line) { : : : } $postdata = str_replace("\r", "\n", $postdata); - 処理するデータを複数行とは無関係なものにします(( #multi{{hoge}} の中身(hoge)とは干渉しないはずです ))。後処理は少々強引ですが (^^; -- [[0]] &new{2006-06-22 (木) 16:08:33}; //#comment ** コメント [#g996085f] - lib/convert_html.php と lib/make_link.php は基本的に、先に分解できるところまで分解・変換してしまうように処理をしていますが、ブロック型プラグインだけ実行が後回しになっているので、複数行のプラグイン引数内でプラグインを呼ぶと、表示順序(ソース上での出現順)と実際のカウント番号が合わなくなってしまうようです。([[official:自作プラグイン/attachref.inc.php]] のコメント参照)&br;YTable クラスで「toString() を呼ぶ前に、html形式に変換しているのはなぜか?」とコメントしているのを解決すれば、どうにかなるんですかね?(逆に周りに合わせて、Div::Div() でdo_plugin_convert() を実行するでも、一応は・・・ですけど) -- &new{2009-04-13 (月) 19:38:20}; //#comment