package taglist; use strict; use vars qw($taglist_all $taglist_all_format $taglist_story $taglist_story_format $debug); use File::stat; use Data::Dumper; my $cachefile = $blosxom::taglist_cachefile; my $charset = $blosxom::taglist_charset; my %cache; if (!defined $taglist_all_format){ $taglist_all_format = sub { my ($alltags_ref) = @_; my $ret = ''; foreach (sort keys %$alltags_ref){ $ret .= "$_($alltags_ref->{$_})
\n"; } chop $ret; return $ret; } } if (!defined $taglist_story_format){ $taglist_story_format = sub { my ($c_date, $c_tagref, $fname) = @_; my $ret = ''; foreach (@$c_tagref){ $ret .= "$_|"; } chop $ret; return $ret; } } sub start{ 1; } sub filter{ my ($pkg, $files) = @_; my (%alltags, $reindex); #read cachefile if ( open ENTRIES, $cachefile ) { my $VAR1; my $index = join '', ; close ENTRIES; $index =~ /\$VAR1 = \{/ and eval($index) and !$@ and %cache = %$VAR1; } foreach my $fn (keys %$files){ if (-f $fn){ #if target file is exist my @f_tags; my $f_date = stat($fn)->mtime; my $c_date = $cache{$fn}->[0]; my $c_tagref= $cache{$fn}->[1]; if ($c_date and $c_date == $f_date){ #target file is not modifieded @f_tags = @$c_tagref; }else{ #target file is changed #correct tags from path_info $fn =~ m!^$blosxom::datadir/(.*)/[^/]*\.$blosxom::file_extension!; @f_tags = split '/', $1; #correct tags from top line of target file if (open ENTRIES, $fn){ =~ m!(\[[^]]+\])*!g; close ENTRIES; push @f_tags, $& =~ m![^\[\]]+!g; } sort @f_tags; #store to cache $cache{$fn} = [$f_date, [@f_tags]]; $reindex = 1; } foreach (@f_tags){ $alltags{$_}++; } #delete non-target record my @t_tags = split '/', $blosxom::path_info; my $t_cnt = 0; #delete if last is filename pop @t_tags if $t_tags[-1] =~ m!$blosxom::flavour$!; foreach my $t_tag (@t_tags){ foreach my $f_tag (@f_tags){ if ($t_tag eq $f_tag){ $t_cnt++; last; } } } if ($t_cnt != @t_tags){ delete $files->{$fn}; } }else{ #delete record if target file is not exist delete $files->{$fn}; # delete $cache{$fn}; } } #make $alltags $taglist_all = &$taglist_all_format(\%alltags); #save cachefile if updated if ( $reindex ) { if ( open ENTRIES, "> $cachefile" ) { flock(ENTRIES, 2); my $buf = Dumper \%cache; $buf =~ s! +! !g; print ENTRIES $buf; close ENTRIES; } } } sub story{ my ($pkg, $path, $fn, $story_ref, $title_ref, $body_ref) = @_; my $fname = "$blosxom::datadir$path/$fn.$blosxom::file_extension"; my $c_date = $cache{$fname}->[0]; my $c_tagref= $cache{$fname}->[1]; $taglist_story = &$taglist_story_format($c_date, $c_tagref, $fname); $$title_ref =~ s!^(\[[^]]+\])*!!g; } 1;