管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || アンテナ || PUT || more≫ ≫omit
shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage ||[edit]
category: WikiLab/BeginnerGuidance

WikiLab/BeginnerGuidance/検索とカテゴリ - 検索を使ったカテゴリ管理の試み。

LastModified : Tue Aug 29 10:40:02 2006
[管理]

検索を使ったカテゴリ管理の試み。

カテゴリ一覧の多階層表示追加:2003/06/17(Tue)
ページ内カテゴリ検索の多階層追加:2003/06/16(Mon)
2003/02/18(Tue)
| WikiLab | WikiLab/BeginnerGuidance |

カテゴリ機能。

[TOP↑] [管理]

ページ内カテゴリ検索のリンク。

[TOP↑] [管理]
sub make_categorysearchlink
{
    my ($page) = @_;
    my @searchlink;
    my @category;
    my @pages = keys %database;
    foreach (split /\//, $page){
        push @category, $_;
        my $categorytree = join('/', @category);
        last if((grep /^$categorytree\/.+/, @pages) < 1);
        push @searchlink,
            sprintf(qq(<a href="$url_cgi?mycmd=search&mysearchtarget=title&mysea
rchcombo=and&mymsg=%s">%s</a>),
            &encode($categorytree), &escape(@category[-1]));
    }
    return join '/', @searchlink;
}

以下のようにすると、検索キーワードが / 毎にスペース区切りになり([WikiLab/BeginnerGuidance] が [WikiLab BeginnerGuidance] のようになります)、and 検索に切り替えて再検索などができるようになります。

        my %unique;    #add
        push @searchlink,
            sprintf(qq(<a href="$url_cgi?mycmd=search&mysearchtarget=title&mysea
rchcombo=and&mymsg=%s">%s</a>),
#            &encode($categorytree), &escape(@category[-1]));
            &encode(join(' ', grep(!$unique{$_}++, @category))), &escape(@category[-1]));    #add
@{[ $admineditable
    ? qq(<div class="categorysearch">category:@{[&make_categorysearchlink($page)]}</div>)
    : qq()
]}

old version(一階層)。

[TOP↑] [管理]

print_header

+ my $categoryname = &encode(split /\//,$page);

<h1 class="header"><a
    title="$resource{searchthispage}"
    href="$url_cgi?mycmd=search&amp;mymsg=$cookedpage">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}
    category:<a href="$url_cgi?mycmd=search&amp;mymsg=$categoryname&amp;onlyname=1" 
    title="$resource{searchthiscategory}">@{[&escape(split /\//,$page)]}</a>
</h1>

カテゴリ一覧。

[TOP↑] [管理]
my $CategoryPage = 'CategoryPage';
my %fixedpage = (
   $IndexPage => 1,
+  $CategoryPage => 1,
   $CreatePage => 1,
   $ErrorPage => 1,
   $RssPage => 1,
   $RecentChanges => 1,
   $SearchPage => 1,
   $AdminChangePassword => 1,
   $CompletedSuccessfully => 1,
   $FrontPage => 1,
);
my %page_command = (
   $IndexPage => 'index',
+  $CategoryPage => 'category',
   $SearchPage => 'searchform',
   $CreatePage => 'create',
   $RssPage => 'rss',
   $AdminChangePassword => 'adminchangepasswordform',
   $FrontPage => 'FrontPage',
);
my %command_do = (
   read => \&do_read,
   edit => \&do_edit,
   adminedit => \&do_adminedit,
   adminchangepasswordform => \&do_adminchangepasswordform,
   adminchangepassword => \&do_adminchangepassword,
   write => \&do_write,
   index => \&do_index,
+  category => \&do_category,
   searchform => \&do_searchform,
   search => \&do_search,
   create => \&do_create,
   createresult => \&do_createresult,
   FrontPage => \&do_FrontPage,
   comment => \&do_comment,
   rss => \&do_rss,
   diff => \&do_diff,
   interwikibox => \&do_interwiki_box, # Walrus add [InterWikiBox]
);
sub do_category {
    &print_header($CategoryPage);
    print qq(<ul>);
    my %trees;
    my $level = 0;
    my $prev;
    my @pages = ($sort_case_sense) ? (sort keys(%database)) : sort {lc($a) cmp lc($b)} keys(%database);
    foreach my $page (@pages){
        my @category;
        foreach ($page =~ /(.+?)\//g){
            my $parent = join '/', @category;
            $parent = lc($parent) if($sort_case_sense);    # 一覧で大文字/小文字を無視
            push @category, $_;
            my $categorytree = join '/', @category;
            next if($trees{$categorytree});
            $trees{$categorytree} = 1;
            if($prev ne $parent){
                print qq(</ul>) x ($level - $#category);
                print qq(<ul>) x ($#category - $level);                 
                $prev = $parent;
                $level = $#category;
            }
            printf qq(<li><a href="$url_cgi?mycmd=search&mysearchtarget=title&mysearchcombo=and&mymsg=%s" title="$resource{searchthiscategory}"><span style="font-weight:bold">%s</span></a>),
                &encode($categorytree), &escape(@category[-1]);
            if($database{$categorytree}){
                printf qq( - <span style="font-size:0.9em">[<a href="$url_cgi?%s" title="$resource{categorytop}">%s</a>%s]</span>),
                    &encode($categorytree), &escape($categorytree), &escape(&get_subjectline($categorytree));
            }
            print qq(</li>\n);
        }
    }
    print qq(</ul>) x ($level + 1);
    &print_footer($CategoryPage);
}
            my %unique;    # add
            printf qq(<li><a href="$url_cgi?mycmd=search&mysearchtarget=title&mysearchcombo=and&mymsg=%s" title="$resource{searchthiscategory}"><span style="font-weight:bold">%s</span></a>),
#                &encode($categorytree), &escape(@category[-1]);
                 &encode(join(' ', grep(!$unique{$_}++, @category))), &escape(@category[-1]);    #add

とすると、検索キーワードが / 毎にスペース区切りになり([WikiLab/BeginnerGuidance] が [WikiLab BeginnerGuidance] のようになります)、and 検索に切り替えて再検索などができるようになります。

old version(一階層)。

[TOP↑] [管理]
sub do_category {             
   &print_header($CategoryPage);
   print qq(<ul>);
   foreach my $page (sort keys %database) {
       if ($page =~ /\//){
           print qq();
       } elsif (&is_editable($page)) {
           my $categoryname = &encode(split /\//,$page);
           print qq(<li><a href="$url_cgi?mycmd=search&amp;mymsg=$categoryname&amp;onlyname=1" title="$resource{searchthiscategory}"><span style="font-weight:bold">@{[&escape(split /\//,$page)]}</span></a> -  <span style="font-size:0.9em">[<a href="$url_cgi?@{[&encode($page)]}" title="$resource{categorytop}">$page</a>@{[&escape(&get_subjectline($page))]}]</span></li>\n);
       }
   }
   print qq(</ul>);
   &print_footer($CategoryPage);
}

WikiName の変更。

[TOP↑] [管理]

ほとんどのページに [/] が含まれるため、[/]を含むページ名と、ナンバリングしたページ名も WikiName として扱われるようにした。

my $wiki_name   = '\b([A-Z][a-z]+([A-Z][a-z0-9/]*)+)\b';

InterWikiName を利用。

[TOP↑] [管理]

単にページ名検索するだけなので、InterWikiName を利用して検索させることもできます。 InterWikiName のページに

[[category http://***/wiki.cgi?mycmd=search&mysearchtarget=title&mysearchcombo=and&mymsg=euc($1)]]

などと登録しておき、任意の場所に [[category:WikiLab/BeginnerGuidance]] と書くと、category:WikiLab/BeginnerGuidance このようなカテゴリ検索へのリンク文字列になります。

また、[○○/メモ] [□□/メモ] [△△/メモ] などというページがある場合、[[category:メモ]]で検索できます(不体裁なようで、もしかしたら便利かもしれません)。

その他カテゴリ関係のカスタマイズリンク。

[TOP↑] [管理]

欠点。

[TOP↑] [管理]

おまけ。WalWiki2.05Wal2・YukiWiki でページ名検索。

[TOP↑] [管理]

print_searchform

 sub print_searchform {
     my ($word) = @_;
+    my $onlyname = (exists $form{onlyname})?' checked="checked"':'';
     print <<"EOD";
 <form action="$url_cgi" method="get">
     <input type="hidden" name="mycmd" value="search">
     <input type="text" name="mymsg" value="$word" size="20">
     <input type="submit" value="$resource{searchbutton}">
+    <br><input type="checkbox" name="onlyname" value="1"$onlyname>WikiName only
 </form>
 EOD
 }

do_search

foreach my $page (sort keys %database) {
    next if $page =~ /^$RecentChanges$/;
-   if ($database{$page} =~ /\Q$form{mymsg}\E/ or $page =~ /\Q$form{mymsg}\E/) {
+   if (not exists $form{onlyname} and $database{$page} =~ /\Q$form{mymsg}\E/ or $page =~ /\Q$form{mymsg}\E/) {
        if ($counter == 0) {
            print qq|<ul>|;

コメント。

[TOP↑] [管理]

Q: 検索のリンクが表示できない。

[TOP↑] [管理]

もう一つのカテゴリ機能。_

[TOP↑] [管理]

WalWiki 2.0.5.wal.3 から新しい検索機能として、検索結果を見出しごとに表示するようになったので、別のカテゴリ管理を考えてみました。上の方法よりずっと簡単な方法「キーワード検索によるカテゴリ管理」。 {{ key:*** }} と書くと、key:*** で検索するリンク文字列ができる。 関連記事に同じ key を埋めておけば、見出しごとに関連記事を検索することができる。ただそれだけです。

見出し・検索結果表示の調整(ちょっと信用できないかも)

{{ key:today }}は「今日の日付」で書かれた記事を検索するためのオマケ(get_date関数とtdaystr変数を作っておく必要があります)。 本当は日付検索用カレンダーを作ろうとしたけど、ザセツ。さらに「前後3日」も挫折したまま。

コメント。

[TOP↑] [管理]

お名前: タイムスタンプを更新: 荷札を付ける:

個人的メモ書き。

[TOP↑] [管理]

そもそも何でもかんでも一つの Wiki に詰め込みたがるから。

[TOP↑] [管理]

最初に wiki を設置しようと思ったとき、どうしても欲しかったのが、ページをジャンルごとに分ける仕組み。

記法を追加したり、いくつか簡単な改造を加えているうちに、ぼんやりと「WalWiki にカテゴリ機能をつける」という大それた野望を持ち始める。

一方、もともとの WalWiki(YukiWiki) の検索機能には、and or 検索がなかったので、これもなんとかしたいと野望を持ち、どこかに YukiWiki 系の wiki でそれらの機能が付いているものはないかと探していて、YukiWiki:カテゴリ機能 というページを見つける。 「ページ名検索でカテゴリ機能を実現する」というアイディアと、「ページ名検索」のためのコードをお借りする。

どうせ自分だけで使う wiki なので、ページ名に必ずカテゴリ名を含めるというページの命名規則を作って、遵守すればいいだけ。

本当は他の wiki にあるように、一覧をリストで階層表示したかったんだけど、タグの入れ子を具体的にどうすりゃいいのか、考えるのが面倒になって放棄した。 でも、階層表示してあっても、一覧が長いと下のほうを見るのは大変。 カテゴリのトップページだけをピックアップした一覧を出すと、目的のページまでのクリック回数は多くなるものの、返って見やすいかもしんない。と個人的に納得

ページ作成時のごたく:2003/02/18(Tue)

本家、カテゴリほにゃらら。

[TOP↑] [管理]

本家 WikiWikiWeb ではページのカテゴリ化も、検索を使って擬似的に実現している。「ほにゃらら」カテゴリとしたいページには「Categoryほにゃらら」という WikiName を書いておく。「ほにゃららカテゴリ」のページから「Categoryほにゃらら」の一覧へは、

・「Categoryほにゃらら」をクリック

・そのページのタイトル「Categoryほにゃらら」をクリックして、その文字列の含まれているページを検索

と2クリックで到達。

InterWiki をうまく組み合わせれば、1つのリンクでページのカテゴリ指定しつつカテゴリ一覧(検索結果)へのリンクも可能。[[ カテゴリ:ほにゃらら ]]のリンク先が'カテゴリ:ほにゃらら' という文字列を検索するページになるような InterWiki の定義をしておけばよろし。

http://www.naney.org/personal/diary/2002/09/b.html#200209202

なんか説明をよく理解できないけど、私の考えは本家を辿った、というか、戻った、ということ? 要は「検索による擬似的なカテゴリ化」ということなわけで、 私は自分ことのカテゴリ管理を「なんちゃってカテゴリ」だと思ってたんだけど、本家じゃん。 別に「じゃん」とか得意げに言わなくてもいいけど、 「お手軽なんちゃってカテゴリしかできなかった…(´・_・`)…」と恥じなくてもよし、と。

ついでに、もしかして wiki って「混沌」としたまま使うもんなのかという感じがしていて、自分の検索機能への執着に「間違った使い方をしようとしてるから苦労するのかな(あるいは間違った道具を選んだから苦労してるのか)」と思ったけど、

TheWikiWay をとりあえず一通り読み終えて「検索」機能を随分重視しているなぁと思ったのだが

http://www.naney.org/personal/diary/2002/09/b.html#200209202

だそうで、別にマチガイでもないようだった。

2003/01/27(Mon) 13:13:08

先々の見通し。

[TOP↑] [管理]

wal3 の新しい見出しの検索は楽しみにしてたんだけど、一方で、見出しと検索周りの改造がひっかかって「そのまんま取り入れる」ってワケには行かないだろうと覚悟はしてた。

案の定、新しい検索機能とカテゴリ表示が中途半端に混在した「ちぐはぐ状態」になってしまった。 でも、両方諦めるわけにはいかなくて、この数日、傍から見たら「なんだかよくわからない状態」のままほったらかし。 改造するのもいいけど、先々を考えないといけないね。

2003/02/05(Wed) 17:59:35

shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage || [edit]
select css: default | sakura | mono | greenheck | snow | NN4.x用(多分) || LinuZau!! | VikiWiki!? || others |

管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || PUT