summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/po.pm
diff options
context:
space:
mode:
authorintrigeri <intrigeri@boum.org>2008-11-06 15:54:55 +0100
committerintrigeri <intrigeri@boum.org>2008-11-06 15:54:55 +0100
commit8b001dbb00d702fad648c0f313b0d1d6a3827325 (patch)
tree1a1124c1b1eca5ab45d2393a9ae41f4c5f1b1d44 /IkiWiki/Plugin/po.pm
parentc8cc03c824b7a9e6a091192291a40246dbef3b2f (diff)
po: redesign (once more) automatic POT/PO files update
Now use the change hook to update these files, check them into VCS, and trigger IkiWiki::refresh as needed. The needsbuild hook's help was required to prevent infinite looping. This more rigorous way of doing this fixes recentchanges (that was previously not updated in some cases), and probably is a better long-term solution than the two previously tested ones. Signed-off-by: intrigeri <intrigeri@boum.org>
Diffstat (limited to 'IkiWiki/Plugin/po.pm')
-rw-r--r--IkiWiki/Plugin/po.pm107
1 files changed, 58 insertions, 49 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index cfba83995..c8ec37c22 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -19,6 +19,7 @@ use File::Temp;
use Memoize;
my %translations;
+my @origneedsbuild;
our %filtered;
memoize("_istranslation");
@@ -38,6 +39,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 => "change", id => "po", call => \&change);
hook(type => "editcontent", id => "po", call => \&editcontent);
$origsubs{'bestlink'}=\&IkiWiki::bestlink;
@@ -103,6 +105,9 @@ sub checkconfig () { #{{{
error(sprintf(gettext("Must specify %s"), $field));
}
}
+ if (! (keys %{$config{po_slave_languages}})) {
+ error(gettext("At least one slave language must be defined in po_slave_languages"));
+ }
map {
islanguagecode($_)
or error(sprintf(gettext("%s is not a valid language code"), $_));
@@ -191,56 +196,12 @@ sub refreshpofiles ($@) { #{{{
sub needsbuild () { #{{{
my $needsbuild=shift;
- # build %translations, using istranslation's side-effect
- foreach my $page (keys %pagesources) {
- istranslation($page);
- }
-
- # refresh/create POT and PO files as needed
- my $updated_po_files=0;
- foreach my $page (keys %pagesources) {
- if (istranslatable($page)) {
- my $pageneedsbuild = grep { $_ eq $pagesources{$page} } @$needsbuild;
- my $updated_pot_file=0;
- my $file=srcfile($pagesources{$page});
- if ($pageneedsbuild || ! -e potfile($file)) {
- refreshpot($file);
- $updated_pot_file=1;
- }
- my @pofiles;
- foreach my $lang (keys %{$config{po_slave_languages}}) {
- my $pofile=pofile($file, $lang);
- my $pofile_rel=pofile($pagesources{$page}, $lang);
- if ($pageneedsbuild || $updated_pot_file || ! -e $pofile) {
- push @pofiles, $pofile;
- push @$needsbuild, $pofile_rel
- unless grep { $_ eq $pofile_rel } @$needsbuild;
- }
- }
- if (@pofiles) {
- refreshpofiles($file, @pofiles);
- map { IkiWiki::rcs_add($_); } @pofiles if ($config{rcs});
- $updated_po_files = 1;
- }
- }
- }
+ # backup @needsbuild content so that change() can know whether
+ # a given master page was rendered because its source file was changed
+ @origneedsbuild=(@$needsbuild);
- # check staged changes in
- if ($updated_po_files) {
- if ($config{rcs}) {
- IkiWiki::disable_commit_hook();
- IkiWiki::rcs_commit_staged(gettext("updated PO files"),
- "refreshpofiles", "127.0.0.1");
- IkiWiki::enable_commit_hook();
- IkiWiki::rcs_update();
- }
- # refresh module's private variables
- undef %filtered;
- undef %translations;
- foreach my $page (keys %pagesources) {
- istranslation($page);
- }
- }
+ # build %translations, using istranslation's side-effect
+ map istranslation($_), (keys %pagesources);
# make existing translations depend on the corresponding master page
foreach my $master (keys %translations) {
@@ -504,6 +465,54 @@ sub pagetemplate (@) { #{{{
}
} # }}}
+sub change(@) { #{{{
+ my @rendered=@_;
+
+ my $updated_po_files=0;
+
+ # Refresh/create POT and PO files as needed.
+ foreach my $page (map pagename($_), @rendered) {
+ next unless istranslatable($page);
+ my $file=srcfile($pagesources{$page});
+ my $updated_pot_file=0;
+ if ((grep { $_ eq $pagesources{$page} } @origneedsbuild)
+ || ! -e potfile($file)) {
+ refreshpot($file);
+ $updated_pot_file=1;
+ }
+ my @pofiles;
+ foreach my $lang (keys %{$config{po_slave_languages}}) {
+ my $pofile=pofile($file, $lang);
+ if ($updated_pot_file || ! -e $pofile) {
+ push @pofiles, $pofile;
+ }
+ }
+ if (@pofiles) {
+ refreshpofiles($file, @pofiles);
+ map { IkiWiki::rcs_add($_); } @pofiles if ($config{rcs});
+ $updated_po_files=1;
+ }
+ }
+
+ 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.
+ undef %filtered;
+ undef %translations;
+ # Trigger a wiki refresh.
+ require IkiWiki::Render;
+ IkiWiki::refresh();
+ IkiWiki::saveindex();
+ }
+} #}}}
+
sub editcontent () { #{{{
my %params=@_;
# as we're previewing or saving a page, the content may have