ls2 plugin: ソース読み取り時のマルチライン対応(仮)

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

メッセージ

BugTrack/2283 より移動:

複数行の引数がここの例のような記述であった場合に、引数の中身に対しても見出しへのリンクを生成してしまい、結果としてアンカーの番号がずれてゆきます。

  • 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文字目をチェックするようにしています。 -- 2008-02-07 (木) 22:18:25
  • switch を使う方がどうも速いような気がするので、差分を差し替え。 -- 2008-02-10 (日) 23:54:16



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

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

OSDN