tracker_list のpage から正規表現を得る部分について†
- ページ: BugTrack2
- 投稿者: 名無しさん
- 優先順位: 普通
- 状態: 完了
- カテゴリー: プラグイン
- 投稿日: 2007-05-25 (金) 19:08:34
- バージョン:
メッセージ†
tracker_list のテンプレート/page から正規表現を得る部分を修正して、実際に各ページの内容を得る時に、
official:WebTrack/57 で話題になったofficial:質問箱3/400 のような問題を起こらないようにしてみました。
// $Id: tracker.inc.php,v 1.36 2007/03/29 15:05:52 henoheno Exp $
// Copyright (C) 2003-2005 PukiWiki Developers Team
(中略)
class Tracker_list
{
(中略)
function Tracker_list($page,$refer,&$config,$list)
{
(中略)
while (count($pattern))
{
$this->pattern .= preg_replace('/\s+/','\\s*','(?>\\s*'.trim(array_shift($pattern)).'\\s*)');
if (count($pattern))
{
$field = array_shift($pattern);
$this->pattern_fields[] = $field;
- $this->pattern .= '(.*)';
+ $this->pattern .= '(.*?)';
}
}
(以降、省略)
これで、なるべく最短でマッチするようになるので、
テンプレート/page の形がofficial:質問箱3/400 のように複数回出てきても、最初のものだけ出力するようになるはずです。
実際のページが、テンプレート/page の形でなくなると弱いのはそのままですけど。
手のあいた時にCopyright と一緒にチェックをお願いします。
- Trackerに手を入れていただいているようなので、上げ。
official:質問箱4/21 「本文が大きくなると正しくlist表示されない」の対策にもなる*1様です。 -- ぃぉぃぉ
- 探索ありがとうございます。ついでにそれぞれのBugTrack間で相互リンクを作ったり、どこかにハブを作って下さると助かります。偶然も利用したいので、どこがきっかけになっても良い様であってほしいのです。 -- henoheno
- 関連?: BugTrack2/274 --
- cvs:plugin/tracker.inc.php (1.64) --
- フォローありがとうであります。ちょっとケチなトリック(今までの富豪的なアプローチの逆)を組み込もうとしたら、自然と同じ対応が浮き上がりました。別の側面からの提案であるこのBugTrackを目にしていたので、あまり不安は感じませんでした。(とはいえ、正規表現周りは怖いので、安心してませんが) -- henoheno
- ケチなトリックというのは: Tracker_list はこのような方法で長大な正規表現を構築してから、各ページより一気に各フィールドを抽出(= イメージとしては、それぞれの文書に「伸縮自在の、細長い穴がいくつか空いた紙」を押し当てて、穴から見える文字を読み取るようなことを)しているわけですが、従来は,
必要としないフィールドについても必ず*2キャプチャする正規表現と内部機構になっていました(= 必要のないところにも毎回必ず穴が開いていました)。この挙動を、tracker_list がその時「表示しない」し「ソート対象にしない」フィールドについてはキャプチャせずに無視するように改めました(= 不要な穴を埋めるようにしました)。結果として、より無駄がない正規表現が動的に生成され、より少ないコストで処理が完了する事が期待できます(= 余計な物が目に入る事がなくなるので、作業効率は上がるでしょう)。 -- henoheno
- 対応というのは: 無視すべきフィールドはカッコで囲む必要がないのですが、そうすると '.*' つまり任意の文字列を意味する正規表現になってしまいます。しかし「紙に空けた穴」の大きさは期待した規模であってくれないと結果が扱い辛いので、これには '?'を付け、最小一致であって欲しくなります。 -- henoheno
- ありうる副作用というのは: 穴の開いた紙(穴の数とか、周辺の形とか)がやたらに簡素である時に、従来の結果よりも短い領域しか読み取られない現象は起こるかもしれないな、と思っています。今まで最長一致だったものを逆にしたので、(条件に合った、より短い部分だけが抽出されてしまう事が)無いとは言い切れません。しかしtrackerのテンプレートはたいてい充分に複雑(穴が複数あったり、周辺のデザインに個性がある)なので、ほとんどの現場では問題にならないだろうとは思います。うーむ注意書きは書くべきか。 -- henoheno