X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/9bae90024229618c1bfd320f1513d1054af89e5a..5a82103526ab32e018cd999bb6a53d9e097c83a8:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 499ec8834..73bc747f9 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -8,13 +8,15 @@ use HTML::Entities; use open qw{:utf8 :std}; use vars qw{%config %links %oldlinks %oldpagemtime %pagectime %pagecase - %renderedfiles %pagesources %depends %hooks %forcerebuild}; + %renderedfiles %oldrenderedfiles %pagesources %depends %hooks + %forcerebuild}; 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 %config %links %renderedfiles %pagesources); -our $VERSION = 1.00; +our $VERSION = 1.01; # plugin interface version # Optimisation. use Memoize; @@ -22,9 +24,10 @@ memoize("abs2rel"); memoize("pagespec_translate"); 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$)}, + wiki_file_prune_regexp => qr{((^|/).svn/|\.\.|^\.|\/\.|\.x?html?$|\.rss$|\.atom$|.arch-ids/|{arch}/)}, wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]]+)\]\]/, wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/, verbose => 0, @@ -40,6 +43,7 @@ sub defaultconfig () { #{{{ diffurl => '', anonok => 0, rss => 0, + atom => 0, discussion => 1, rebuild => 0, refresh => 0, @@ -61,6 +65,7 @@ sub defaultconfig () { #{{{ timeformat => '%c', locale => undef, sslcookie => 0, + httpauth => 0, } #}}} sub checkconfig () { #{{{ @@ -87,8 +92,8 @@ sub checkconfig () { #{{{ if ($config{cgi} && ! length $config{url}) { error("Must specify url to wiki with --url when using --cgi\n"); } - if ($config{rss} && ! length $config{url}) { - error("Must specify url to wiki with --url when using --rss\n"); + if (($config{rss} || $config{atom}) && ! length $config{url}) { + error("Must specify url to wiki with --url when using --rss or --atom\n"); } $config{wikistatedir}="$config{srcdir}/.ikiwiki" @@ -259,6 +264,27 @@ sub writefile ($$$;$) { #{{{ close OUT; } #}}} +my %cleared; +sub will_render ($$;$) { #{{{ + my $page=shift; + my $dest=shift; + my $clear=shift; + + # Important security check. + if (-e "$config{destdir}/$dest" && ! $config{rebuild} && + ! grep { $_ eq $dest } (@{$renderedfiles{$page}}, @{$oldrenderedfiles{$page}})) { + error("$config{destdir}/$dest independently created, not overwriting with version from $page"); + } + + if (! $clear || $cleared{$page}) { + $renderedfiles{$page}=[$dest, grep { $_ ne $dest } @{$renderedfiles{$page}}]; + } + else { + $renderedfiles{$page}=[$dest]; + $cleared{$page}=1; + } +} #}}} + sub bestlink ($$) { #{{{ my $page=shift; my $link=shift; @@ -320,7 +346,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! + # absolute! (Debian bug #376658) my $path="/".shift; my $base="/".shift; @@ -364,10 +390,10 @@ sub htmllink ($$$;$$$) { #{{{ # 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 } values %renderedfiles) { + if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) { $bestlink=htmlpage($bestlink); } - if (! grep { $_ eq $bestlink } values %renderedfiles) { + if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) { return " "create", page => lc($link), from => $page). "\">?$linktext" @@ -420,10 +446,11 @@ sub linkify ($$$) { #{{{ } #}}} my %preprocessing; -sub preprocess ($$$) { #{{{ +sub preprocess ($$$;$) { #{{{ my $page=shift; # the page the data comes from my $destpage=shift; # the page the data will appear in (different for inline) my $content=shift; + my $scan=shift; my $handle=sub { my $escape=shift; @@ -433,6 +460,7 @@ sub preprocess ($$$) { #{{{ return "[[$command $params]]"; } elsif (exists $hooks{preprocess}{$command}) { + return "" if $scan && ! $hooks{preprocess}{$command}{scan}; # Note: preserve order of params, some plugins may # consider it significant. my @params; @@ -481,7 +509,7 @@ sub preprocess ($$$) { #{{{ return $content; } #}}} -sub filter ($$) { +sub filter ($$) { #{{{ my $page=shift; my $content=shift; @@ -490,7 +518,7 @@ sub filter ($$) { }); return $content; -} +} #}}} sub indexlink () { #{{{ return "$config{wikiname}"; @@ -527,6 +555,7 @@ sub loadindex () { #{{{ chomp; my %items; $items{link}=[]; + $items{dest}=[]; foreach my $i (split(/ /, $_)) { my ($item, $val)=split(/=/, $i, 2); push @{$items{$item}}, decode_entities($val); @@ -541,7 +570,8 @@ sub loadindex () { #{{{ $oldlinks{$page}=[@{$items{link}}]; $links{$page}=[@{$items{link}}]; $depends{$page}=$items{depends}[0] if exists $items{depends}; - $renderedfiles{$page}=$items{dest}[0]; + $renderedfiles{$page}=[@{$items{dest}}]; + $oldrenderedfiles{$page}=[@{$items{dest}}]; $pagecase{lc $page}=$page; } $pagectime{$page}=$items{ctime}[0]; @@ -561,9 +591,10 @@ sub saveindex () { #{{{ next unless $oldpagemtime{$page}; my $line="mtime=$oldpagemtime{$page} ". "ctime=$pagectime{$page} ". - "src=$pagesources{$page} ". - "dest=$renderedfiles{$page}"; - $line.=" link=$_" foreach @{$links{$page}}; + "src=$pagesources{$page}"; + $line.=" dest=$_" foreach @{$renderedfiles{$page}}; + my %count; + $line.=" link=$_" foreach grep { ++$count{$_} == 1 } @{$links{$page}}; if (exists $depends{$page}) { $line.=" depends=".encode_entities($depends{$page}, " \t\n"); } @@ -590,7 +621,7 @@ sub template ($;@) { #{{{ HTML::Template->new(template_params(@_)); } #}}} -sub misctemplate ($$) { #{{{ +sub misctemplate ($$;@) { #{{{ my $title=shift; my $pagebody=shift; @@ -600,8 +631,12 @@ sub misctemplate ($$) { #{{{ indexlink => indexlink(), wikiname => $config{wikiname}, pagebody => $pagebody, - baseurl => baseurl(), + baseurl => baseurl(), + @_, ); + run_hooks(pagetemplate => sub { + shift->(page => "", destpage => "", template => $template); + }); return $template->output; }#}}} @@ -611,6 +646,8 @@ sub hook (@) { # {{{ if (! exists $param{type} || ! ref $param{call} || ! exists $param{id}) { error "hook requires type, call, and id parameters"; } + + return if $param{no_override} && exists $hooks{$param{type}}{$param{id}}; $hooks{$param{type}}{$param{id}}=\%param; } # }}}