# Blosxom Plugin: categories # Author: Todd Larason # Version: 0+1i # Blosxom Home/Docs/Licensing: http://www.raelity.org/blosxom # 2004-09-04 # modified for ModBlosxom.pm by Makamaka # # Blosxom Home/Docs/Licensing: http://www.blosxom.com/license.html package ModBlosxom::plugin::Categories; use strict; sub new { bless {}, shift; } sub start { return 1; } sub filter { my ($self,$blosxom,$files) = @_; my ($datadir, $path_info) = $blosxom->settings([qw/datadir path_info/]); my ($story_count_commulative) = $blosxom->settings([qw/categories_story_count_commulative/]); $self->{stories} = {}; $self->{children} = {}; $self->{seen} = {}; $self->{datadir} = $datadir; $self->{output_format} = $blosxom->settings('categories_output_format') || 'ul'; $self->{root_name} = $blosxom->settings('categories_root_name') || 'all'; $self->{aliases} = $blosxom->settings('categories_aliases') || {}; $self->{url} = $blosxom->settings('url'); $self->{prune_dirs} = $blosxom->settings('categories_prune_dirs') || []; foreach (keys %{$files}) { my ($dir, $file) = m:(.*)/(.*):; my $child; $self->{stories}->{$dir}++; while ($dir ne $datadir) { ($dir, $child) = ($dir =~ m:(.*)/(.*):); $self->{stories}->{$dir}++ if $story_count_commulative; if (!$self->{seen}->{"$dir/$child"}++) { push @{$self->{children}->{$dir}}, $child; } } } my $categories = $self->report_root(); $blosxom->param('categories::categories' => $categories); } sub story { my $self = shift; my $blosxom = shift; my($path, $fn, $story_ref, $title_ref, $body_ref) = @_; my $sep = $blosxom->settings('categories_sep'); if(!defined $sep){ $sep = ''; } my $alias = ''; my @path = split(/\//, $path); foreach (@path) { next if !$_; $_ = $self->{aliases}->{$_} if $self->{aliases}->{$_}; $alias .= qq!$sep$_!; } $alias =~ s!^$sep!!; $alias = "n/a" if (!$alias); $blosxom->param('categories::alias' => $alias); return 1; } sub report_root { my $self = shift; my $datadir = $self->{datadir}; my $root_name = $self->{root_name}; my $results; $results = $self->report_categories_start(); $results .= $self->report_dir_start( '/', $root_name, $self->{stories}->{$datadir} ); $self->{children}->{$datadir} ||= []; foreach (sort @{$self->{children}->{$datadir}}) { $results .= $self->report_dir('/', $_); } $results .= report_dir_end(); $results .= report_categories_end(); return $results; } sub report_categories_start { my $output_format = $_[0]->{output_format}; return qq!\n! if $output_format eq 'ul'; return qq!categories_end\n! if $output_format eq 'm4'; return ''; } sub is_prune_dir { my $self = shift; my ($dir) = @_; foreach (@{ $self->{prune_dirs} }) { return 1 if $dir eq $_; } return 0; } 1;