サマリ | TODO など、各ページに散らばったマーク付き行を grep して一覧表示する |
---|---|
リビジョン | 0.01 |
対応バージョン | 1.4.3 |
投稿者 | tai |
投稿日 | 2004-07-28 (WED) 12:58:56 |
トピック別や時系列でページを書き続けていると、TODO などの小さな項目が各所に分散してしまい管理が難しくなります。一方、意識して TODO は TODO ページ、のように細かく種類分けして書くと書き分けが手間です。
こういう「トピック化するのも煩雑だがまとめて管理したい」という項目を「1行トピック」と私は呼んでいますが、これを検索して一覧表示してくれるプラグインです。
*** PukiWiki 開発 - [PROJECT] todo プラグイン開発。完成&登録中。 - [TODO] プラグインを登録すること
のように [タグ] 形式で行が始まるように 書いておくと(「*」や「-」で始まっても 大丈夫です)、後で
*** プロジェクトと一行ステータス #todo('', PROJECT) *** TODO 一覧 #todo('', TODO)
として一覧表示することができます。 一覧中の各引用行には元ページへのリンクも 付くので、行一覧画面から辿っての編集作業も 簡単にできます。#calendar2 プラグインで 時系列に書きながら [TODO] を書いていくと、 登録時間もページ名でわかるので便利です。
// 探索するマーク行のパターン $expr = "/^[\*\-\+\s]*(\[".$mark."\].*)/i";にすればよさそうですよ。 -- 2005-10-14 (金) 13:08:53
foreach ($todo as $page => $list) { sort($list); foreach ($list as $line) { $html .= "- " . $line . " [[[" . $page . "]]]\n";のようにsort()を入れておくと、日付順でソートされてでてくるので便利です。 -- 志田 2005-10-11 (火) 08:52:37
todo.inc.php 104行目辺りtodo_search関数内 foreach (get_source($name) as $line) { + $line = preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/m','$1$2',$line); if (preg_match($expr, $line, $match)) {と一行追加してアンカーは消えたのですが、これで大丈夫かな~と聊か不安です; -- Mim 2006-07-28 (金) 23:24:38
///////////////////////////////////////////////// // ユーザ定義ルール(コンバート時に置換) $line_rules = array( //------ 途中省略 ----------- // TODO のタグを隠す '\[%' => '<span style="display:none">', '%\]' => '</span>', );tag.inc.phpと組み合わせて使い分けると、きめの細かい索引付けができると思います。
function todo_generate_index($vars, $page, $mark) { $todo = todo_search($vars, trim($page), trim($mark)); foreach ($todo as $page => $list) { foreach ($list as $line) { // &aname();が使えるようにする + $anchor =''; + if (preg_match("/.*&aname\((.*)\);.*/i", $line, $match)) { + $anchor = "#" . $match[1]; + } - $html .= "- " . $line . " [[[" . $page . "]]]\n"; + $html .= "- " . $line . " [[[" . $page . $anchor . "]]]\n"; } } return convert_html($html); }
function todo_generate_index($vars, $page, $mark) { $todo = todo_search($vars, trim($page), trim($mark)); foreach ($todo as $page => $list) { foreach ($list as $line) { + $anchor =''; + if (preg_match("/^[\*\-\s]*(\[". $mark ."\][^#]*)(?:\[#([A-Za-z][\w-]+)\])?$/m", $line, $match)) { + $line = $match[1]; + if (isset($match[2])) { + $anchor = "#" . $match[2]; + } + } - $html .= "- " . $line . " [[[" . $page . "]]]\n"; + $html .= "- " . $line . " [[[" . $page . $anchor . "]]]\n"; } } return convert_html($html); }todosearchの中身と同じような正規表現をもう一度書いているのが気にはなっています --ari 2009-07-02 (木) 20:36:59
foreach ($list as $line) { + $line = substr($line, strlen($mark)+1, strlen($line));
function todo_search(...) : // 探索するマーク行のパターン //$expr = "/^[\*\-\s]*(\[".$mark."\].*)/i"; $expr = "/^[\*\-\s]*((\[\S+\])*\[".$mark."\](\[\w+\])*.*)/m";
function todo_generate_index($vars, $page, $mark) { $todo = todo_search($vars, trim($page), trim($mark)); ksort($todo, SORT_STRING); foreach ($todo as $page => $list) { foreach ($list as $line) {のようにして、配列$todo そのものの順番を並べ替える必要があります。(todo_search() 内で先に並べ替えておいてもかまいません。そのへんは好みでどうぞ) -- 2010-01-30 (土) 08:36:46