X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/c36d2fa896e9ea42c0b6b0135ba04b4f4f60950f..ac3aac560f74457ded48ba3b5a14d0bbbf9b6d92:/IkiWiki/Plugin/po.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 792d84261..2cbfb0a45 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -51,6 +51,8 @@ sub import { hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1); hook(type => "formbuilder", id => "po", call => \&formbuilder); + $origsubs{'bestlink'}=\&IkiWiki::bestlink; + inject(name => "IkiWiki::bestlink", call => \&mybestlink); $origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath; inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath); $origsubs{'targetpage'}=\&IkiWiki::targetpage; @@ -83,7 +85,8 @@ sub getsetup () { return plugin => { safe => 0, - rebuild => 1, + rebuild => 1, # format plugin + section => "format", }, po_master_language => { type => "string", @@ -153,12 +156,6 @@ sub checkconfig () { warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default')); $config{po_link_to}='default'; } - unless ($config{po_link_to} eq 'default') { - if (! exists $origsubs{'bestlink'}) { - $origsubs{'bestlink'}=\&IkiWiki::bestlink; - inject(name => "IkiWiki::bestlink", call => \&mybestlink); - } - } push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/; @@ -390,31 +387,32 @@ sub change (@) { resetalreadyfiltered(); require IkiWiki::Render; foreach my $file (@rendered) { - debug(sprintf(gettext("building %s"), $file)); - IkiWiki::render($file); + IkiWiki::render($file, sprintf(gettext("building %s"), $file)); } } my $updated_po_files=0; # Refresh/create POT and PO files as needed. - # (But avoid doing so if they are in an underlay directory.) foreach my $file (grep {istranslatablefile($_)} @rendered) { my $masterfile=srcfile($file); my $page=pagename($file); my $updated_pot_file=0; + + # Avoid touching underlay files. + next if $masterfile ne "$config{srcdir}/$file"; + # Only refresh POT file if it does not exist, or if - # $pagesources{$page} was changed: don't if only the HTML was + # the source was changed: don't if only the HTML was # refreshed, e.g. because of a dependency. - if ($masterfile eq "$config{srcdir}/$file" && - ((grep { $_ eq $pagesources{$page} } @origneedsbuild) - || ! -e potfile($masterfile))) { + if ((grep { $_ eq $pagesources{$page} } @origneedsbuild) || + ! -e potfile($masterfile)) { refreshpot($masterfile); $updated_pot_file=1; } my @pofiles; foreach my $po (pofiles($masterfile)) { - next if ! $updated_pot_file && ! -e $po; + next if ! $updated_pot_file && -e $po; next if grep { $po=~/\Q$_\E/ } @{$config{underlaydirs}}; push @pofiles, $po; } @@ -562,11 +560,13 @@ sub formbuilder (@) { # `---- # Implement po_link_to 'current' and 'negotiated' settings. -# Not injected otherwise. sub mybestlink ($$) { my $page=shift; my $link=shift; + return $origsubs{'bestlink'}->($page, $link) + if $config{po_link_to} eq "default"; + my $res=$origsubs{'bestlink'}->(masterpage($page), $link); my @caller = caller(1); if (length $res @@ -1058,11 +1058,8 @@ sub commit_and_refresh ($$) { IkiWiki::saveindex(); } -# on success, returns the filtered content. -# on error, if $nonfatal, warn and return undef; else, error out. -sub po_to_markup ($$;$) { +sub po_to_markup ($$) { my ($page, $content) = (shift, shift); - my $nonfatal = shift; $content = '' unless defined $content; $content = decode_utf8(encode_utf8($content)); @@ -1085,10 +1082,6 @@ sub po_to_markup ($$;$) { my $fail = sub ($) { my $msg = "po(po_to_markup) - $page : " . shift; - if ($nonfatal) { - warn $msg; - return undef; - } error($msg, sub { unlink $infile, $outfile}); }; @@ -1109,8 +1102,7 @@ sub po_to_markup ($$;$) { $doc->write($outfile) or return $fail->(sprintf(gettext("failed to write %s"), $outfile)); - $content = readfile($outfile) - or return $fail->(sprintf(gettext("failed to read %s"), $outfile)); + $content = readfile($outfile); # Unlinking should happen automatically, thanks to File::Temp, # but it does not work here, probably because of the way writefile()