X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/e895157397c4602359f8612e4ce9964bcabc8928..d622da057be3fcd3c55ebf8f3651966f7dec668b:/IkiWiki/Plugin/rename.pm diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm index 82639a073..bf5a28240 100644 --- a/IkiWiki/Plugin/rename.pm +++ b/IkiWiki/Plugin/rename.pm @@ -10,7 +10,7 @@ sub import { hook(type => "formbuilder_setup", id => "rename", call => \&formbuilder_setup); hook(type => "formbuilder", id => "rename", call => \&formbuilder); hook(type => "sessioncgi", id => "rename", call => \&sessioncgi); - + hook(type => "rename", id => "rename", call => \&rename_subpages); } sub getsetup () { @@ -91,8 +91,9 @@ sub check_canrename ($$$$$$) { my $canrename; IkiWiki::run_hooks(canrename => sub { return if defined $canrename; - my $ret=shift->($q, $session, src => $src, srcfile => $srcfile, - dest => $dest, destfile => $destfile); + my $ret=shift->(cgi => $q, session => $session, + src => $src, srcfile => $srcfile, + dest => $dest, destfile => $destfile); if (defined $ret) { if ($ret eq "") { $canrename=1; @@ -107,7 +108,6 @@ sub check_canrename ($$$$$$) { } } }); - return $canrename; } sub rename_form ($$$) { @@ -216,7 +216,7 @@ sub postrename ($;$$$) { # Update edit form content to fix any links present # on it. $postrename->param("editcontent", - renamelink_hook($dest, $src, $dest, + renamepage_hook($dest, $src, $dest, $postrename->param("editcontent"))); # Get a new edit token; old was likely invalidated. @@ -312,29 +312,13 @@ 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) { - 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, - }; - } - } - + @torename=rename_hook( + torename => \@torename, + done => {}, + cgi => $q, + session => $session, + ); + require IkiWiki::Render; IkiWiki::disable_commit_hook() if $config{rcs}; my %origpagesources=%pagesources; @@ -413,22 +397,8 @@ sub sessioncgi ($$) { $template->param(error => $rename->{error}); if ($rename->{src} ne $rename->{dest}) { $template->param(brokenlinks_checked => 1); - $template->param(brokenlinks => [ - map { - { - page => htmllink($rename->{dest}, $rename->{dest}, $_, - noimageinline => 1) - } - } @{$rename->{brokenlinks}} - ]); - $template->param(fixedlinks => [ - map { - { - page => htmllink($rename->{dest}, $rename->{dest}, $_, - noimageinline => 1) - } - } @{$rename->{fixedlinks}} - ]); + $template->param(brokenlinks => linklist($rename->{dest}, $rename->{brokenlinks})); + $template->param(fixedlinks => linklist($rename->{dest}, $rename->{fixedlinks})); } $renamesummary.=$template->output; } @@ -443,10 +413,60 @@ sub sessioncgi ($$) { } } -sub renamelink_hook ($$$$) { +# Add subpages to the list of pages to be renamed, if needed. +sub rename_subpages (@) { + my %params = @_; + + my %torename = %{$params{torename}}; + my $q = $params{cgi}; + my $src = $torename{src}; + my $srcfile = $torename{src}; + my $dest = $torename{dest}; + my $destfile = $torename{dest}; + + return () unless ($q->param("subpages") && $src ne $dest); + + my @ret; + foreach my $p (keys %pagesources) { + 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 @ret, { + src => $p, + srcfile => $pagesources{$p}, + dest => pagename($d), + destfile => $d, + required => 0, + }; + } + return @ret; +} + +sub linklist { + # generates a list of links in a form suitable for FormBuilder + my $dest=shift; + my $list=shift; + # converts a list of pages into a list of links + # in a form suitable for FormBuilder. + + [map { + { + page => htmllink($dest, $dest, $_, + noimageinline => 1, + linktext => pagetitle($_), + ) + } + } @{$list}] +} + +sub renamepage_hook ($$$$) { my ($page, $src, $dest, $content)=@_; - IkiWiki::run_hooks(renamelink => sub { + IkiWiki::run_hooks(renamepage => sub { $content=shift->( page => $page, oldpage => $src, @@ -457,7 +477,43 @@ sub renamelink_hook ($$$$) { return $content; } - + +sub rename_hook (@) { + my %params = @_; + + my @torename=@{$params{torename}}; + my %done=%{$params{done}}; + my $q=$params{cgi}; + my $session=$params{session}; + + return () unless @torename; + + my @nextset; + foreach my $torename (@torename) { + unless (exists $done{$torename->{src}} && $done{$torename->{src}}) { + IkiWiki::run_hooks(rename => sub { + push @nextset, shift->( + torename => $torename, + cgi => $q, + session => $session, + ); + }); + $done{$torename->{src}}=1; + } + } + + push @torename, rename_hook( + torename => \@nextset, + done => \%done, + cgi => $q, + session => $session, + ); + + # dedup + my %seen; + return grep { ! $seen{$_->{src}}++ } @torename; +} + sub do_rename ($$$) { my $rename=shift; my $q=shift; @@ -477,7 +533,7 @@ sub do_rename ($$$) { IkiWiki::rcs_rename($rename->{srcfile}, $rename->{destfile}); } else { - if (! rename($config{srcdir}."/".$rename->{srcfile}, + if (! CORE::rename($config{srcdir}."/".$rename->{srcfile}, $config{srcdir}."/".$rename->{destfile})) { error("rename: $!"); } @@ -503,7 +559,7 @@ sub fixlinks ($$$) { if ($needfix) { my $file=$pagesources{$page}; my $oldcontent=readfile($config{srcdir}."/".$file); - my $content=renamelink_hook($page, $rename->{src}, $rename->{dest}, $oldcontent); + my $content=renamepage_hook($page, $rename->{src}, $rename->{dest}, $oldcontent); if ($oldcontent ne $content) { my $token=IkiWiki::rcs_prepedit($file); eval { writefile($file, $config{srcdir}, $content) };