X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/a7fd6debc50e95d189f08cd47d1fd1fe2a5aa2d6..1d3da099b4763df37033e7955b8762f5b818d1b6:/IkiWiki/Plugin/rename.pm?ds=sidebyside

diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm
index b2c3eedfe..82639a073 100644
--- a/IkiWiki/Plugin/rename.pm
+++ b/IkiWiki/Plugin/rename.pm
@@ -3,25 +3,25 @@ package IkiWiki::Plugin::rename;
 
 use warnings;
 use strict;
-use IkiWiki 2.00;
+use IkiWiki 3.00;
 
-sub import { #{{{
+sub import {
 	hook(type => "getsetup", id => "rename", call => \&getsetup);
 	hook(type => "formbuilder_setup", id => "rename", call => \&formbuilder_setup);
 	hook(type => "formbuilder", id => "rename", call => \&formbuilder);
 	hook(type => "sessioncgi", id => "rename", call => \&sessioncgi);
 
-} # }}}
+}
 
-sub getsetup () { #{{{
+sub getsetup () {
 	return 
 		plugin => {
 			safe => 1,
 			rebuild => 0,
 		},
-} #}}}
+}
 
-sub check_canrename ($$$$$$) { #{{{
+sub check_canrename ($$$$$$) {
 	my $src=shift;
 	my $srcfile=shift;
 	my $dest=shift;
@@ -87,9 +87,30 @@ sub check_canrename ($$$$$$) { #{{{
 			IkiWiki::Plugin::attachment::check_canattach($session, $dest, $srcfile);
 		}
 	}
-} #}}}
 
-sub rename_form ($$$) { #{{{ 
+	my $canrename;
+	IkiWiki::run_hooks(canrename => sub {
+		return if defined $canrename;
+		my $ret=shift->($q, $session, src => $src, srcfile => $srcfile,
+				dest => $dest, destfile => $destfile);
+		if (defined $ret) {
+			if ($ret eq "") {
+				$canrename=1;
+			}
+			elsif (ref $ret eq 'CODE') {
+				$ret->();
+				$canrename=0;
+			}
+			elsif (defined $ret) {
+				error($ret);
+				$canrename=0;
+			}
+		}
+	});
+	return $canrename;
+}
+
+sub rename_form ($$$) {
 	my $q=shift;
 	my $session=shift;
 	my $page=shift;
@@ -111,7 +132,7 @@ sub rename_form ($$$) { #{{{
 	
 	$f->field(name => "do", type => "hidden", value => "rename", force => 1);
 	$f->field(name => "page", type => "hidden", value => $page, force => 1);
-	$f->field(name => "new_name", value => pagetitle($page), size => 60);
+	$f->field(name => "new_name", value => pagetitle($page, 1), size => 60);
 	if (!$q->param("attachment")) {
 		# insert the standard extensions
 		my @page_types;
@@ -145,9 +166,9 @@ sub rename_form ($$$) { #{{{
 	$f->field(name => "attachment", type => "hidden");
 
 	return $f, ["Rename", "Cancel"];
-} #}}}
+}
 
-sub rename_start ($$$$) { #{{{
+sub rename_start ($$$$) {
 	my $q=shift;
 	my $session=shift;
 	my $attachment=shift;
@@ -171,9 +192,9 @@ sub rename_start ($$$$) { #{{{
 	my ($f, $buttons)=rename_form($q, $session, $page);
 	IkiWiki::showform($f, $buttons, $session, $q);
 	exit 0;
-} #}}}
+}
 
-sub postrename ($;$$$) { #{{{
+sub postrename ($;$$$) {
 	my $session=shift;
 	my $src=shift;
 	my $dest=shift;
@@ -195,7 +216,7 @@ sub postrename ($;$$$) { #{{{
 		# Update edit form content to fix any links present
 		# on it.
 		$postrename->param("editcontent",
-			renamepage_hook($dest, $src, $dest,
+			renamelink_hook($dest, $src, $dest,
 				 $postrename->param("editcontent")));
 
 		# Get a new edit token; old was likely invalidated.
@@ -204,17 +225,18 @@ sub postrename ($;$$$) { #{{{
 	}
 
 	IkiWiki::cgi_editpage($postrename, $session);
-} #}}}
+}
 
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
 	my %params=@_;
 	my $form=$params{form};
 
-	if (defined $form->field("do") && $form->field("do") eq "edit") {
+	if (defined $form->field("do") && ($form->field("do") eq "edit" ||
+	    $form->field("do") eq "create")) {
 		my $q=$params{cgi};
 		my $session=$params{session};
 
-		if ($form->submitted eq "Rename") {
+		if ($form->submitted eq "Rename" && $form->field("do") eq "edit") {
 			rename_start($q, $session, 0, $form->field("page"));
 		}
 		elsif ($form->submitted eq "Rename Attachment") {
@@ -228,27 +250,28 @@ sub formbuilder (@) { #{{{
 			rename_start($q, $session, 1, $selected[0]);
 		}
 	}
-} #}}}
+}
 
 my $renamesummary;
 
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
 	my %params=@_;
 	my $form=$params{form};
 	my $q=$params{cgi};
 
-	if (defined $form->field("do") && $form->field("do") eq "edit") {
+	if (defined $form->field("do") && ($form->field("do") eq "edit" ||
+	    $form->field("do") eq "create")) {
 		# Rename button for the page, and also for attachments.
-		push @{$params{buttons}}, "Rename";
+		push @{$params{buttons}}, "Rename" if $form->field("do") eq "edit";
 		$form->tmpl_param("field-rename" => '<input name="_submit" type="submit" value="Rename Attachment" />');
 
 		if (defined $renamesummary) {
 			$form->tmpl_param(message => $renamesummary);
 		}
 	}
-} #}}}
+}
 
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
         my $q=shift;
 
 	if ($q->param("do") eq 'rename') {
@@ -279,12 +302,7 @@ sub sessioncgi ($$) { #{{{
 					$type=$ext;
 				}
 				
-				if (! $config{indexpages}) {
-					$destfile.=".".$type;
-				}
-				else {
-					$destfile.="/index.".$type;
-				}
+				$destfile=newpagefile($dest, $type);
 			}
 			push @torename, {
 				src => $src,
@@ -294,20 +312,26 @@ sub sessioncgi ($$) { #{{{
 				required => 1,
 			};
 
+			IkiWiki::run_hooks(rename => sub { shift->(\@torename, $q, $session); });
+
 			# See if any subpages need to be renamed.
 			if ($q->param("subpages") && $src ne $dest) {
 				foreach my $p (keys %pagesources) {
-					if ($pagesources{$p}=~m/^\Q$src\E\//) {
-						my $d=$pagesources{$p};
-						$d=~s/^\Q$src\E\//$dest\//;
-						push @torename, {
-							src => $p,
-							srcfile => $pagesources{$p},
-							dest => pagename($d),
-							destfile => $d,
-							required => 0,
-						};
-					}
+					next unless $pagesources{$p}=~m/^\Q$src\E\//;
+					# If indexpages is enabled, the
+					# srcfile should not be confused
+					# with a subpage.
+					next if $pagesources{$p} eq $srcfile;
+
+					my $d=$pagesources{$p};
+					$d=~s/^\Q$src\E\//$dest\//;
+					push @torename, {
+						src => $p,
+						srcfile => $pagesources{$p},
+						dest => pagename($d),
+						destfile => $d,
+						required => 0,
+					};
 				}
 			}
 			
@@ -417,12 +441,12 @@ sub sessioncgi ($$) { #{{{
 
 		exit 0;
 	}
-} #}}}
+}
 
-sub renamepage_hook ($$$$) { #{{{
+sub renamelink_hook ($$$$) {
 	my ($page, $src, $dest, $content)=@_;
 
-	IkiWiki::run_hooks(renamepage => sub {
+	IkiWiki::run_hooks(renamelink => sub {
 		$content=shift->(
 			page => $page,
 			oldpage => $src,
@@ -432,9 +456,9 @@ sub renamepage_hook ($$$$) { #{{{
 	});
 
 	return $content;
-}# }}}
+}
 			
-sub do_rename ($$$) { #{{{
+sub do_rename ($$$) {
 	my $rename=shift;
 	my $q=shift;
 	my $session=shift;
@@ -459,9 +483,9 @@ sub do_rename ($$$) { #{{{
 		}
 	}
 
-} # }}}
+}
 
-sub fixlinks ($$$) { #{{{
+sub fixlinks ($$$) {
 	my $rename=shift;
 	my $session=shift;
 
@@ -479,7 +503,7 @@ sub fixlinks ($$$) { #{{{
 		if ($needfix) {
 			my $file=$pagesources{$page};
 			my $oldcontent=readfile($config{srcdir}."/".$file);
-			my $content=renamepage_hook($page, $rename->{src}, $rename->{dest}, $oldcontent);
+			my $content=renamelink_hook($page, $rename->{src}, $rename->{dest}, $oldcontent);
 			if ($oldcontent ne $content) {
 				my $token=IkiWiki::rcs_prepedit($file);
 				eval { writefile($file, $config{srcdir}, $content) };
@@ -497,6 +521,6 @@ sub fixlinks ($$$) { #{{{
 	}
 
 	return @fixedlinks;
-} #}}}
+}
 
 1