From 58c77a01f79efaa5692fd30231695c6f8775a7d9 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Wed, 15 Oct 2008 05:22:41 +0200 Subject: [PATCH] po plugin: create missing POT/PO files in needsbuild hook Signed-off-by: intrigeri --- IkiWiki/Plugin/po.pm | 41 +++++++++++++++++++++++++++++------------ doc/plugins/po.mdwn | 6 +++--- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 98c070481..43b36430f 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -96,10 +96,22 @@ sub checkconfig () { #{{{ push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/; } #}}} -sub refreshpot ($) { #{{{ +sub potfile ($) { #{{{ my $masterfile=shift; (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); - my $potfile=File::Spec->catfile($dir, $name . ".pot"); + return File::Spec->catfile($dir, $name . ".pot"); +} #}}} + +sub pofile ($$) { #{{{ + my $masterfile=shift; + my $lang=shift; + (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); + return File::Spec->catfile($dir, $name . "." . $lang . ".po"); +} #}}} + +sub refreshpot ($) { #{{{ + my $masterfile=shift; + my $potfile=potfile($masterfile); my %options = ("markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0); my $doc=Locale::Po4a::Chooser::new('text',%options); $doc->read($masterfile); @@ -114,8 +126,7 @@ sub refreshpofiles ($@) { #{{{ my $masterfile=shift; my @pofiles=@_; - (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); - my $potfile=File::Spec->catfile($dir, $name . ".pot"); + my $potfile=potfile($masterfile); error("[po/refreshpofiles] POT file ($potfile) does not exist") unless (-e $potfile); foreach my $pofile (@pofiles) { @@ -139,16 +150,22 @@ sub needsbuild () { #{{{ istranslation($page); } - # refresh POT and PO files as needed - foreach my $file (@$needsbuild) { - my $page=pagename($file); + # refresh/create POT and PO files as needed + foreach my $page (keys %pagesources) { + my $pageneedsbuild = grep { $_ eq $pagesources{$page} } @$needsbuild; if (istranslatable($page)) { - refreshpot(srcfile($file)); - my @pofiles; - foreach my $lang (keys %{$translations{$page}}) { - push @pofiles, $pagesources{$translations{$page}{$lang}}; + my $file=srcfile($pagesources{$page}); + if ($pageneedsbuild || ! -e potfile($file)) { + refreshpot($file); } - refreshpofiles(srcfile($file), map { srcfile($_) } @pofiles); + my @pofiles; + foreach my $lang (keys %{$config{po_slave_languages}}) { + my $pofile=pofile($file, $lang); + if ($pageneedsbuild || ! -e $pofile) { + push @pofiles, $pofile; + } + } + refreshpofiles($file, @pofiles) if (@pofiles); } } diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 4e7553a11..ab7fcb725 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -197,11 +197,11 @@ Committing changes to a "master" page: achieved by making any "slave" page dependent on the corresponding "master" page, in the `needsbuild` hook. -**FIXME** Also, when the plugin has just been enabled, or when a page +Also, when the plugin has just been enabled, or when a page has just been declared as being translatable: -- all the needed POT and PO files have to be created -- the PO files must be checked into version control +- all the needed POT and PO files are be created +- **FIXME** the PO files must be checked into version control **FIXME** `refreshpofiles` uses `system()`, whose args have to be checked more thoroughly to prevent any security issue (command