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 => "rename", id => "po", call => \&renamepages);
hook(type => "delete", id => "po", call => \&mydelete);
hook(type => "change", id => "po", call => \&change);
hook(type => "editcontent", id => "po", call => \&editcontent);
}
} # }}}
+# Add the renamed page translations to the list of to-be-renamed pages.
+# 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.
+sub renamepages() { #{{{
+ my $torename=shift;
+ my @torename=@{$torename};
+
+ foreach my $rename (@torename) {
+ next unless istranslatable($rename->{src});
+ my %otherpages=%{otherlanguages($rename->{src})};
+ while (my ($lang, $otherpage) = each %otherpages) {
+ push @{$torename}, {
+ src => $otherpage,
+ srcfile => $pagesources{$otherpage},
+ dest => otherlanguage($rename->{dest}, $lang),
+ destfile => $rename->{dest}.".".$lang.".po",
+ required => 0,
+ };
+ }
+ }
+} #}}}
+
sub mydelete(@) { #{{{
my @deleted=@_;
- map { deletetranslations($_) } grep istranslatablefile($_), @deleted;
+ map {
+ deletetranslations($_);
+ } grep { istranslatablefile($_) } @deleted;
} #}}}
sub change(@) { #{{{
}
if ($updated_po_files) {
- # Check staged changes in.
- if ($config{rcs}) {
- IkiWiki::disable_commit_hook();
- IkiWiki::rcs_commit_staged(gettext("updated PO files"),
- "IkiWiki::Plugin::po::change", "127.0.0.1");
- IkiWiki::enable_commit_hook();
- IkiWiki::rcs_update();
- }
- # Reinitialize module's private variables.
- resetalreadyfiltered();
- resettranslationscache();
- flushmemoizecache();
- # Trigger a wiki refresh.
- require IkiWiki::Render;
- # without preliminary saveindex/loadindex, refresh()
- # complains about a lot of uninitialized variables
- IkiWiki::saveindex();
- IkiWiki::loadindex();
- IkiWiki::refresh();
- IkiWiki::saveindex();
+ commit_and_refresh(
+ gettext("updated PO files"),
+ "IkiWiki::Plugin::po::change");
}
} #}}}
} #}}}
}
-
# ,----
# | Helper functions
# `----
return urlto('', $page);
} #}}}
-# do *not* implement this until the renamepage hook works
sub deletetranslations ($) { #{{{
- my $file=shift;
+ my $deletedmasterfile=shift;
+
+ my $deletedmasterpage=pagename($deletedmasterfile);
+ my @todelete;
+ map {
+ my $file = newpagefile($deletedmasterpage.'.'.$_, 'po');
+ my $absfile = "$config{srcdir}/$file";
+ if (-e $absfile && ! -l $absfile && ! -d $absfile) {
+ push @todelete, $file;
+ }
+ } keys %{$config{po_slave_languages}};
- debug 'po(deletetranslations): TODO: delete translations of ' . $file;
+ map {
+ if ($config{rcs}) {
+ IkiWiki::rcs_remove($_);
+ }
+ else {
+ IkiWiki::prune("$config{srcdir}/$_");
+ }
+ } @todelete;
+
+ if (scalar @todelete) {
+ commit_and_refresh(
+ gettext("removed obsolete PO files"),
+ "IkiWiki::Plugin::po::deletetranslations");
+ }
+} #}}}
+
+sub commit_and_refresh ($$) { #{{{
+ my ($msg, $author) = (shift, shift);
+
+ if ($config{rcs}) {
+ IkiWiki::disable_commit_hook();
+ IkiWiki::rcs_commit_staged($msg, $author, "127.0.0.1");
+ IkiWiki::enable_commit_hook();
+ IkiWiki::rcs_update();
+ }
+ # Reinitialize module's private variables.
+ resetalreadyfiltered();
+ resettranslationscache();
+ flushmemoizecache();
+ # Trigger a wiki refresh.
+ require IkiWiki::Render;
+ # without preliminary saveindex/loadindex, refresh()
+ # complains about a lot of uninitialized variables
+ IkiWiki::saveindex();
+ IkiWiki::loadindex();
+ IkiWiki::refresh();
+ IkiWiki::saveindex();
} #}}}
# ,----