my $potfile=potfile($masterfile);
my %options = ("markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0);
my $doc=Locale::Po4a::Chooser::new('text',%options);
- $doc->read($masterfile);
$doc->{TT}{utf_mode} = 1;
$doc->{TT}{file_in_charset} = 'utf-8';
$doc->{TT}{file_out_charset} = 'utf-8';
+ $doc->read($masterfile);
# let's cheat a bit to force porefs option to be passed to Locale::Po4a::Po;
# this is undocument use of internal Locale::Po4a::TransTractor's data,
# compulsory since this module prevents us from using the porefs option.
}
} #}}}
+sub buildtranslationscache() { #{{{
+ # use istranslation's side-effect
+ map istranslation($_), (keys %pagesources);
+} #}}}
+
+sub resettranslationscache() { #{{{
+ undef %translations;
+} #}}}
+
sub needsbuild () { #{{{
my $needsbuild=shift;
# a given master page was rendered because its source file was changed
@origneedsbuild=(@$needsbuild);
- # build %translations, using istranslation's side-effect
- map istranslation($_), (keys %pagesources);
+ buildtranslationscache();
# make existing translations depend on the corresponding master page
foreach my $master (keys %translations) {
my $content=$params{content};
return unless UNIVERSAL::can("IkiWiki::Plugin::link", "import");
- return unless $config{'po_link_to'} eq 'negotiated';
if (istranslation($page)) {
my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/);
return "";
} #}}}
+sub alreadyfiltered($$) { #{{{
+ my $page=shift;
+ my $destpage=shift;
+
+ return ( exists $filtered{$page}{$destpage}
+ && $filtered{$page}{$destpage} eq 1 );
+} #}}}
+sub setalreadyfiltered($$) { #{{{
+ my $page=shift;
+ my $destpage=shift;
+
+ $filtered{$page}{$destpage}=1;
+} #}}}
+sub unsetalreadyfiltered($$) { #{{{
+ my $page=shift;
+ my $destpage=shift;
+
+ if (exists $filtered{$page}{$destpage}) {
+ delete $filtered{$page}{$destpage};
+ }
+} #}}}
+sub resetalreadyfiltered() { #{{{
+ undef %filtered;
+} #}}}
+
# We use filter to convert PO to the master page's format,
# since the rest of ikiwiki should not work on PO files.
sub filter (@) { #{{{
my $content = decode_utf8(encode_utf8($params{content}));
return $content if ( ! istranslation($page)
- || ( exists $filtered{$page}{$destpage}
- && $filtered{$page}{$destpage} eq 1 ));
+ || alreadyfiltered($page, $destpage) );
# CRLF line terminators make poor Locale::Po4a feel bad
$content=~s/\r\n/\n/g;
'file_in_name' => \@masters,
'file_in_charset' => 'utf-8',
'file_out_charset' => 'utf-8',
- ) or error("[po/filter:$infile]: failed to translate");
- $doc->write($outfile) or error("[po/filter:$infile] could not write $outfile");
- $content = readfile($outfile) or error("[po/filter:$infile] could not read $outfile");
+ ) or error("[po/filter:$page]: failed to translate");
+ $doc->write($outfile) or error("[po/filter:$page] could not write $outfile");
+ $content = readfile($outfile) or error("[po/filter:$page] could not read $outfile");
# Unlinking should happen automatically, thanks to File::Temp,
# but it does not work here, probably because of the way writefile()
# and Locale::Po4a::write() work.
unlink $infile, $outfile;
- $filtered{$page}{$destpage}=1;
+ setalreadyfiltered($page, $destpage);
return $content;
} #}}}
'file_in_name' => \@masters,
'file_in_charset' => 'utf-8',
'file_out_charset' => 'utf-8',
- ) or error("[po/percenttranslated:$file]: failed to translate");
+ ) or error("[po/percenttranslated:$page]: failed to translate");
my ($percent,$hit,$queries) = $doc->stats();
return $percent;
} #}}}
elsif (istranslation($page)) {
add_depends($page, $masterpage);
foreach my $translation (values %{$translations{$masterpage}}) {
- add_depends($page, $translation);
+ add_depends($page, $translation) unless $page eq $translation;
}
}
}
linktext => gettext("Discussion"),
));
}
- # remove broken parentlink to ./index.html on home page's translations
+ # Remove broken parentlink to ./index.html on home page's translations.
+ # It works because this hook has the "last" parameter set, to ensure it
+ # runs after parentlinks' own pagetemplate hook.
if ($template->param('parentlinks')
&& istranslation($page)
&& $masterpage eq "index") {
next unless istranslatable($page);
my $file=srcfile($pagesources{$page});
my $updated_pot_file=0;
+ # Only refresh Pot file if it does not exist, or if
+ # $pagesources{$page} was changed: don't if only the HTML was
+ # refreshed, e.g. because of a dependency.
if ((grep { $_ eq $pagesources{$page} } @origneedsbuild)
|| ! -e potfile($file)) {
refreshpot($file);
IkiWiki::rcs_update();
}
# Reinitialize module's private variables.
- undef %filtered;
- undef %translations;
+ resetalreadyfiltered();
+ resettranslationscache();
# Trigger a wiki refresh.
require IkiWiki::Render;
IkiWiki::refresh();
my %params=@_;
# as we're previewing or saving a page, the content may have
# changed, so tell the next filter() invocation it must not be lazy
- if (exists $filtered{$params{page}}{$params{page}}) {
- delete $filtered{$params{page}}{$params{page}};
- }
+ unsetalreadyfiltered($params{page}, $params{page});
return $params{content};
} #}}}