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

WikiLab/BeginnerGuidance/TagLinks - タグを付けたページへのリンクをリスト表示。

LastModified : Sat Oct 9 10:24:32 2004
[管理]

タグを付けたページへのリンクをリスト表示。

SHIAMDA さん作の Wiki にあった tag-links を WalWiki に移植し、細かいカスタマイズを加えました。

tag-links の概要。

[TOP↑] [管理]

tag-links は、「タグの値別にページへのリンクを列挙する」機能です。 ページのカテゴリ分けに使ったり、または複数ページに書いたメモ類などを抽出して表示することが出来ます。

  1. ページ内の任意の個所に「タグ」を書いておきます。例えば ::読書ノート:: など。
    • 注意:SHIMADA さんのページでは _hoge_ というルールになっています。
  2. 任意のページに[[#tags:読書ノート]] などと記述します。
  3. タグの書かれたページへのリンクと、「タグ」を書いた個所以下一行分がリスト表示されます。

カスタマイズの内容。

[TOP↑] [管理]

ソース。

[TOP↑] [管理]

グローバル変数

[TOP↑] [管理]
my $TagsList = 'WikiTool/TagsList';                # rica add [comment tag] # プルダウンメニュー用
my $embed_tags = '\[\[#tags:(\S+)\]\]$';                                        # SHIMADA add [tag-links]

embedded_to_html() 変更

[TOP↑] [管理]
    my ($embedded) = @_;
    my $escapedmypage = &escape($form{mypage});
    # rica add [comment tag] start # プルダウンメニュー用
    my $contents;
        foreach (split /\n/, $database{$TagsList}){
            if(/::(.+)::/){ 
                my $tagarg = &escape($1);
                $contents .= "    <option>$tagarg</option>\n";
            }
        }
    # rica add [comment tag] end
<form action="$url_cgi" method="post">
---------- 中略 ----------
    <!-- rica add [comment tag] プルダウンメニュー用 -->
    <small>$resource{tagname}</small>
    <select name="mytag">
    $contents
    </select><br>
    # Walrus add [import recent changes] start
    } elsif ($embedded =~ /$embed_recent/) {
        return "" if($form{mypage} eq $RecentChanges);     # yakty add [FooterPage]
        #$_ = &make_recent_changes($2);        # yakty del [import filtered recent]
        $_ = &make_recent_changes($2, $4);     # yakty add [import filtered recent]
        return ($_) ? $_ : &escape($embedded);
    # Walrus add [import recent changes] end
    # SHIMADA add [tag-links] [included]start
    } elsif ($embedded =~ /$embed_tags/) {
        return &make_tag_links($1);
    } elsif ($embedded =~ /$embed_include/) {
        return &make_include($1);
    # SHIMADA add [tag-links] [included] end
    } else {
        return $embedded;
    }

make_tag_links() 追加

[TOP↑] [管理]
# SHIMADA add [tag-links] start
sub make_tag_links {
    my @lines = map { "- " . $_ } tag_links(@_);
    return (@lines) ? &text_to_html(join("\n", @lines)) : "";
#    my $html = &text_to_html(join("\n", @lines));
#    return $html;
}

tag_links() 追加

[TOP↑] [管理]
sub tag_links {
    my $tag= shift;
    my (%has);
    foreach my $page (keys %database){
#        next if $page eq $form{mypage}; # 同一ページ内のタグも表示。
        next if ($page eq $RecentDiffs); # yakty さんの RecentDiffs を組み込んでいる場合、RecentDiffs ページを除外。
        next if ($page eq $TagsList);    # rica add [comment tag] # プルダウンメニュー用のページを除外。
        my @parts = &read_by_part($page);
        for(my $i=0; $i<@parts; $i++){
            my @matches = ($parts[$i] =~ /::\Q${tag}\E::\s*(.+)$/gm) or next;
            foreach my $val (@matches){
                my $link = ($i > 0) ? sprintf("%s#i%d", $page, $i-1) : $page;
                if(defined $has{$val}){
                    push @{$has{$val}}, $link;
                } else {
                    $has{$val} = [$link];
                }
            }
        }
    }
    my @result = ();
    my @keys = sort { $has{$a}[0] cmp $has{$b}[0] } keys %has;
    foreach my $val (@keys){
        my @hits = map { "''[[$_]]'' " } @{$has{$val}};
        $val =~ s/$embedded_name//go;
        push @result, " @hits" . unescape($val);
    }
    return @result;
}
# SHIMADA add [tag-links] end

do_comment() 変更

[TOP↑] [管理]
sub do_comment {
    my ($content) = $database{$form{mypage}};
    my $datestr = &get_now;
    my $tagstr = $form{mytag} ? " ::$form{mytag}:: : " : " ";            # rica add [comment tag]
#    if ($content =~ s/(^|\n)(\Q$embed_comment\E)/- $datestr$namestr$form{mymsg}\n$1$2/) {
    if ($content =~ s/(^|\n)(\Q$embed_comment\E)/- $datestr$tagstr$namestr$form{mymsg}\n$1$2/) {
        ;
    } else {
#        $content =~ s/(^|\n)(\Q$embed_rcomment\E)/$1$2\n- $datestr$namestr$form{mymsg}/;
        $content =~ s/(^|\n)(\Q$embed_rcomment\E)/$1$2\n- $datestr$tagstr$namestr$form{mymsg}/;
    }

remove_modification() 変更

[TOP↑] [管理]
    $text =~ s/\[\[(\S+?)( \S+?)?\]\]/$1/g;
    $text =~ s/::(.*):://g;    # add

ページ先頭の index などにタグ名が表示されるのを抑制。 2004/10/09(Sat) 追記。

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

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