この修正は広く評価を受けるための一時的なものであり、今後仕様が変更されたり、削除される事があります
定数 PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK を 0 にすることにより、有効となる実験的なコード(multiline_convert-16-for146.diff)を追加。
PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に の最新の成果ではあるものの、既存の「ページ書き換え方式」プラグインと干渉する事が判っています。PukiWikiのプラグインのような文字列を複数行の引数の中に書かないのであれば、それなりに動作するでしょう。
このBugTrackは、複数行のプラグイン引数を可能にするためのハックに対するポインタを与えるためのものです。最終的に話題をまとめる場所にもなるでしょう。
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); }
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; }
- textA #multiline{{{ - textB }}}
// 前処理 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);
$postdata_old = multi2single($postdata_old); foreach($postdata_old as $line) { : : : } $postdata = str_replace("\r", "\n", $postdata);