X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fblosxom-plugins.git;a=blobdiff_plain;f=xtaran%2Ftagging;h=0e408a16ff11fafea18606d769fcd9048de904e4;hp=f6167e0373484c0ffd90e3dc0ce668e5469e0619;hb=HEAD;hpb=0636360f7bad4c440274c9ab73cc3d72add7d381 diff --git a/xtaran/tagging b/xtaran/tagging index f6167e0..0e408a1 100644 --- a/xtaran/tagging +++ b/xtaran/tagging @@ -229,6 +229,8 @@ our $related_story_join = "\n" unless defined $related_story_join; our $related_story_prefix = '' unless defined $related_story_suffix; our $related_story_class = 'related_stories' unless defined $related_story_class; +# Use the title of the post for the link instead of the filename +our $related_story_title = 0 unless defined $related_story_title; our $shared_tags_text = 'shared tags' unless defined $shared_tags_text; @@ -257,6 +259,7 @@ $related_stories = ''; $related_tags = ''; %tags = (); +%titles = (); %related_tags = (); sub start { @@ -290,9 +293,7 @@ sub story { $tag_list = ''; my %other_stories = (); foreach my $tag (sort { lc($a) cmp lc($b) } keys %localtags) { - my $l_tag = &url_escape($tag); - $tag_list .= - qq! ,!; + $tag_list .= " " . make_tag_link($link_tag, $tag, (rel => "tag")) . ","; # $tag_list .= qq! ! if $add_plugin_tags; @@ -324,15 +325,21 @@ sub story { $opath =~ s!\Q$blosxom::datadir\E!$blosxom::url!; $opath =~ s!\Q$blosxom::file_extension\E$!$blosxom::default_flavour!; - my $title = $other; - $title =~ s!^.*/([^/]+)\.$blosxom::file_extension$!$1!; + my $title; + if ($related_story_title) { + $title = $titles{$other}; + } else { + $title = $other; + $title =~ s!^.*/([^/]+)\.$blosxom::file_extension$!$1!; + } my $shared_tags_list = join(', ', @{$other_stories{$other}}); my $shared_tags_number = scalar(@{$other_stories{$other}}); - my $attr_title = "$shared_tags_number $shared_tags_text: $shared_tags_list"; - - $related_stories .= qq($related_story_prefix$title); + my $attr_title = blosxom::blosxom_html_escape("$shared_tags_number $shared_tags_text: $shared_tags_list"); + my $attr_href = blosxom::blosxom_html_escape($opath); + my $html_title = blosxom::blosxom_html_escape($title); + $related_stories .= qq($related_story_prefix$html_title); $related_stories .= ' (' if $show_shared_tags || $show_number_of_shared_tags; @@ -340,7 +347,7 @@ sub story { if $show_number_of_shared_tags; $related_stories .= $shared_tags_text if $show_shared_tags || $show_number_of_shared_tags; - $related_stories .= ": $shared_tags_list" + $related_stories .= blosxom::blosxom_html_escape(": $shared_tags_list") if $show_shared_tags; $related_stories .= ')' if $show_shared_tags || $show_number_of_shared_tags; @@ -370,6 +377,10 @@ sub filter { my $tags_found = 0; my $empty_line_found = 0; while ($_ = ) { + # Take the title from the first line + if (not defined $titles{$key}) { + $titles{$key} = $_; + } last if /^\s*$/; if (m!^$tag_re(.+?)$!) { my @localtags = split($split_re, $1); @@ -411,8 +422,6 @@ sub filter { } my $diff = $max - $min; - my $conj = ($filter_conj eq 'and' ? '&-conj=and' : ''); - my $l_filter_tags = &url_escape($filter_tags); foreach my $tag (sort { lc($a) cmp lc($b) } keys %tags) { next if grep { $_ eq $tag } @tag_cloud_blacklist; @@ -429,15 +438,8 @@ sub filter { $style .= qq!font-size: $tag_percent%;! if $show_tag_no_by_size && $diff; $style .= qq!color: #$color;! if $show_tag_no_by_color && $diff; - my $l_tag = &url_escape($tag); - $global_tag_list .= - qq| $tag|. - qq|$tag_no_display,\n|; + $global_tag_list .= make_tag_link($link_cloud, $tag, (title => $title, style => $style)). + qq|$tag_no_display,\n|; } $global_tag_list =~ s/,$//; @@ -454,7 +456,7 @@ sub filter { FILES: foreach my $file (@$files) { # If all tags should match - if ($conj) { + if ($filter_conj eq 'and') { foreach my $ctag (@tags) { if (!grep { $_ eq $file } @{$tags{$ctag}}) { next FILES; @@ -468,25 +470,18 @@ sub filter { %$files_ref = %localfiles; - $current_filter_short = join($conj ? ' + ' : ' | ', - map { s/\&/\&/g; $_; } - sort { lc($a) cmp lc($b) } - @tags); + $current_filter_short = blosxom::blosxom_html_escape( + join($filter_conj eq 'and' ? ' + ' : ' | ', + sort { lc($a) cmp lc($b) } @tags + )); - $conj = ($conj ? + my $l_filter_tags = &url_escape($filter_tags); + $conj = ($filter_conj eq 'and' ? qq! and ! : qq! or !); $current_filter = ($current_filter_prefix. join($conj, - map { - my $tags = $filter_tags; - $tags =~ s/\Q$_,\E// || $tags =~ s/\Q,$_\E// || $tags =~ s/\Q$_\E//; - - s/\&/\&/g; - - my $l_tags = &url_escape($tags); - qq!$_!; - } + map { make_tag_link('blosxom', $_); } sort { lc($a) cmp lc($b) } @tags). $current_filter_suffix); @@ -500,12 +495,11 @@ sub filter { keys %related_tags) { next if ((grep { $_ eq $rtag } @related_tags_tag_blacklist) or $related_tags{$rtag} < $min_tag_relations); - my $l_rtag = &url_escape($rtag); my $rel_no = $show_tag_shares ? " ($related_tags{$rtag})" : ''; - $related_tags .= - qq!$rel_no$related_tag_join!; + $related_tags .= make_tag_link($link_rtag, $rtag, (rel => "tag", class => $related_tag_class, title => "Coincided $related_tags{$rtag} times")). + "$rel_no$related_tag_join"; last if $i++ >= $max_related_tags; - } + } $related_tags =~ s/\Q$related_tag_join\E$//; #use Data::Dumper; @@ -521,6 +515,47 @@ sub filter { 1; } +# Create the url for a given tag. Depending on the tag and link type given, +# this adds to, removes or replaces the current tag list. The link type given +# is one of the keys of %base_url +sub make_tag_link { + my ($link, $tag, %attrs) = @_; + my $filter_tags = CGI::param('-tags'); + my $conj = (CGI::param('-conj') eq 'and' ? '&-conj=and' : ''); + # If we're linking to ourselves, the currently selected tag list is not + # empty, and this tag is not in there yet, prefix the link with the + # current filter list. + my $tags; + if (($link_cloud eq 'blosxom') and $filter_tags) { + if ($filter_tags =~ /(^|,)\Q$tag\E($|,)/) { + # The tag is already in there, remove it + $tags = $filter_tags; + $tags =~ s/\Q,$tag,\E/,/ || $tags =~ s/(^|,)\Q$tag\E($|,)//; + } else { + # The tag is not in there, add it + $tags = "$filter_tags,$tag"; + } + $tags = &url_escape($tags); + $tags .= $conj; + } else { + # We're linking externally, or don't have a filter yet. Just use the + # selected tag as the filter + $tags = &url_escape($tag); + } + + # Set the href attribute + $attrs{href} = "$base_url{$link}$tags"; + + # Generate attribute values + my $attrs = join('', + map { $val = blosxom::blosxom_html_escape($attrs{$_}); + qq! $_="$val"!; + } keys %attrs); + + return "" . blosxom::blosxom_html_escape($tag) . ""; +} + + sub color_calc { my ($tag_no, $min, $max) = @_; my $diff = $max - $min;