X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/38cdda66d7d318918aab13b5e3b8dbfebc9ffd1c..a7d329c17312348d7511b48523fb54c18f8d4736:/IkiWiki/Plugin/po.pm diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 8ea852d04..2ffccb7e0 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -21,7 +21,6 @@ use UNIVERSAL; my %translations; my @origneedsbuild; -our %filtered; memoize("_istranslation"); memoize("percenttranslated"); @@ -99,8 +98,8 @@ sub getsetup () { #{{{ } #}}} sub islanguagecode ($) { #{{{ - my $code=shift; - return ($code =~ /^[a-z]{2}$/); + my $code=shift; + return ($code =~ /^[a-z]{2}$/); } #}}} sub checkconfig () { #{{{ @@ -146,10 +145,10 @@ sub otherlanguages($) { #{{{ %ret = %{$translations{$page}}; } elsif (istranslation($page)) { - my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); + my $masterpage = masterpage($page); $ret{$config{po_master_language}{code}} = $masterpage; foreach my $lang (sort keys %{$translations{$masterpage}}) { - next if $lang eq $curlang; + next if $lang eq lang($page); $ret{$lang} = $translations{$masterpage}{$lang}; } } @@ -252,7 +251,6 @@ sub scan (@) { #{{{ return unless UNIVERSAL::can("IkiWiki::Plugin::link", "import"); if (istranslation($page)) { - my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); foreach my $destpage (@{$links{$page}}) { if (istranslatable($destpage)) { # replace one occurence of $destpage in $links{$page} @@ -261,7 +259,7 @@ sub scan (@) { #{{{ # there for other reasons) for (my $i=0; $i<@{$links{$page}}; $i++) { if (@{$links{$page}}[$i] eq $destpage) { - @{$links{$page}}[$i] = $destpage . '.' . $curlang; + @{$links{$page}}[$i] = $destpage . '.' . lang($page); last; } } @@ -284,7 +282,7 @@ sub mytargetpage ($$) { #{{{ my $ext=shift; if (istranslation($page)) { - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); + my ($masterpage, $lang) = (masterpage($page), lang($page)); if (! $config{usedirs} || $masterpage eq 'index') { return $masterpage . "." . $lang . "." . $ext; } @@ -334,8 +332,7 @@ sub myurlto ($$;$) { #{{{ && $config{po_link_to} eq "current" && istranslation($from) && istranslatable('index')) { - my ($masterpage, $curlang) = ($from =~ /(.*)[.]([a-z]{2})$/); - return IkiWiki::beautify_urlpath(IkiWiki::baseurl($from) . "index." . $curlang . ".$config{htmlext}"); + return IkiWiki::beautify_urlpath(IkiWiki::baseurl($from) . "index." . lang($from) . ".$config{htmlext}"); } return $origsubs{'urlto'}->($to,$from,$absolute); } #}}} @@ -349,8 +346,7 @@ sub mybestlink ($$) { #{{{ if ($config{po_link_to} eq "current" && istranslatable($res) && istranslation($page)) { - my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); - return $res . "." . $curlang; + return $res . "." . lang($page); } else { return $res; @@ -359,30 +355,38 @@ sub mybestlink ($$) { #{{{ return ""; } #}}} -sub alreadyfiltered($$) { #{{{ - my $page=shift; - my $destpage=shift; +# blackbox for %filtered +{ + my %filtered; - return ( exists $filtered{$page}{$destpage} - && $filtered{$page}{$destpage} eq 1 ); -} #}}} -sub setalreadyfiltered($$) { #{{{ - my $page=shift; - my $destpage=shift; + sub alreadyfiltered($$) { #{{{ + my $page=shift; + my $destpage=shift; - $filtered{$page}{$destpage}=1; -} #}}} -sub unsetalreadyfiltered($$) { #{{{ - my $page=shift; - my $destpage=shift; + return ( exists $filtered{$page}{$destpage} + && $filtered{$page}{$destpage} eq 1 ); + } #}}} - if (exists $filtered{$page}{$destpage}) { - delete $filtered{$page}{$destpage}; - } -} #}}} -sub resetalreadyfiltered() { #{{{ - undef %filtered; -} #}}} + 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. @@ -419,8 +423,7 @@ sub filter (@) { #{{{ writefile(basename($infile), File::Spec->tmpdir, $content); - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - my $masterfile = srcfile($pagesources{$masterpage}); + my $masterfile = srcfile($pagesources{masterpage($page)}); my (@pos,@masters); push @pos,$infile; push @masters,$masterfile; @@ -451,8 +454,7 @@ sub htmlize (@) { #{{{ my $page = $params{page}; my $content = $params{content}; - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - my $masterfile = srcfile($pagesources{$masterpage}); + my $masterfile = srcfile($pagesources{masterpage($page)}); # force content to be htmlize'd as if it was the same type as the master page return IkiWiki::htmlize($page, $page, pagetype($masterfile), $content); @@ -461,10 +463,9 @@ sub htmlize (@) { #{{{ sub percenttranslated ($) { #{{{ my $page=shift; - return gettext("N/A") unless (istranslation($page)); - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); + return gettext("N/A") unless istranslation($page); my $file=srcfile($pagesources{$page}); - my $masterfile = srcfile($pagesources{$masterpage}); + my $masterfile = srcfile($pagesources{masterpage($page)}); my (@pos,@masters); push @pos,$file; push @masters,$masterfile; @@ -482,39 +483,44 @@ sub percenttranslated ($) { #{{{ return $percent; } #}}} +sub languagename ($) { #{{{ + my $code=shift; + + return $config{po_master_language}{name} + if $code eq $config{po_master_language}{code}; + return $config{po_slave_languages}{$code} + if defined $config{po_slave_languages}{$code}; + return; +} #}}} + sub otherlanguagesloop ($) { #{{{ my $page=shift; my @ret; - if (istranslatable($page)) { - foreach my $lang (sort keys %{$translations{$page}}) { - my $translation = $translations{$page}{$lang}; + my %otherpages=%{otherlanguages($page)}; + while (my ($lang, $otherpage) = each %otherpages) { + if (istranslation($page) && masterpage($page) eq $otherpage) { push @ret, { - url => urlto($translation, $page), + url => urlto_with_orig_beautiful_urlpath($otherpage, $page), code => $lang, - language => $config{po_slave_languages}{$lang}, - percent => percenttranslated($translation), + language => languagename($lang), + master => 1, }; } - } - elsif (istranslation($page)) { - my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); - push @ret, { - url => urlto_with_orig_beautiful_urlpath($masterpage, $page), - code => $config{po_master_language}{code}, - language => $config{po_master_language}{name}, - master => 1, - }; - foreach my $lang (sort keys %{$translations{$masterpage}}) { + else { push @ret, { - url => urlto($translations{$masterpage}{$lang}, $page), + url => urlto($otherpage, $page), code => $lang, - language => $config{po_slave_languages}{$lang}, - percent => percenttranslated($translations{$masterpage}{$lang}), - } unless ($lang eq $curlang); + language => languagename($lang), + percent => percenttranslated($otherpage), + } } } - return @ret; + return sort { + return -1 if $a->{code} eq $config{po_master_language}{code}; + return 1 if $b->{code} eq $config{po_master_language}{code}; + return $a->{language} cmp $b->{language}; + } @ret; } #}}} sub pagetemplate (@) { #{{{ @@ -523,13 +529,13 @@ sub pagetemplate (@) { #{{{ my $destpage=$params{destpage}; my $template=$params{template}; - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/) if istranslation($page); + my ($masterpage, $lang) = istranslation($page); if (istranslation($page) && $template->query(name => "percenttranslated")) { $template->param(percenttranslated => percenttranslated($page)); } if ($template->query(name => "istranslation")) { - $template->param(istranslation => istranslation($page)); + $template->param(istranslation => scalar istranslation($page)); } if ($template->query(name => "istranslatable")) { $template->param(istranslatable => istranslatable($page)); @@ -657,18 +663,35 @@ sub _istranslation ($) { #{{{ return 0; } - return istranslatable($masterpage); + return ($masterpage, $lang) if istranslatable($masterpage); } #}}} sub istranslation ($) { #{{{ my $page=shift; - if (_istranslation($page)) { - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); + if (1 < (my ($masterpage, $lang) = _istranslation($page))) { $translations{$masterpage}{$lang}=$page unless exists $translations{$masterpage}{$lang}; - return 1; + return ($masterpage, $lang); } - return 0; + return; +} #}}} + +sub masterpage ($) { #{{{ + my $page=shift; + + if ( 1 < (my ($masterpage, $lang) = _istranslation($page))) { + return $masterpage; + } + return $page; +} #}}} + +sub lang ($) { #{{{ + my $page=shift; + + if (1 < (my ($masterpage, $lang) = _istranslation($page))) { + return $lang; + } + return $config{po_master_language}{code}; } #}}} package IkiWiki::PageSpec; @@ -703,16 +726,7 @@ sub match_lang ($$;@) { #{{{ my $wanted=shift; my $regexp=IkiWiki::glob2re($wanted); - my $lang; - my $masterpage; - - if (IkiWiki::Plugin::po::istranslation($page)) { - ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - } - else { - $lang = $config{po_master_language}{code}; - } - + my $lang=IkiWiki::Plugin::po::lang($page); if ($lang!~/^$regexp$/i) { return IkiWiki::FailReason->new("file language is $lang, not $wanted"); } @@ -723,26 +737,13 @@ sub match_lang ($$;@) { #{{{ sub match_currentlang ($$;@) { #{{{ my $page=shift; - shift; my %params=@_; - my ($currentmasterpage, $currentlang, $masterpage, $lang); return IkiWiki::FailReason->new("no location provided") unless exists $params{location}; - if (IkiWiki::Plugin::po::istranslation($params{location})) { - ($currentmasterpage, $currentlang) = ($params{location} =~ /(.*)[.]([a-z]{2})$/); - } - else { - $currentlang = $config{po_master_language}{code}; - } - - if (IkiWiki::Plugin::po::istranslation($page)) { - ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - } - else { - $lang = $config{po_master_language}{code}; - } + my $currentlang=IkiWiki::Plugin::po::lang($params{location}); + my $lang=IkiWiki::Plugin::po::lang($page); if ($lang eq $currentlang) { return IkiWiki::SuccessReason->new("file language is the same as current one, i.e. $currentlang");