X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/dae0f48e91304afcb6ebe0936360e51b22a56548..cefbe6210f4e89984bb40062e4f9787b7372dd52:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 1cbe975c0..6c0bc1f60 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -8,12 +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 %config %links %renderedfiles %pagesources); +our $VERSION = 1.01; # Optimisation. use Memoize; @@ -23,7 +26,7 @@ memoize("pagespec_translate"); my $installdir=''; # INSTALLDIR_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$|.arch-ids/|{arch}/)}, wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]]+)\]\]/, wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/, verbose => 0, @@ -60,6 +63,7 @@ sub defaultconfig () { #{{{ timeformat => '%c', locale => undef, sslcookie => 0, + httpauth => 0, } #}}} sub checkconfig () { #{{{ @@ -258,6 +262,25 @@ sub writefile ($$$;$) { #{{{ close OUT; } #}}} +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) { + $renderedfiles{$page}=[$dest, grep { $_ ne $dest } @{$renderedfiles{$page}}]; + } + else { + $renderedfiles{$page}=[$dest]; + } +} #}}} + sub bestlink ($$) { #{{{ my $page=shift; my $link=shift; @@ -319,7 +342,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; @@ -363,10 +386,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" @@ -526,6 +549,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); @@ -540,7 +564,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]; @@ -560,8 +585,8 @@ sub saveindex () { #{{{ next unless $oldpagemtime{$page}; my $line="mtime=$oldpagemtime{$page} ". "ctime=$pagectime{$page} ". - "src=$pagesources{$page} ". - "dest=$renderedfiles{$page}"; + "src=$pagesources{$page}"; + $line.=" dest=$_" foreach @{$renderedfiles{$page}}; $line.=" link=$_" foreach @{$links{$page}}; if (exists $depends{$page}) { $line.=" depends=".encode_entities($depends{$page}, " \t\n"); @@ -589,7 +614,7 @@ sub template ($;@) { #{{{ HTML::Template->new(template_params(@_)); } #}}} -sub misctemplate ($$) { #{{{ +sub misctemplate ($$;@) { #{{{ my $title=shift; my $pagebody=shift; @@ -599,8 +624,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; }#}}}