hook(type => "htmlize", id => "po", call => \&htmlize);
hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
hook(type => "postscan", id => "po", call => \&postscan);
- hook(type => "rename", id => "po", call => \&renamepages);
+ hook(type => "rename", id => "po", call => \&renamepages, first => 1);
hook(type => "delete", id => "po", call => \&mydelete);
hook(type => "change", id => "po", call => \&change);
+ hook(type => "canremove", id => "po", call => \&canremove);
+ hook(type => "canrename", id => "po", call => \&canrename);
hook(type => "editcontent", id => "po", call => \&editcontent);
$origsubs{'bestlink'}=\&IkiWiki::bestlink;
}
# Add the renamed page translations to the list of to-be-renamed pages.
-sub renamepages() {
- my $torename=shift;
+sub renamepages($$$) {
+ my ($torename, $cgi, $session) = (shift, shift, shift);
+
+ # copy the initial array, so that we can iterate on it AND
+ # modify it at the same time, without iterating on the items we
+ # pushed on it ourselves
my @torename=@{$torename};
+ # Save the page(s) the user asked to rename, so that our
+ # canrename hook can tell the difference between:
+ # - a translation being renamed as a consequence of its master page
+ # being renamed
+ # - a user trying to directly rename a translation
+ # This is why this hook has to be run first, before @torename is modified
+ # by other plugins.
+ $session->param(po_orig_torename => [ @torename ]);
+ IkiWiki::cgi_savesession($session);
+
foreach my $rename (@torename) {
next unless istranslatable($rename->{src});
my %otherpages=%{otherlanguages($rename->{src})};
}
}
+sub canremove ($$$) {
+ my ($page, $cgi, $session) = (shift, shift, shift);
+
+ if (istranslation($page)) {
+ return gettext("Can not remove a translation. Removing the master page, ".
+ "though, removes its translations as well.");
+ }
+ return undef;
+}
+
+sub canrename ($$@) {
+ my ($cgi, $session) = (shift, shift);
+ my %params = @_;
+
+ if (istranslation($params{src})) {
+ my $masterpage = masterpage($params{src});
+ # Tell the difference between:
+ # - a translation being renamed as a consequence of its master page
+ # being renamed, which is allowed
+ # - a user trying to directly rename a translation, which is forbidden
+ # by looking for the master page in the list of to-be-renamed pages we
+ # saved early in the renaming process.
+ my $orig_torename = $session->param("po_orig_torename");
+ unless (scalar grep { $_->{src} eq $masterpage } @{$orig_torename}) {
+ return gettext("Can not rename a translation. Renaming the master page, ".
+ "though, renames its translations as well.");
+ }
+ }
+ return undef;
+}
+
# As we're previewing or saving a page, the content may have
# changed, so tell the next filter() invocation it must not be lazy.
sub editcontent () {