X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/a405b46c3b6020e1fa3631bfe5fd982f315c977f..c99a790c843b7c7d8beb987cc35ed7fd33958756:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 5f7bdfd06..8a3c81755 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -14,7 +14,7 @@ use vars qw{%config %links %oldlinks %oldpagemtime %pagectime %pagecase use Exporter q{import}; our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match bestlink htmllink readfile writefile pagetype srcfile pagename - displaytime will_render + displaytime will_render gettext %config %links %renderedfiles %pagesources); our $VERSION = 1.01; # plugin interface version @@ -22,12 +22,14 @@ our $VERSION = 1.01; # plugin interface version use Memoize; memoize("abs2rel"); memoize("pagespec_translate"); +memoize("file_pruned"); my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE sub defaultconfig () { #{{{ - wiki_file_prune_regexp => qr{((^|/).svn/|\.\.|^\.|\/\.|\.x?html?$|\.rss$|\.atom$|.arch-ids/|{arch}/)}, + wiki_file_prune_regexps => [qr/\.\./, qr/^\./, qr/\/\./, qr/\.x?html?$/, + qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//], wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]]+)\]\]/, wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/, web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/, @@ -36,7 +38,7 @@ sub defaultconfig () { #{{{ wikiname => "wiki", default_pageext => "mdwn", cgi => 0, - rcs => 'svn', + rcs => '', notify => 0, url => '', cgiurl => '', @@ -67,6 +69,7 @@ sub defaultconfig () { #{{{ locale => undef, sslcookie => 0, httpauth => 0, + userdir => "", } #}}} sub checkconfig () { #{{{ @@ -79,7 +82,7 @@ sub checkconfig () { #{{{ eval q{use POSIX}; error($@) if $@; $ENV{LANG} = $config{locale} - if POSIX::setlocale(&POSIX::LC_TIME, $config{locale}); + if POSIX::setlocale(&POSIX::LC_ALL, $config{locale}); } if ($config{w3mmode}) { @@ -93,10 +96,7 @@ sub checkconfig () { #{{{ } if ($config{cgi} && ! length $config{url}) { - error("Must specify url to wiki with --url when using --cgi\n"); - } - if (($config{rss} || $config{atom}) && ! length $config{url}) { - error("Must specify url to wiki with --url when using --rss or --atom\n"); + error(gettext("Must specify url to wiki with --url when using --cgi")); } $config{wikistatedir}="$config{srcdir}/.ikiwiki" @@ -129,6 +129,8 @@ sub loadplugins () { #{{{ sub loadplugin ($) { #{{{ my $plugin=shift; + return if grep { $_ eq $plugin} @{$config{disable_plugins}}; + my $mod="IkiWiki::Plugin::".possibly_foolish_untaint($plugin); eval qq{use $mod}; if ($@) { @@ -139,7 +141,8 @@ sub loadplugin ($) { #{{{ sub error ($) { #{{{ if ($config{cgi}) { print "Content-type: text/html\n\n"; - print misctemplate("Error", "
Error: @_
"); + print misctemplate(gettext("Error"), + "".gettext("Error").": @_
"); } log_message(error => @_); exit(1); @@ -298,6 +301,11 @@ sub bestlink ($$) { #{{{ my $link=shift; my $cwd=$page; + if ($link=~s/^\/+//) { + # absolute links + $cwd=""; + } + do { my $l=$cwd; $l.="/" if length $l; @@ -311,6 +319,10 @@ sub bestlink ($$) { #{{{ } } while $cwd=~s!/?[^/]+$!!; + if (length $config{userdir} && exists $links{"$config{userdir}/".lc($link)}) { + return "$config{userdir}/".lc($link); + } + #print STDERR "warning: page $page, broken link: $link\n"; return ""; } #}}} @@ -321,10 +333,18 @@ sub isinlinableimage ($) { #{{{ $file=~/\.(png|gif|jpg|jpeg)$/i; } #}}} -sub pagetitle ($) { #{{{ +sub pagetitle ($;$) { #{{{ my $page=shift; - $page=~s/__(\d+)__/$1;/g; + my $unescaped=shift; + + if ($unescaped) { + $page=~s/__(\d+)__/chr($1)/eg; + } + else { + $page=~s/__(\d+)__/$1;/g; + } $page=~y/_/ /; + return $page; } #}}} @@ -354,7 +374,7 @@ sub baseurl (;$) { #{{{ sub abs2rel ($$) { #{{{ # Work around very innefficient behavior in File::Spec if abs2rel # is passed two relative paths. It's much faster if paths are - # absolute! (Debian bug #376658) + # absolute! (Debian bug #376658; fixed in debian unstable now) my $path="/".shift; my $base="/".shift; @@ -396,13 +416,11 @@ sub htmllink ($$$;$$$) { #{{{ return "$linktext" if length $bestlink && $page eq $bestlink; - # TODO BUG: %renderedfiles may not have it, if the linked to page - # was also added and isn't yet rendered! Note that this bug is - # masked by the bug that makes all new files be rendered twice. if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) { $bestlink=htmlpage($bestlink); } if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) { + return $linktext unless length $config{cgiurl}; return " "create", page => lc($link), from => $page). "\">?$linktext" @@ -499,7 +517,13 @@ sub preprocess ($$$;$) { #{{{ if ($preprocessing{$page}++ > 3) { # Avoid loops of preprocessed pages preprocessing # other pages that preprocess them, etc. - return "[[$command preprocessing loop detected on $page at depth $preprocessing{$page}]]"; + #translators: The first parameter is a + #translators: preprocessor directive name, + #translators: the second a page name, the + #translators: third a number. + return "[[".sprintf(gettext("%s preprocessing loop detected on %s at depth %i"), + $command, $page, $preprocessing{$page}). + "]]"; } my $ret=$hooks{preprocess}{$command}{call}->( @params, @@ -612,18 +636,35 @@ sub saveindex () { #{{{ close OUT; } #}}} +sub template_file ($) { #{{{ + my $template=shift; + + foreach my $dir ($config{templatedir}, "$installdir/share/ikiwiki/templates") { + return "$dir/$template" if -e "$dir/$template"; + } + return undef; +} #}}} + sub template_params (@) { #{{{ - my $filename=shift; - + my $filename=template_file(shift); + + if (! defined $filename) { + return if wantarray; + return ""; + } + require HTML::Template; - return filter => sub { + my @ret=( + filter => sub { my $text_ref = shift; $$text_ref=&Encode::decode_utf8($$text_ref); }, - filename => "$config{templatedir}/$filename", + filename => $filename, loop_context_vars => 1, die_on_bad_params => 0, - @_; + @_ + ); + return wantarray ? @ret : {@ret}; } #}}} sub template ($;@) { #{{{ @@ -782,6 +823,31 @@ sub add_depends ($$) { #{{{ } } # }}} +sub file_pruned ($$) { #{{{ + require File::Spec; + my $file=File::Spec->canonpath(shift); + my $base=File::Spec->canonpath(shift); + $file=~s#^\Q$base\E/*##; + + my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')'; + $file =~ m/$regexp/; +} #}}} + +my $gettext_obj; +sub gettext { #{{{ + # Only use gettext in the rare cases it's needed. + if (exists $ENV{LANG} || exists $ENV{LC_ALL} || exists $ENV{LC_MESSAGES}) { + if (! $gettext_obj) { + eval q{use Locale::gettext ''}; + $gettext_obj=Locale::gettext->domain('ikiwiki'); + } + return $gettext_obj->get(shift); + } + else { + return shift; + } +} #}}} + sub pagespec_match ($$) { #{{{ my $page=shift; my $spec=shift;