#!/usr/bin/perl -w # Blosxom Plugin: categories # Author: Todd Larason (jtl@molehill.org) # Version: 0+1i # Blosxom Home/Docs/Licensing: http://www.raelity.org/blosxom # Categories plugin Home/Docs/Licensing: # http://molelog.molehill.org/blox/Computers/Internet/Web/Blosxom/Categories/ package categories; # --- Configuration Variables --- # should the story-count include child dirs? my $story_count_commulative = 1; # output format # 'ul' -> nested unordered lists; simplest, suitable for most people my $output_format = 'ul'; # directories to include, but not children of -- full name under $datadir my @prune_dirs = (qw!/Old!); # --- End of Configuration Section --- $categories = ''; sub report_categories_start { return qq!\n! if $output_format eq 'ul'; return qq!categories_end\n! if $output_format eq 'm4'; return qq!!; } my %children; my %stories; sub is_prune_dir { my ($dir) = @_; foreach (@prune_dirs) { return 1 if $dir eq $_; } return 0; } sub report_dir { my ($parent, $dir) = @_; my $results; local $_; if (!defined($children{"$blosxom::datadir$parent$dir"}) || is_prune_dir("$parent$dir")) { $results = report_dir_leaf("$parent$dir/", "$dir", $stories{"$blosxom::datadir$parent$dir"}); } else { $results = report_dir_start("$parent$dir/", "$dir", $stories{"$blosxom::datadir$parent$dir"}); foreach (sort @{$children{"$blosxom::datadir$parent$dir"}}) { $results .= report_dir("$parent$dir/", $_); } $results .= report_dir_end(); } return $results; } sub report_root { my $results; $results = report_categories_start(); $results .= report_dir_start('/', '/', $stories{$blosxom::datadir}); foreach (sort @{$children{$blosxom::datadir}}) { $results .= report_dir('/', $_); } $results .= report_dir_end(); $results .= report_categories_end(); return $results; } sub start { return 1; } sub filter { my ($pkg, $files) = @_; foreach (keys %{$files}) { my ($dir, $file) = m:(.*)/(.*):; my $child; $stories{$dir}++; while ($dir ne $blosxom::datadir) { ($dir, $child) = ($dir =~ m:(.*)/(.*):); $stories{$dir}++ if $story_count_commulative; if (!$seen{"$dir/$child"}++) { push @{$children{$dir}}, $child; } } } $categories = report_root(); } 1;