#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