]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/po.pm
Pass src, srcfile, dest and destfile to the canrename hook.
[ikiwiki.git] / IkiWiki / Plugin / po.pm
index 2dad3b60b898c5e1a3a8b3fb838413fda21b2dfa..c0c7557e461e9dba79b955d18c4c2c2d8046c310 100644 (file)
@@ -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, 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})};
@@ -412,18 +426,29 @@ sub canremove ($$$) {
        my ($page, $cgi, $session) = (shift, shift, shift);
 
        if (istranslation($page)) {
-               return gettext("Can not remove a translation. Removing the master page,".
+               return gettext("Can not remove a translation. Removing the master page, ".
                               "though, removes its translations as well.");
        }
        return undef;
 }
 
-sub canrename ($$$) {
-       my ($page, $cgi, $session) = (shift, shift, shift);
+sub canrename ($$@) {
+       my ($cgi, $session) = (shift, shift);
+       my %params = @_;
 
-       if (istranslation($page)) {
-               return gettext("Can not rename a translation. Renaming the master page,".
-                              "though, renames its translations as well.");
+       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;
 }