X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fblosxom.git;a=blobdiff_plain;f=blosxom.cgi;h=341d2967c87773a2922f7975c4ddef395afa8bfe;hp=ffa2a828cd59ccf10f49999b82907be42ed8a28c;hb=3de8259e6bfdb18b5fc581c8f327f6cf0f3bf19d;hpb=b7882fe104069bf71190fbede82c2efbbf2d5e05 diff --git a/blosxom.cgi b/blosxom.cgi index ffa2a82..341d296 100755 --- a/blosxom.cgi +++ b/blosxom.cgi @@ -1,8 +1,8 @@ #!/usr/bin/perl # Blosxom -# Author: Rael Dornfest -# Version: 2.0.2 +# Author: Rael Dornfest (2003), The Blosxom Development Team (2005-2008) +# Version: 2.1.0 # Home/Docs/Licensing: http://blosxom.sourceforge.net/ # Development/Downloads: http://sourceforge.net/projects/blosxom @@ -88,7 +88,7 @@ use File::stat; use Time::Local; use CGI qw/:standard :netscape/; -$version = "2.0.2"; +$version = "2.1.0"; # Should I encode entities for xml content-types? (plugins can turn this off if they do it themselves) $encode_xml_entities = 1; @@ -144,6 +144,8 @@ my $fh = new FileHandle; # Use the stated preferred URL or figure it out automatically $url ||= url( -path_info => 1 ); +# Unescape %XX hex codes (from URI::Escape::uri_unescape) +$url =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; $url =~ s/^included:/http:/ if $ENV{SERVER_PROTOCOL} eq 'INCLUDED'; # NOTE: Since v3.12, it looks as if CGI.pm misbehaves for SSIs and @@ -165,9 +167,6 @@ $static_dir =~ s!/$!!; # Fix depth to take into account datadir's path $depth += ( $datadir =~ tr[/][] ) - 1 if $depth; -# Global variable to be used in head/foot.{flavour} templates -$path_info = ''; - if ( !$ENV{GATEWAY_INTERFACE} and param('-password') and $static_password @@ -186,37 +185,46 @@ my @path_info = split m{/}, path_info() || param('path'); $path_info_full = join '/', @path_info; # Equivalent to $ENV{PATH_INFO} shift @path_info; -while ( $path_info[0] - and $path_info[0] =~ /^[a-zA-Z].*$/ - and $path_info[0] !~ /(.*)\.(.*)/ ) -{ - $path_info .= '/' . shift @path_info; -} - # Flavour specified by ?flav={flav} or index.{flav} $flavour = ''; +if (! ($flavour = param('flav'))) { + if ( $path_info[$#path_info] =~ /(.+)\.(.+)$/ ) { + $flavour = $2; + pop @path_info if $1 eq 'index'; + } +} +$flavour ||= $default_flavour; -if ( $path_info[$#path_info] =~ /(.+)\.(.+)$/ ) { - $flavour = $2; - $path_info .= "/$1.$2" if $1 ne 'index'; - pop @path_info; +# Global variable to be used in head/foot.{flavour} templates +$path_info = ''; +# Add all @path_info elements to $path_info till we come to one that could be a year +while ( $path_info[0] && $path_info[0] !~ /^(19|20)\d{2}$/) { + $path_info .= '/' . shift @path_info; } -else { - $flavour = param('flav') || $default_flavour; + +# Pull date elements out of path +if ($path_info[0] && $path_info[0] =~ /^(19|20)\d{2}$/) { + $path_info_yr = shift @path_info; + if ($path_info[0] && + ($path_info[0] =~ /^(0\d|1[012])$/ || + exists $month2num{ ucfirst lc $path_info_mo })) { + $path_info_mo = shift @path_info; + # Map path_info_mo to numeric $path_info_mo_num + $path_info_mo_num = $path_info_mo =~ /^\d{2}$/ + ? $path_info_mo + : $month2num{ ucfirst lc $path_info_mo }; + if ($path_info[0] && $path_info[0] =~ /^[0123]\d$/) { + $path_info_da = shift @path_info; + } + } } +# Add remaining path elements to $path_info +$path_info .= '/' . join('/', @path_info); + # Strip spurious slashes $path_info =~ s!(^/*)|(/*$)!!g; -# Date fiddling -( $path_info_yr, $path_info_mo, $path_info_da ) = @path_info; -$path_info_mo_num - = $path_info_mo - ? ( $path_info_mo =~ /\d{2}/ - ? $path_info_mo - : ( $month2num{ ucfirst( lc $path_info_mo ) } || undef ) ) - : undef; - # Define standard template subroutine, plugin-overridable at Plugins: Template $template = sub { my ( $path, $chunk, $flavour ) = @_; @@ -659,11 +667,15 @@ sub generate { '<' => '<', '>' => '>', '&' => '&', - '"' => '"' + '"' => '"', + "'" => ''' ); my $escape_re = join '|' => keys %escape; $title =~ s/($escape_re)/$escape{$1}/g; $body =~ s/($escape_re)/$escape{$1}/g; + $url =~ s/($escape_re)/$escape{$1}/g; + $path =~ s/($escape_re)/$escape{$1}/g; + $fn =~ s/($escape_re)/$escape{$1}/g; } $story = &$interpolate($story); @@ -727,34 +739,31 @@ sub nice_date { __DATA__ html content_type text/html; charset=$blog_encoding +html head html head html head -html head -html head -html head $blog_title $path_info_da $path_info_mo $path_info_yr -html head +html head +html head +html head $blog_title $path_info_da $path_info_mo $path_info_yr html head html head -html head
-html head $blog_title
-html head $path_info_da $path_info_mo $path_info_yr -html head
-html head

+html head

+html head

$blog_title

+html head

$path_info_da $path_info_mo $path_info_yr

+html head
-html story

-html story $title
-html story $body
-html story
-html story posted at: $ti | path: $path | permanent link to this entry -html story

+html story
+html story

$title

+html story
$body
+html story

posted at: $ti | path: $path | permanent link to this entry

+html story
-html date

$dw, $da $mo $yr

+html date

$dw, $da $mo $yr

html foot -html foot

-html foot

-html foot -html foot
+html foot
+html foot powered by blosxom +html foot
html foot html foot @@ -786,15 +795,17 @@ rss foot error content_type text/html +error head error head -error head -error head

Error: I'm afraid this is the first I've heard of a "$flavour" flavoured Blosxom. Try dropping the "/+$flavour" bit from the end of the URL.

- +error head Error: unknown Blosxom flavour "$flavour" +error head +error head

Error: unknown Blosxom flavour "$flavour"

+error head

I'm afraid this is the first I've heard of a "$flavour" flavoured Blosxom. Try dropping the "/+$flavour" bit from the end of the URL.

-error story

$title
-error story $body #

+error story

$title

+error story
$body

#

-error date

$dw, $da $mo $yr

+error date

$dw, $da $mo $yr

error foot error foot