]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki.pm
html
[git.ikiwiki.info.git] / IkiWiki.pm
index f9a30a202f892232dbbff2cdd32f6c8190b3eb48..cfa4f5f039781205d404819388c6700e1d2a90a3 100644 (file)
@@ -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,10 +887,36 @@ 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}})) {
-               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}) {
@@ -1082,6 +1119,8 @@ sub urlto ($$;$) {
 }
 
 sub isselflink ($$) {
+       # Plugins can override this function to support special types
+       # of selflinks.
        my $page=shift;
        my $link=shift;
 
@@ -1403,16 +1442,14 @@ sub preprocess ($$$;$$) {
        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;
@@ -1693,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;