]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki.pm
new version of the ikiwiki vim plugin. docs upgraded. new forum post
[git.ikiwiki.info.git] / IkiWiki.pm
index 85b5424863e5836af0b9d1e0dba2ef0fb73abb87..6da281999f0b4c035805626f11d6e244c105d69f 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,11 +887,12 @@ 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
@@ -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 "<span class=\"selflink\">$linktext</span>"
-               if length $bestlink && $page eq $bestlink &&
+               if length $bestlink && isselflink($page, $bestlink) &&
                   ! defined $opts{anchor};
        
        if (! $destsources{$bestlink}) {
@@ -1562,6 +1596,12 @@ sub loadindex () {
        if (exists $index->{version} && ! ref $index->{version}) {
                $pages=$index->{page};
                %wikistate=%{$index->{state}};
+               # Handle plugins that got disabled by loading a new setup.
+               if (exists $config{setupfile}) {
+                       require IkiWiki::Setup;
+                       IkiWiki::Setup::disabled_plugins(
+                               grep { ! $loaded_plugins{$_} } keys %wikistate);
+               }
        }
        else {
                $pages=$index;
@@ -1629,11 +1669,7 @@ sub loadindex () {
 sub saveindex () {
        run_hooks(savestate => sub { shift->() });
 
-       my %hookids;
-       foreach my $type (keys %hooks) {
-               $hookids{$_}=1 foreach keys %{$hooks{$type}};
-       }
-       my @hookids=keys %hookids;
+       my @plugins=keys %loaded_plugins;
 
        if (! -d $config{wikistatedir}) {
                mkdir($config{wikistatedir});
@@ -1667,7 +1703,7 @@ sub saveindex () {
                }
 
                if (exists $pagestate{$page}) {
-                       foreach my $id (@hookids) {
+                       foreach my $id (@plugins) {
                                foreach my $key (keys %{$pagestate{$page}{$id}}) {
                                        $index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
                                }
@@ -1676,7 +1712,8 @@ sub saveindex () {
        }
 
        $index{state}={};
-       foreach my $id (@hookids) {
+       foreach my $id (@plugins) {
+               $index{state}{$id}={}; # used to detect disabled plugins
                foreach my $key (keys %{$wikistate{$id}}) {
                        $index{state}{$id}{$key}=$wikistate{$id}{$key};
                }
@@ -1696,12 +1733,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;
@@ -2362,10 +2402,16 @@ sub derel ($$) {
        my $path=shift;
        my $from=shift;
 
-       if ($path =~ m!^\./!) {
-               $from=~s#/?[^/]+$## if defined $from;
-               $path=~s#^\./##;
-               $path="$from/$path" if defined $from && length $from;
+       if ($path =~ m!^\.(/|$)!) {
+               if ($1) {
+                       $from=~s#/?[^/]+$## if defined $from;
+                       $path=~s#^\./##;
+                       $path="$from/$path" if defined $from && length $from;
+               }
+               else {
+                       $path = $from;
+                       $path = "" unless defined $path;
+               }
        }
 
        return $path;
@@ -2399,13 +2445,16 @@ sub match_internal ($$;@) {
 sub match_page ($$;@) {
        my $page=shift;
        my $match=match_glob($page, shift, @_);
-       if ($match && ! (exists $IkiWiki::pagesources{$page}
-           && defined IkiWiki::pagetype($IkiWiki::pagesources{$page}))) {
-               return IkiWiki::FailReason->new("$page is not a page");
-       }
-       else {
-               return $match;
+       if ($match) {
+               my $source=exists $IkiWiki::pagesources{$page} ?
+                       $IkiWiki::pagesources{$page} :
+                       $IkiWiki::delpagesources{$page};
+               my $type=defined $source ? IkiWiki::pagetype($source) : undef;
+               if (! defined $type) {  
+                       return IkiWiki::FailReason->new("$page is not a page");
+               }
        }
+       return $match;
 }
 
 sub match_link ($$;@) {