X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/77b0454e0c69fa0a3e3855b5f25322ae26b37042..19700c70e54cd6d94cf02bf160d65f951dcb7d66:/IkiWiki/Render.pm

diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 0fe20c64f..e98888d76 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -61,6 +61,10 @@ sub backlinks ($) {
 sub genpage ($$) {
 	my $page=shift;
 	my $content=shift;
+	
+	run_hooks(postscan => sub {
+		shift->(page => $page, content => $content);
+	});
 
 	my $templatefile;
 	run_hooks(templatefile => sub {
@@ -74,11 +78,14 @@ sub genpage ($$) {
 	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}) {
@@ -88,7 +95,7 @@ sub genpage ($$) {
 		$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));
@@ -130,10 +137,6 @@ sub genpage ($$) {
 	
 	$content=$template->output;
 	
-	run_hooks(postscan => sub {
-		shift->(page => $page, content => $content);
-	});
-
 	run_hooks(format => sub {
 		$content=shift->(
 			page => $page,
@@ -164,6 +167,7 @@ sub scan ($) {
 		else {
 			$links{$page}=[];
 		}
+		delete $typedlinks{$page};
 
 		run_hooks(scan => sub {
 			shift->(
@@ -287,13 +291,13 @@ sub find_src_files () {
 		wanted => sub {
 			my $file=decode_utf8($_);
 			$file=~s/^\Q$config{srcdir}\E\/?//;
+			return if -l $_ || -d _ || ! length $file;
 			my $page = pagename($file);
 			if (! exists $pagesources{$page} &&
 			    file_pruned($file)) {
 				$File::Find::prune=1;
 				return;
 			}
-			return if -l $_ || -d _ || ! length $file;
 
 			my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
 			if (! defined $f) {
@@ -314,13 +318,13 @@ sub find_src_files () {
 			wanted => sub {
 				my $file=decode_utf8($_);
 				$file=~s/^\Q$dir\E\/?//;
+				return if -l $_ || -d _ || ! length $file;
 				my $page=pagename($file);
 				if (! exists $pagesources{$page} &&
 				    file_pruned($file)) {
 					$File::Find::prune=1;
 					return;
 				}
-				return if -l $_ || -d _ || ! length $file;
 
 				my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
 				if (! defined $f) {
@@ -392,27 +396,40 @@ sub find_del_files ($) {
 				push @internal_del, $pagesources{$page};
 			}
 			else {
-				debug(sprintf(gettext("removing old page %s"), $page));
 				push @del, $pagesources{$page};
 			}
 			$links{$page}=[];
+			delete $typedlinks{$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;
@@ -484,6 +501,29 @@ sub remove_unrendered () {
 	}
 }
 
+sub link_types_changed ($$) {
+	# each is of the form { type => { link => 1 } }
+	my $new = shift;
+	my $old = shift;
+
+	return 0 if !defined $new && !defined $old;
+	return 1 if !defined $new || !defined $old;
+
+	while (my ($type, $links) = each %$new) {
+		foreach my $link (keys %$links) {
+			return 1 unless exists $old->{$type}{$link};
+		}
+	}
+
+	while (my ($type, $links) = each %$old) {
+		foreach my $link (keys %$links) {
+			return 1 unless exists $new->{$type}{$link};
+		}
+	}
+
+	return 0;
+}
+
 sub calculate_changed_links ($$$) {
 	my ($changed, $del, $oldlink_targets)=@_;
 
@@ -510,6 +550,14 @@ sub calculate_changed_links ($$$) {
 			}
 			$linkchangers{lc($page)}=1;
 		}
+
+		# we currently assume that changing the type of a link doesn't
+		# change backlinks
+		if (!exists $linkchangers{lc($page)}) {
+			if (link_types_changed($typedlinks{$page}, $oldtypedlinks{$page})) {
+				$linkchangers{lc($page)}=1;
+			}
+		}
 	}
 
 	return \%backlinkchanged, \%linkchangers;
@@ -550,7 +598,7 @@ sub render_dependent ($$$$$$$) {
 		if (exists $depends{$p} && ! defined $reason) {
 			foreach my $dep (keys %{$depends{$p}}) {
 				my $sub=pagespec_translate($dep);
-				next if $@ || ! defined $sub;
+				next unless defined $sub;
 
 				# only consider internal files
 				# if the page explicitly depends
@@ -633,6 +681,8 @@ sub refresh () {
 	}
 
 	calculate_links();
+	
+	remove_del(@$del, @$internal_del);
 
 	foreach my $file (@$changed) {
 		render($file, sprintf(gettext("building %s"), $file));
@@ -666,6 +716,17 @@ sub refresh () {
 	}
 }
 
+sub clean_rendered {
+	lockwiki();
+	loadindex();
+	remove_unrendered();
+	foreach my $page (keys %oldrenderedfiles) {
+		foreach my $file (@{$oldrenderedfiles{$page}}) {
+			prune($config{destdir}."/".$file);
+		}
+	}
+}
+
 sub commandline_render () {
 	lockwiki();
 	loadindex();