diff options
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/po.pm | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 2dad3b60b..18bc99909 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -36,7 +36,7 @@ sub import { 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); @@ -347,10 +347,24 @@ sub postscan (@) { } # 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; + + # 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})}; @@ -422,8 +436,18 @@ sub canrename ($$$) { my ($page, $cgi, $session) = (shift, shift, shift); if (istranslation($page)) { - return gettext("Can not rename a translation. Renaming the master page,". - "though, renames its translations as well."); + my $masterpage = masterpage($page); + # 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; } |