sub genpage ($$) {
my $page=shift;
my $content=shift;
+
+ run_hooks(postscan => sub {
+ shift->(page => $page, content => $content);
+ });
my $templatefile;
run_hooks(templatefile => sub {
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}) {
$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));
$content=$template->output;
- run_hooks(postscan => sub {
- shift->(page => $page, content => $content);
- });
-
run_hooks(format => sub {
$content=shift->(
page => $page,
}
+sub verify_src_file ($$) {
+ my $file=decode_utf8(shift);
+ my $dir=shift;
+
+ return if -l $file || -d $file;
+ $file=~s/^\Q$dir\E\/?//;
+ return if ! length $file;
+ my $page = pagename($file);
+ if (! exists $pagesources{$page} &&
+ file_pruned($file)) {
+ $File::Find::prune=1;
+ return;
+ }
+
+ my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+ if (! defined $f) {
+ warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
+ }
+ return ($file,$page,$f);
+}
+
sub find_src_files () {
my @files;
my %pages;
find({
no_chdir => 1,
wanted => sub {
- $_=decode_utf8($_);
- if (file_pruned($_, $config{srcdir})) {
- $File::Find::prune=1;
- }
- 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 ($file,$page,$f) = verify_src_file($_,$config{srcdir});
+ if ($file) {
+ push @files, $file;
+ if ($pages{$page}) {
+ debug(sprintf(gettext("%s has multiple possible source pages"), $page));
}
+ $pages{$page}=1;
}
},
}, $config{srcdir});
find({
no_chdir => 1,
wanted => sub {
- $_=decode_utf8($_);
- if (file_pruned($_, $dir)) {
- $File::Find::prune=1;
- }
- 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 ($file,$page,$f) = verify_src_file($_,$dir);
+ if ($f) {
+ # avoid underlaydir override
+ # attacks; see security.mdwn
+ if (! -l "$config{srcdir}/$f" &&
+ ! -e _) {
+ if (! $pages{$page}) {
+ push @files, $f;
+ $pages{$page}=1;
}
}
}
push @internal_del, $pagesources{$page};
}
else {
- debug(sprintf(gettext("removing old page %s"), $page));
push @del, $pagesources{$page};
}
+ $dellinks{$page}= $links{$page};
$links{$page}=[];
+ $delrenderedfiles{$page}= $renderedfiles{$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;
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};
}
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;
scan($file);
}
+ my %del_hash = map {$_, 1} @$del;
+ while (my $autofile = shift (@autofiles)) {
+ my $page=pagename($autofile);
+ if (exists $del_hash{$page}) {
+ $links{$page}= $dellinks{$page};
+ $renderedfiles{$page}= $delrenderedfiles{$page};
+ delete $del_hash{$page};
+ }
+ if ($pages->{$page}) {
+ debug(sprintf(gettext("%s has multiple possible source pages"), $page));
+ }
+ $pages->{$page}=1;
+
+ push @{$files}, $autofile;
+ push @{$new}, $autofile if find_new_files([$autofile]);
+ push @{$changed}, $autofile if find_changed([$autofile]);
+
+ scan($autofile);
+ }
+ $del = [keys %del_hash];
+
calculate_links();
+
+ remove_del(@$del, @$internal_del);
foreach my $file (@$changed) {
render($file, sprintf(gettext("building %s"), $file));