X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/96b395705a97de3c481f223804a818816947353f..5a82103526ab32e018cd999bb6a53d9e097c83a8:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 6484e8cb0..73bc747f9 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -8,14 +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 + displaytime will_render %config %links %renderedfiles %pagesources); -our $VERSION = 1.00; +our $VERSION = 1.01; # plugin interface version # Optimisation. use Memoize; @@ -23,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, @@ -41,6 +43,7 @@ sub defaultconfig () { #{{{ diffurl => '', anonok => 0, rss => 0, + atom => 0, discussion => 1, rebuild => 0, refresh => 0, @@ -62,6 +65,7 @@ sub defaultconfig () { #{{{ timeformat => '%c', locale => undef, sslcookie => 0, + httpauth => 0, } #}}} sub checkconfig () { #{{{ @@ -88,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" @@ -260,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; @@ -365,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" @@ -421,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; @@ -434,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; @@ -482,7 +509,7 @@ sub preprocess ($$$) { #{{{ return $content; } #}}} -sub filter ($$) { +sub filter ($$) { #{{{ my $page=shift; my $content=shift; @@ -491,7 +518,7 @@ sub filter ($$) { }); return $content; -} +} #}}} sub indexlink () { #{{{ return "$config{wikiname}"; @@ -528,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); @@ -542,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]; @@ -562,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"); } @@ -604,6 +634,9 @@ sub misctemplate ($$;@) { #{{{ baseurl => baseurl(), @_, ); + run_hooks(pagetemplate => sub { + shift->(page => "", destpage => "", template => $template); + }); return $template->output; }#}}} @@ -613,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; } # }}}