X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=IkiWiki.pm;h=cfa4f5f039781205d404819388c6700e1d2a90a3;hb=b5bd92e77e9998a59adc9174195af1b46e0c4bca;hp=4acc5508a6ef079abd61b595a61ba6d85d117563;hpb=773db5a35e5b81fee3f1f8bf48dffc1dd4f3e2fe;p=ikiwiki.git diff --git a/IkiWiki.pm b/IkiWiki.pm index 4acc5508a..cfa4f5f03 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -823,6 +823,17 @@ sub prep_writefile ($$) { 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); } @@ -876,15 +887,16 @@ sub will_render ($$;$) { 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}})) { my $from_other_page=0; - foreach my $p (keys %renderedfiles) { + # Expensive, but rarely runs. + foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) { if (grep { $_ eq $dest || dirname($_) eq $dest - } @{$renderedfiles{$p}}) { + } @{$renderedfiles{$p}}, @{$oldrenderedfiles{$p}}) { $from_other_page=1; last; } @@ -894,6 +906,19 @@ sub will_render ($$;$) { 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}) { $renderedfiles{$page}=[$dest, grep { $_ ne $dest } @{$renderedfiles{$page}}]; } @@ -1093,6 +1118,15 @@ sub urlto ($$;$) { return beautify_urlpath($link); } +sub isselflink ($$) { + # Plugins can override this function to support special types + # of selflinks. + my $page=shift; + my $link=shift; + + return $page eq $link; +} + sub htmllink ($$$;@) { my $lpage=shift; # the page doing the linking my $page=shift; # the page that will contain the link (different for inline) @@ -1118,7 +1152,7 @@ sub htmllink ($$$;@) { } return "$linktext" - if length $bestlink && $page eq $bestlink && + if length $bestlink && isselflink($page, $bestlink) && ! defined $opts{anchor}; if (! $destsources{$bestlink}) { @@ -1696,12 +1730,15 @@ sub template_file ($) { 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;