X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fblosxom.git;a=blobdiff_plain;f=blosxom.cgi;h=c079ab257a6a53a511ec8f264d0a71ca16929886;hp=d2c1c46b76d223381e9be3f48fd771656985f781;hb=d70589b00686a9eab5e34eafcc3b144c73ee893e;hpb=10beab43faade09fc0728590ff8c4ee81cd63994 diff --git a/blosxom.cgi b/blosxom.cgi index d2c1c46..c079ab2 100755 --- a/blosxom.cgi +++ b/blosxom.cgi @@ -1,8 +1,8 @@ #!/usr/bin/perl # Blosxom -# Author: Rael Dornfest (2002-2003), The Blosxom Development Team (2005-2008) -# Version: 2.1.2 ($Id: blosxom.cgi,v 1.91 2009/03/08 00:58:52 xtaran Exp $) +# Author: Rael Dornfest (2002-2003), The Blosxom Development Team (2005-2009) +# Version: 2.1.2 ($Id: blosxom.cgi,v 1.97 2009/07/19 17:14:20 xtaran Exp $) # Home/Docs/Licensing: http://blosxom.sourceforge.net/ # Development/Downloads: http://sourceforge.net/projects/blosxom @@ -137,6 +137,16 @@ $static_entries = 0; # this off if they do it themselves) $encode_xml_entities = 1; +# Should I encode 8 bit special characters, e.g. umlauts in URLs, e.g. +# convert an ISO-Latin-1 \"o to %F6? (off by default for now; plugins +# can change this, too) +$encode_8bit_chars = 0; + +# RegExp matching all characters which should be URL encoded in links. +# Defaults to anything but numbers, letters, slash, colon, dash, +# underscore and dot. +$url_escape_re = qr([^-/a-zA-Z0-9:._]); + # -------------------------------- =head1 ENVIRONMENT @@ -186,8 +196,55 @@ development was picked up by a team of dedicated users of blosxom since =cut -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_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 $content_type !; +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_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 + $encode_8bit_chars + $url_escape_re + $content_type +!; use strict; use FileHandle; @@ -666,7 +723,7 @@ sub generate { package blosxom; my $template = shift; # Interpolate scalars, namespaced scalars, and hash/hashref scalars - $template =~ s/(\$\w+(?:::\w+)*(?:(?:->)?{(['"]?)[-\w]+\2})?)/"defined $1 ? $1 : ''"/gee; + $template =~ s/(\$\w+(?:::\w+)*(?:(?:->)?{([\'\"]?)[-\w]+\2})?)/"defined $1 ? $1 : ''"/gee; return $template; }; @@ -801,15 +858,19 @@ sub generate { } } + # Save unescaped versions and allow them to be used in + # flavour templates. + use vars qw/$url_unesc $path_unesc $fn_unesc/; + $url_unesc = $url; + $path_unesc = $path; + $fn_unesc = $fn; + + # Fix special characters in links inside XML content if ( $encode_xml_entities && $content_type =~ m{\bxml\b} && $content_type !~ m{\bxhtml\b} ) { # Escape special characters inside the container - # The following line should be moved more towards to top for - # performance reasons -- Axel Beckert, 2008-07-22 - my $url_escape_re = qr([^-/a-zA-Z0-9:._]); - $url =~ s($url_escape_re)(sprintf('%%%02X', ord($&)))eg; $path =~ s($url_escape_re)(sprintf('%%%02X', ord($&)))eg; $fn =~ s($url_escape_re)(sprintf('%%%02X', ord($&)))eg; @@ -822,6 +883,13 @@ sub generate { $fn = blosxom_html_escape($fn); } + # Fix special characters in links inside XML content + if ($encode_8bit_chars) { + $url =~ s($url_escape_re)(sprintf('%%%02X', ord($&)))ge; + $path =~ s($url_escape_re)(sprintf('%%%02X', ord($&)))ge; + $fn =~ s($url_escape_re)(sprintf('%%%02X', ord($&)))ge; + } + $story = &$interpolate($story); $output .= $story;