#!/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 = (); # orig: (qw!/Old!);
# --- End of Configuration Section ---
$categories = '';
sub report_categories_start {
return qq!
\n! if $output_format eq 'ul';
return qq!categories_start\n! if $output_format eq 'm4';
warn "Unrecognized output format: $output_format";
return qq!!;
}
sub report_dir_start {
my ($fulldir, $thisdir, $numstories) = @_;
$numstories ||= 0;
return qq!- $thisdir! .
qq!($numstories)
\n\n!
if $output_format eq 'ul';
return qq!dir_start([[$fulldir]],[[$thisdir]],[[$numstories]])\n!
if $output_format eq 'm4';
return '';
}
sub report_dir_leaf {
my ($fulldir, $thisdir, $numstories) = @_;
$numstories ||= 0;
return qq!- $thisdir! .
qq!($numstories)
\n!
if $output_format eq 'ul';
return qq!dir_leaf([[$fulldir]],[[$thisdir]],[[$numstories]])\n!
if $output_format eq 'm4';
return '';
}
sub report_dir_end {
return qq!
\n! if $output_format eq 'ul';
return qq!dir_end\n! if $output_format eq 'm4';
return '';
}
sub report_categories_end {
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;