X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/ba1dfb4ec665f95b4f4217360e08109bcbf7f41b..af83b4c5f576633c03c157a67994af6bfaff617a:/IkiWiki/Render.pm diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 8f9cbf673..af24df155 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -61,6 +61,10 @@ sub backlinks ($) { sub genpage ($$) { my $page=shift; my $content=shift; + + run_hooks(postscan => sub { + shift->(page => $page, content => $content); + }); my $templatefile; run_hooks(templatefile => sub { @@ -74,11 +78,14 @@ sub genpage ($$) { my $actions=0; if (length $config{cgiurl}) { - $template->param(editurl => cgiurl(do => "edit", page => $page)) - if IkiWiki->can("cgi_editpage"); - $template->param(prefsurl => cgiurl(do => "prefs")) - if exists $hooks{auth}; - $actions++; + if (IkiWiki->can("cgi_editpage")) { + $template->param(editurl => cgiurl(do => "edit", page => $page)); + $actions++; + } + if (exists $hooks{auth}) { + $template->param(prefsurl => cgiurl(do => "prefs")); + $actions++; + } } if (defined $config{historyurl} && length $config{historyurl}) { @@ -88,7 +95,7 @@ sub genpage ($$) { $actions++; } if ($config{discussion}) { - if ($page !~ /.*\/\Q$config{discussionpage}\E$/ && + if ($page !~ /.*\/\Q$config{discussionpage}\E$/i && (length $config{cgiurl} || exists $links{$page."/".$config{discussionpage}})) { $template->param(discussionlink => htmllink($page, $page, $config{discussionpage}, noimageinline => 1, forcesubpage => 1)); @@ -130,10 +137,6 @@ sub genpage ($$) { $content=$template->output; - run_hooks(postscan => sub { - shift->(page => $page, content => $content); - }); - run_hooks(format => sub { $content=shift->( page => $page, @@ -285,24 +288,26 @@ sub find_src_files () { find({ no_chdir => 1, wanted => sub { - $_=decode_utf8($_); - if (file_pruned($_, $config{srcdir})) { + my $file=decode_utf8($_); + $file=~s/^\Q$config{srcdir}\E\/?//; + return if -l $_ || -d _ || ! length $file; + my $page = pagename($file); + if (! exists $pagesources{$page} && + file_pruned($file)) { $File::Find::prune=1; + return; } - elsif (! -l $_ && ! -d _) { - my ($f)=/$config{wiki_file_regexp}/; # untaint - if (! defined $f) { - warn(sprintf(gettext("skipping bad filename %s"), $_)."\n"); - } - else { - $f=~s/^\Q$config{srcdir}\E\/?//; - push @files, $f; - my $page = pagename($f); - if ($pages{$page}) { - debug(sprintf(gettext("%s has multiple possible source pages"), $page)); - } - $pages{$page}=1; + + my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint + if (! defined $f) { + warn(sprintf(gettext("skipping bad filename %s"), $file)."\n"); + } + else { + push @files, $f; + if ($pages{$page}) { + debug(sprintf(gettext("%s has multiple possible source pages"), $page)); } + $pages{$page}=1; } }, }, $config{srcdir}); @@ -310,27 +315,28 @@ sub find_src_files () { find({ no_chdir => 1, wanted => sub { - $_=decode_utf8($_); - if (file_pruned($_, $dir)) { + my $file=decode_utf8($_); + $file=~s/^\Q$dir\E\/?//; + return if -l $_ || -d _ || ! length $file; + my $page=pagename($file); + if (! exists $pagesources{$page} && + file_pruned($file)) { $File::Find::prune=1; + return; } - elsif (! -l $_ && ! -d _) { - my ($f)=/$config{wiki_file_regexp}/; # untaint - if (! defined $f) { - warn(sprintf(gettext("skipping bad filename %s"), $_)."\n"); - } - else { - $f=~s/^\Q$dir\E\/?//; - # avoid underlaydir - # override attacks; see - # security.mdwn - if (! -l "$config{srcdir}/$f" && - ! -e _) { - my $page=pagename($f); - if (! $pages{$page}) { - push @files, $f; - $pages{$page}=1; - } + + my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint + if (! defined $f) { + warn(sprintf(gettext("skipping bad filename %s"), $file)."\n"); + } + else { + # avoid underlaydir override + # attacks; see security.mdwn + if (! -l "$config{srcdir}/$f" && + ! -e _) { + if (! $pages{$page}) { + push @files, $f; + $pages{$page}=1; } } } @@ -389,27 +395,39 @@ sub find_del_files ($) { push @internal_del, $pagesources{$page}; } else { - debug(sprintf(gettext("removing old page %s"), $page)); push @del, $pagesources{$page}; } $links{$page}=[]; $renderedfiles{$page}=[]; $pagemtime{$page}=0; - foreach my $old (@{$oldrenderedfiles{$page}}) { - prune($config{destdir}."/".$old); - } - delete $pagesources{$page}; - foreach my $source (keys %destsources) { - if ($destsources{$source} eq $page) { - delete $destsources{$source}; - } - } } } return \@del, \@internal_del; } +sub remove_del (@) { + foreach my $file (@_) { + my $page=pagename($file); + if (! isinternal($page)) { + debug(sprintf(gettext("removing old page %s"), $page)); + } + + foreach my $old (@{$oldrenderedfiles{$page}}) { + prune($config{destdir}."/".$old); + } + + foreach my $source (keys %destsources) { + if ($destsources{$source} eq $page) { + delete $destsources{$source}; + } + } + + delete $pagecase{lc $page}; + delete $pagesources{$page}; + } +} + sub find_changed ($) { my $files=shift; my @changed; @@ -494,7 +512,7 @@ sub calculate_changed_links ($$$) { my $target=bestlink($page, $l); if (! exists $oldlink_targets->{$page}{$l} || $target ne $oldlink_targets->{$page}{$l}) { - $backlinkchanged{$l}=1; + $backlinkchanged{$target}=1; $linkchangers{lc($page)}=1; } delete $oldlink_targets->{$page}{$l}; @@ -502,7 +520,7 @@ sub calculate_changed_links ($$$) { } if (exists $oldlink_targets->{$page} && %{$oldlink_targets->{$page}}) { - foreach my $target (keys %{$oldlink_targets->{$page}}) { + foreach my $target (values %{$oldlink_targets->{$page}}) { $backlinkchanged{$target}=1; } $linkchangers{lc($page)}=1; @@ -557,7 +575,7 @@ sub render_dependent ($$$$$$$) { my $in=sub { my $list=shift; my $type=shift; - foreach my $file ($list) { + foreach my $file (@$list) { next if $file eq $f; my $page=pagename($file); if ($sub->($page, location => $p)) { @@ -630,6 +648,8 @@ sub refresh () { } calculate_links(); + + remove_del(@$del, @$internal_del); foreach my $file (@$changed) { render($file, sprintf(gettext("building %s"), $file)); @@ -663,6 +683,17 @@ sub refresh () { } } +sub clean_rendered { + lockwiki(); + loadindex(); + remove_unrendered(); + foreach my $page (keys %oldrenderedfiles) { + foreach my $file (@{$oldrenderedfiles{$page}}) { + prune($config{destdir}."/".$file); + } + } +} + sub commandline_render () { lockwiki(); loadindex();