if (-l "$destdir/$test") {
error("cannot write to a symlink ($test)");
}
+ if (-f _ && $test ne $file) {
+ # Remove conflicting file.
+ foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) {
+ foreach my $f (@{$renderedfiles{$p}}, @{$oldrenderedfiles{$p}}) {
+ if ($f eq $test) {
+ unlink("$destdir/$test");
+ last;
+ }
+ }
+ }
+ }
$test=dirname($test);
}
my $dest=shift;
my $clear=shift;
- # Important security check.
+ # Important security check for independently created files.
if (-e "$config{destdir}/$dest" && ! $config{rebuild} &&
! grep { $_ eq $dest } (@{$renderedfiles{$page}}, @{$oldrenderedfiles{$page}}, @{$wikistate{editpage}{previews}})) {
- error("$config{destdir}/$dest independently created, not overwriting with version from $page");
+ my $from_other_page=0;
+ # Expensive, but rarely runs.
+ foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) {
+ if (grep {
+ $_ eq $dest ||
+ dirname($_) eq $dest
+ } @{$renderedfiles{$p}}, @{$oldrenderedfiles{$p}}) {
+ $from_other_page=1;
+ last;
+ }
+ }
+
+ error("$config{destdir}/$dest independently created, not overwriting with version from $page")
+ unless $from_other_page;
+ }
+
+ # If $dest exists as a directory, remove conflicting files in it
+ # rendered from other pages.
+ if (-d _) {
+ foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) {
+ foreach my $f (@{$renderedfiles{$p}}, @{$oldrenderedfiles{$p}}) {
+ if (dirname($f) eq $dest) {
+ unlink("$config{destdir}/$f");
+ rmdir(dirname("$config{destdir}/$f"));
+ }
+ }
+ }
}
if (! $clear || $cleared{$page}) {
}
sub isselflink ($$) {
+ # Plugins can override this function to support special types
+ # of selflinks.
my $page=shift;
my $link=shift;
return $content;
}
-sub filter ($$$;$) {
+sub filter ($$$) {
my $page=shift;
my $destpage=shift;
my $content=shift;
- my $fullpage=shift;
- $fullpage = 0 unless defined $fullpage;
run_hooks(filter => sub {
$content=shift->(page => $page, destpage => $destpage,
- content => $content, fullpage => $fullpage);
+ content => $content);
});
return $content;
my $name=shift;
my $tpage=($name =~ s/^\///) ? $name : "templates/$name";
+ my $template;
if ($name !~ /\.tmpl$/ && exists $pagesources{$tpage}) {
- $tpage=$pagesources{$tpage};
+ $template=srcfile($pagesources{$tpage}, 1);
$name.=".tmpl";
}
+ else {
+ $template=srcfile($tpage, 1);
+ }
- my $template=srcfile($tpage, 1);
if (defined $template) {
return $template, $tpage, 1 if wantarray;
return $template;