5 use Storable qw(freeze); use MIME::Base64;
7 use Text::Balanced qw(extract_multiple extract_quotelike);
11 my %cache_options = ( 'namespace' => $whence.'TagTools',
12 'default_expires_in' => 600 );
14 new Cache::FileCache( \%cache_options ) or
15 croak( "Couldn't instantiate FileCache" );
16 *{$whence."::zap_cache"} = sub { $cache->Clear };
17 *{$whence."::do_cached"} = sub {
18 my ($self, $codeblock,$arg) = @_;
19 my $key = 0+$codeblock; if ($arg) { $key .=":".encode_base64(freeze(\$arg)); }
20 my $c = $cache->get(0+$codeblock); return @$c if $c;
21 my @stuff = $codeblock->($arg);
22 $cache->set(0+$codeblock, [ @stuff ]);
25 *{$whence."::_tagcloud"} = sub {
26 my $cloud = HTML::TagCloud->new();
27 my $base = $whence->config->uri_base."tag/view/";
28 for my $tagging (($whence."::Tagging")->search_summary) {
29 my $name = $tagging->tag->name;
30 $cloud->add($name, $base.uri_escape($name), $tagging->{count})
34 *{$whence."::_calendar"} = sub {
37 my ($y, $m) = split /-/, ($arg || Time::Piece->new->ymd);
38 my @m = Calendar::Simple::calendar($m, $y);
40 foreach my $week (@m) {
42 foreach my $day (@$week) {
43 my $d = { day => $day };
45 my $tag = "date:$y-$m-".sprintf("%02d", $day);
46 my ($x) = ($whence."::SystemTag")->search(name => $tag);
47 if ($x) { $d->{tag} = "/system_tag/view/$tag" }
51 push(@month, \@weekdays);
55 for my $thing (qw(tagcloud calendar)) {
56 *{$whence."::$thing"} = sub { shift->do_cached($thing, @_) }
73 sub Time::Piece::next_month {
75 my $month = $tp + ONE_MONTH;
76 return if $month > Time::Piece->new;
79 sub Time::Piece::prev_month {
81 my $month = $tp - ONE_MONTH;