#author("2017-10-28T03:34:43+09:00;2017-10-28T00:58:48+09:00","","")
* ls2 plugin: ソース読み取り時のマルチライン対応(仮)と、include の読み取り精度UP [#y0b5296c]
#author("2017-10-30T00:26:36+09:00","","")
* ls2 plugin: ソース読み取り時のマルチライン対応(仮)[#y0b5296c]

- ページ: [[BugTrack]]
- 投稿者: [[名無しさん]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: プラグイン
- 投稿日: 2008-02-07 (木) 22:18:25
- バージョン: 1.4.7

** メッセージ [#rf5d2fe8]
[[BugTrack/2283]] より移動:

複数行の引数が[[ここの例のような記述>PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に#g021aaed]]であった場合に、引数の中身に対しても見出しへのリンクを生成してしまい、結果としてアンカーの番号がずれてゆきます。

また、include を見つけた場合に、notitleなどのパラメータが含まれている場合や、相対パスを考慮していないので、存在しないページと判定されスキップされる場合があります。
-[[cvs:plugin/ls2.inc.php]] (1.29)
  	$anchor = PLUGIN_LS2_ANCHOR_ORIGIN;
 +	$multi   = 0;
  	$matches = array();
  	foreach (get_source($page) as $line) {
 -		if ($params['title'] && preg_match('/^(\*{1,3})/', $line, $matches)) {
 -			$id    = make_heading($line);
 -			$level = strlen($matches[1]);
 -			$id    = PLUGIN_LS2_ANCHOR_PREFIX . $anchor++;
 -			plugin_ls2_list_push($params, $level + strlen($level));
 -			array_push($params['result'],
 -				'<li><a href="' . $href . $id . '">' . $line . '</a>');
 -		} else if ($params['include'] &&
 -			preg_match('/^#include\((.+)\)/', $line, $matches) &&
 -			is_page($matches[1]))
 -		{
 -			plugin_ls2_get_headings($matches[1], $params, $level + 1, TRUE);
 -		}
 +		if ($line == '') continue;
 +
 +		if ($multi > 2) {
 +			if (preg_match('/\}{' . $multi . '}/', $line)) {
 +				$multi = 0;
 +			}
 +			continue;
 +		}
 +
 +		switch ($line{0})
 +		{
 +		case '#':
 +			if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK &&
 + 			    preg_match('/^#[^{]+(\{\{+)\s*$/', $line, $matches))
 +			{
 +				$multi = strlen($matches[1]);
 +			}
 +
 +			if ($params['include'] &&
 +				preg_match('/^#include\((.+)\)/', $line, $matches))
 +			{
 +				$include_page = array_shift(csv_explode(',', $matches[1]));
 +				$include_page = get_fullname($include_page, $page);
 +				if (is_page($include_page)) {
 +					page_list2_get_headings($include_page, $params, $h_level, TRUE);
 +				}
 +			}
 +			break;
 +
 +		case '*':
 +			if ($params['title'])
 +			{
 +				preg_match('/^(\*{1,3})/', $line, $matches);
 +				$id      = make_heading($line);
 +				$h_level = $level + strlen($matches[1]);
 +				$id      = _PLUGIN_LS2_ANCHOR_PREFIX . $anchor++;
 +				page_list2_list_push($params, $h_level);
 +				$params['result'][] = ' <li><a href="' . $params['read_href'] . $r_page . $id .
 +				    '">' . $line . '</a>';
 +			}
 +			break;
 +		}
 +	}
  }

- include の判定の部分ですが、preg_match('/^#include\((.+)\)/', となっていて、確実に1文字以上あるはずなのでcsv_explode() を使って切り分けてます。
それと、マルチラインの終了チェック時以外は、処理速度向上のために各行で1文字目をチェックするようにしています。 --  &new{2008-02-07 (木) 22:18:25};
- switch を使う方がどうも速いような気がするので、差分を差し替え。 --  &new{2008-02-10 (日) 23:54:16};

--------

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新の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.076 sec.

SourceForge