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;
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;
error($@) if $@;
my $f = CGI::FormBuilder->new(
name => "rename",
- title => sprintf(gettext("rename %s"), IkiWiki::pagetitle($page)),
+ title => sprintf(gettext("rename %s"), pagetitle($page)),
header => 0,
charset => "utf-8",
method => 'POST',
$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 => IkiWiki::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;
$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;
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;
# 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.
}
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") {
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') {
# performed in check_canrename later.
my $src=$q->param("page");
my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src});
- my $dest=IkiWiki::possibly_foolish_untaint(IkiWiki::titlepage($q->param("new_name")));
+ my $dest=IkiWiki::possibly_foolish_untaint(titlepage($q->param("new_name")));
my $destfile=$dest;
if (! $q->param("attachment")) {
my $type=$q->param('type');
$type=$ext;
}
- $destfile.=".".$type;
+ $destfile=newpagefile($dest, $type);
}
push @torename, {
src => $src,
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,
+ };
}
}
$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;
}
exit 0;
}
-} #}}}
+}
+
+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 ($$$$) { #{{{
+sub renamelink_hook ($$$$) {
my ($page, $src, $dest, $content)=@_;
- IkiWiki::run_hooks(renamepage => sub {
+ IkiWiki::run_hooks(renamelink => sub {
$content=shift->(
page => $page,
oldpage => $src,
});
return $content;
-}# }}}
+}
-sub do_rename ($$$) { #{{{
+sub do_rename ($$$) {
my $rename=shift;
my $q=shift;
my $session=shift;
}
}
-} # }}}
+}
-sub fixlinks ($$$) { #{{{
+sub fixlinks ($$$) {
my $rename=shift;
my $session=shift;
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) };
}
return @fixedlinks;
-} #}}}
+}
1