# Blosxom
# Author: Rael Dornfest <rael@oreilly.com>
-# Version: 2.0.1
-# Home/Docs/Licensing: http://www.blosxom.com/
+# Version: 2.0.2
+# Home/Docs/Licensing: http://blosxom.sourceforge.net/
# Development/Downloads: http://sourceforge.net/projects/blosxom
package blosxom;
use Time::localtime;
use CGI qw/:standard :netscape/;
-$version = "2.0";
+$version = "2.0.2";
my $fh = new FileHandle;
@num2month = sort { $month2num{$a} <=> $month2num{$b} } keys %month2num;
# Use the stated preferred URL or figure it out automatically
-$url ||= url();
-$url =~ s/^included:/http:/; # Fix for Server Side Includes (SSI)
+$url ||= url(-path_info => 1);
+$url =~ s/^included:/http:/ if $ENV{SERVER_PROTOCOL} eq 'INCLUDED';
+
+# NOTE: Since v3.12, it looks as if CGI.pm misbehaves for SSIs and
+# always appends path_info to the url. To fix this, we always
+# request an url with path_info, and always remove it from the end of the
+# string.
+my $pi_len = length $ENV{PATH_INFO};
+my $might_be_pi = substr($url, -$pi_len);
+substr($url, -length $ENV{PATH_INFO}) = '' if $might_be_pi eq $ENV{PATH_INFO};
+
$url =~ s!/$!!;
# Drop ending any / from dir settings
return join '', <$fh> if $fh->open("< $datadir/$path/$chunk.$flavour");
} while ($path =~ s/(\/*[^\/]*)$// and $1);
- return join '', ($template{$flavour}{$chunk} || $template{error}{$chunk} || '');
+ # Check for definedness, since flavour can be the empty string
+ if (defined $template{$flavour}{$chunk}) {
+ return $template{$flavour}{$chunk};
+ } elsif (defined $template{error}{$chunk}) {
+ return $template{error}{$chunk}
+ } else {
+ return '';
+ }
};
# Bring in the templates
%template = ();
while (<DATA>) {
last if /^(__END__)$/;
- my($ct, $comp, $txt) = /^(\S+)\s(\S+)\s(.*)$/ or next;
+ my($ct, $comp, $txt) = /^(\S+)\s(\S+)(?:\s(.*))?$/ or next;
$txt =~ s/\\n/\n/mg;
$template{$ct}{$comp} .= $txt . "\n";
}
# Plugins: Start
if ( $plugin_dir and opendir PLUGINS, $plugin_dir ) {
- foreach my $plugin ( grep { /^\w+$/ && -f "$plugin_dir/$_" } sort readdir(PLUGINS) ) {
+ unshift @INC, $plugin_dir;
+ foreach my $plugin ( grep { /^[\w:]+$/ && -f "$plugin_dir/$_" } sort readdir(PLUGINS) ) {
next if ($plugin =~ /~$/); # Ignore emacs backups
- my($plugin_name, $off) = $plugin =~ /^\d*(\w+?)(_?)$/;
+ my($plugin_name, $off) = $plugin =~ /^\d*([\w:]+?)(_?)$/;
my $on_off = $off eq '_' ? -1 : 1;
- require "$plugin_dir/$plugin";
+ # Allow perl module plugins
+ if ($plugin =~ m/::/ && -z "$plugin_dir/$plugin") {
+ # For Blosxom::Plugin::Foo style plugins, we need to use a string require
+ eval "require $plugin_name";
+ }
+ else {
+ eval { require $plugin };
+ }
+ $@ and warn "error finding or loading blosxom plugin $plugin_name - skipping\n" and next;
$plugin_name->start() and ( $plugins{$plugin_name} = $on_off ) and push @plugins, $plugin_name;
}
+ shift @INC;
closedir PLUGINS;
}
html foot
html foot <p />
html foot <center>
-html foot <a href="http://www.blosxom.com/"><img src="http://www.blosxom.com/images/pb_blosxom.gif" border="0" /></a>
+html foot <a href="http://blosxom.sourceforge.net/"><img src="http://blosxom.sourceforge.net/images/pb_blosxom.gif" border="0" /></a>
html foot </center>
html foot </body>
html foot </html>