X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fblosxom.git;a=blobdiff_plain;f=blosxom.cgi;h=29b9a540d4ebf6022a0e38a47ba1cb9de0f799f8;hp=3bd3ae9a1510a91caba0f6c4f5e4dc7988631dda;hb=282b6119e5aa8e7c679eb6c39aeaae5b16a8d6dd;hpb=86608a808dd5465a2f186b51c46f8aa786679bd6 diff --git a/blosxom.cgi b/blosxom.cgi index 3bd3ae9..29b9a54 100755 --- a/blosxom.cgi +++ b/blosxom.cgi @@ -79,7 +79,7 @@ $static_entries = 0; # -------------------------------- use vars - qw! $version $blog_title $blog_description $blog_language $blog_encoding $datadir $url %template $template $depth $num_entries $file_extension $default_flavour $static_or_dynamic $config_dir $plugin_list $plugin_path $plugin_dir $plugin_state_dir @plugins %plugins $static_dir $static_password @static_flavours $static_entries $path_info $path_info_yr $path_info_mo $path_info_da $path_info_mo_num $flavour $static_or_dynamic %month2num @num2month $interpolate $entries $output $header $show_future_entries %files %indexes %others !; + qw! $version $blog_title $blog_description $blog_language $blog_encoding $datadir $url %template $template $depth $num_entries $file_extension $default_flavour $static_or_dynamic $config_dir $plugin_list $plugin_path $plugin_dir $plugin_state_dir @plugins %plugins $static_dir $static_password @static_flavours $static_entries $path_info_full $path_info $path_info_yr $path_info_mo $path_info_da $path_info_mo_num $flavour $static_or_dynamic %month2num @num2month $interpolate $entries $output $header $show_future_entries %files %indexes %others $encode_xml_entities !; use strict; use FileHandle; @@ -90,6 +90,9 @@ use CGI qw/:standard :netscape/; $version = "2.0.2"; +# Should I encode entities for xml content-types? (plugins can turn this off if they do it themselves) +$encode_xml_entities = 1; + # Load configuration from $ENV{BLOSXOM_CONFIG_DIR}/blosxom.conf, if it exists my $blosxom_config; if ( $ENV{BLOSXOM_CONFIG_FILE} && -r $ENV{BLOSXOM_CONFIG_FILE} ) { @@ -141,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 @@ -162,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 @@ -180,39 +182,49 @@ else { # Path Info Magic # Take a gander at HTTP's PATH_INFO for optional blog name, archive yr/mo/day 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 ) = @_; @@ -293,6 +305,8 @@ foreach my $plugin (@plugin_list) { my $on_off = $off eq '_' ? -1 : 1; # Allow perl module plugins + # The -z test is a hack to allow a zero-length placeholder file in a + # $plugin_path directory to indicate an @INC module should be loaded if ( $plugin =~ m/::/ && ( $plugin_list || -z $plugin_hash{$plugin} ) ) { # For Blosxom::Plugin::Foo style plugins, we need to use a string require @@ -508,10 +522,10 @@ sub generate { # Define default interpolation subroutine $interpolate = sub { - package blosxom; my $template = shift; - $template =~ s/(\$\w+(?:::\w+)*)/"defined $1 ? $1 : ''"/gee; + # Interpolate scalars, namespaced scalars, and hash/hashref scalars + $template =~ s/(\$\w+(?:::\w+)*(?:(?:->)?{(['"]?)[-\w]+\2})?)/"defined $1 ? $1 : ''"/gee; return $template; }; @@ -646,7 +660,7 @@ sub generate { } } - if ( $content_type =~ m{\bxml\b} ) { + if ( $encode_xml_entities && $content_type =~ m{\bxml\b} ) { # Escape <, >, and &, and to produce valid RSS my %escape = ( @@ -724,7 +738,7 @@ 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