summaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/po.pm75
1 files changed, 71 insertions, 4 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 60a9f2632..d4280853f 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -35,6 +35,7 @@ sub import { #{{{
hook(type => "filter", id => "po", call => \&filter);
hook(type => "htmlize", id => "po", call => \&htmlize);
hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
+ hook(type => "renamepage", id => "po", call => \&renamepage);
hook(type => "delete", id => "po", call => \&mydelete);
hook(type => "change", id => "po", call => \&change);
hook(type => "editcontent", id => "po", call => \&editcontent);
@@ -326,15 +327,43 @@ sub pagetemplate (@) { #{{{
}
} # }}}
+# Save information about master page rename, so that:
+# - our delete hook can ignore the translations not renamed already
+# - our change hook can rename the translations accordingly.
+#
+# FIXME:
+# This hook is called once per page linking to the old page, which
+# means our delete hook won't know it should not delete a renamed orphan
+# page's translation.
+#
+# Moreover, we can't recognize such pages at delete stage:
+# existing links are fixed in the renaming process, so every
+# renamed page's old location will be an orphan anyway at this time.
+sub renamepage(@) { #{{{
+ my %params=@_;
+ my $oldpage=$params{oldpage};
+ my $newpage=$params{newpage};
+
+ setrenamed($oldpage, $newpage) if istranslatable($oldpage);
+ return $params{content};
+} #}}}
+
sub mydelete(@) { #{{{
my @deleted=@_;
- map { deletetranslations($_) } grep istranslatablefile($_), @deleted;
+ map {
+ deletetranslations($_);
+ } grep { istranslatablefile($_) && ! renamed(pagename($_))} @deleted;
} #}}}
sub change(@) { #{{{
my @rendered=@_;
+ my $eachrenamed=eachrenamed();
+ while (my ($oldpage, $newpage) = $eachrenamed->()) {
+ renametranslations($oldpage, $newpage);
+ }
+
my $updated_po_files=0;
# Refresh/create POT and PO files as needed.
@@ -373,6 +402,7 @@ sub change(@) { #{{{
}
# Reinitialize module's private variables.
resetalreadyfiltered();
+ resetrenamed();
resettranslationscache();
flushmemoizecache();
# Trigger a wiki refresh.
@@ -496,6 +526,34 @@ sub myurlto ($$;$) { #{{{
} #}}}
}
+{
+ my %renamed;
+
+ sub renamed ($) { #{{{
+ my $page=shift;
+
+ if (exists $renamed{$page} &&
+ defined $renamed{$page}) {
+ return $renamed{$page};
+ }
+ return;
+ } #}}}
+
+ sub setrenamed ($$) { #{{{
+ my $oldpage=shift;
+ my $newpage=shift;
+
+ $renamed{$oldpage}=$newpage;
+ } #}}}
+
+ sub resetrenamed () { #{{{
+ undef %renamed;
+ } #}}}
+
+ sub eachrenamed () { #{{{
+ return sub { each %renamed };
+ } #}}}
+}
# ,----
# | Helper functions
@@ -764,13 +822,22 @@ sub homepageurl (;$) { #{{{
return urlto('', $page);
} #}}}
-# do *not* implement this until the renamepage hook works
+# - do *not* implement this until the renamepage hook works
+# - do *not* delete translations of pages that were orphans
+# before being renamed (see renamepage hook comments above)
sub deletetranslations ($) { #{{{
- my $file=shift;
+ my $deletedmasterfile=shift;
+
+ debug "po(deletetranslations): TODO: delete translations of $deletedmasterfile";
+} #}}}
+
+sub renametranslations (@) { #{{{
+ my ($oldpage, $newpage)=shift;
- debug 'po(deletetranslations): TODO: delete translations of ' . $file;
+ debug "po(renametranslations): TODO: rename translations of $oldpage to $newpage";
} #}}}
+
# ,----
# | PageSpec's
# `----