複数行の引数であるかを調べる正規表現が同じ意味になっていない

  • ページ: BugTrack2
  • 投稿者: 名無しさん
  • 優先順位: 低
  • 状態: 提案
  • カテゴリー: 本体バグ
  • 投稿日: 2008-02-14 (木) 19:46:39
  • バージョン:

メッセージ

複数行のプラグイン引数を、読み込む時のまとめ処理はlib/convert_html.php で、書き込み時の自動修正はlib/file.php で担当しています。
しかし、それぞれの正規表現が微妙に違うため、自動修正で誤判定をする時があります。

  • lib/convert_html.php (r1.20) のBody::parse()
    			// Multiline-enabled block plugin
    			if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK &&
    			    preg_match('/^#[^{]+(\{\{+)\s*$/', $line, $matches)) {
    				$len = strlen($matches[1]);
    				$line .= "\r"; // Delimiter
    				while (! empty($lines)) {
    					$next_line = preg_replace("/[\r\n]*$/", '', array_shift($lines));
    					if (preg_match('/\}{' . $len . '}/', $next_line)) {
    						$line .= $next_line;
    						break;
    					} else {
    						$line .= $next_line .= "\r"; // Delimiter
    					}
    				}
    			}
  • lib/file.php (r1.93) のmake_str_rules()
    		// Modify this line?
    		if ($modify) {
    			if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK &&
    			    $multiline == 0 &&
    			    preg_match('/#[^{]*(\{\{+)\s*$/', $line, $matches)) {
    			    	// Multiline convert plugin start
    				$modify    = FALSE;
    				$multiline = strlen($matches[1]); // Set specific number
    			}
    		} else {
    			if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK &&
    			    $multiline != 0 &&
    			    preg_match('/^\}{' . $multiline . '}\s*$/', $line)) {
    			    	// Multiline convert plugin end
    				$modify    = TRUE;
    				$multiline = 0;
    			}
    		}
  1. convert_html.php では行頭の# の直後に{ 以外の文字が1つ以上あってから{ となっているのに対して、
    file.php では行頭の# の直後に{ 以外の文字が0以上あってから{ となっています。
  2. convert_html.php では行のどこかに} がX個となっているのに対し、file.php では行頭に} がX個となっています。

1つ目は、読み込み時には複数行ではないと判定するものに対して、記録時に閉じタグのチェックを開始してしまいます*1

2つ目は、複数行の引数指定の解説 の3番で、「{と同じ数の}が行頭に現れるまでが引数として扱われます。」となっているのにもかかわらず、
読み込み時に行の途中に同じ数の}があるだけで複数行引数が終わりと判定してしまい、引数が原因でFactory_Div() はプラグインではないと判断してしまいます*2

あとついでなんですが、BugTrack2/154 の修正を次の場所にもしておきませんか?

  • 上に挙げたlib/convert_html.php のソースの中にある次の行を切り出す部分
     				while (! empty($lines)) {
    -					$next_line = preg_replace("/[\r\n]*$/", '', array_shift($lines));
    +					$next_line = rtrim(array_shift($lines), "\r\n");

関連




*1 とある行が「#{{」なんて事はまずないだろう、とは思いつつ
*2 開く&閉じるカッコの数を増やせば、ほとんどは回避できる気がする

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-08 (月) 12:14:13
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.243 sec.

OSDN