From: intrigeri Date: Sun, 11 Jul 2010 08:46:18 +0000 (+0200) Subject: Merge remote branch 'upstream/master' into prv/po X-Git-Tag: 3.20100722~8^2~8^2~5 X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/c99d26030e6ddd7a21932e98e40a8df7d896886d?ds=inline;hp=-c Merge remote branch 'upstream/master' into prv/po Conflicts: IkiWiki/Plugin/po.pm doc/plugins/po.mdwn --- c99d26030e6ddd7a21932e98e40a8df7d896886d diff --combined IkiWiki.pm index 7b5fd283d,701f7137d..f9a30a202 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@@ -441,6 -441,13 +441,13 @@@ sub getsetup () safe => 0, rebuild => 0, }, + wrapper_background_command => { + type => "internal", + default => '', + description => "background shell command to run", + safe => 0, + rebuild => 0, + }, gettime => { type => "internal", description => "running in gettime mode", @@@ -1074,13 -1081,6 +1081,13 @@@ sub urlto ($$;$) return beautify_urlpath($link); } +sub isselflink ($$) { + my $page=shift; + my $link=shift; + + return $page eq $link; +} + sub htmllink ($$$;@) { my $lpage=shift; # the page doing the linking my $page=shift; # the page that will contain the link (different for inline) @@@ -1106,7 -1106,7 +1113,7 @@@ } return "$linktext" - if length $bestlink && $page eq $bestlink && + if length $bestlink && isselflink($page, $bestlink) && ! defined $opts{anchor}; if (! $destsources{$bestlink}) { @@@ -1396,16 -1396,14 +1403,16 @@@ sub preprocess ($$$;$$) return $content; } -sub filter ($$$) { +sub filter ($$$;$) { my $page=shift; my $destpage=shift; my $content=shift; + my $fullpage=shift; + $fullpage = 0 unless defined $fullpage; run_hooks(filter => sub { $content=shift->(page => $page, destpage => $destpage, - content => $content); + content => $content, fullpage => $fullpage); }); return $content; diff --combined IkiWiki/Plugin/po.pm index 29945da33,4e6eff94f..cadc13ba1 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@@ -28,7 -28,6 +28,7 @@@ use UNIVERSAL my %translations; my @origneedsbuild; my %origsubs; +my @slavelanguages; # orderer as in config po_slave_languages memoize("istranslatable"); memoize("_istranslation"); @@@ -65,8 -64,6 +65,8 @@@ sub import inject(name => "IkiWiki::cgiurl", call => \&mycgiurl); $origsubs{'rootpage'}=\&IkiWiki::rootpage; inject(name => "IkiWiki::rootpage", call => \&myrootpage); + $origsubs{'isselflink'}=\&IkiWiki::isselflink; + inject(name => "IkiWiki::isselflink", call => \&myisselflink); } } @@@ -105,11 -102,11 +105,11 @@@ sub getsetup () }, po_slave_languages => { type => "string", - example => { + example => [ 'fr' => 'Français', 'es' => 'Español', 'de' => 'Deutsch' - }, + ], description => "slave languages (PO files)", safe => 1, rebuild => 1, @@@ -138,21 -135,6 +138,21 @@@ sub checkconfig () $field, 'po')); } } + + if (ref $config{po_slave_languages} eq 'ARRAY') { + my %slaves; + for (my $i=0; $i<@{$config{po_slave_languages}}; $i = $i + 2) { + $slaves{$config{po_slave_languages}->[$i]} = $config{po_slave_languages}->[$i + 1]; + push @slavelanguages, $config{po_slave_languages}->[$i]; + } + $config{po_slave_languages} = \%slaves; + } + elsif (ref $config{po_slave_languages} eq 'HASH') { + @slavelanguages = sort { + $config{po_slave_languages}->{$a} cmp $config{po_slave_languages}->{$b}; + } keys %{$config{po_slave_languages}}; + } + delete $config{po_slave_languages}{$config{po_master_language}{code}};; map { @@@ -213,7 -195,7 +213,7 @@@ sub needsbuild () # make existing translations depend on the corresponding master page foreach my $master (keys %translations) { - map add_depends($_, $master), values %{otherlanguages($master)}; + map add_depends($_, $master), values %{otherlanguages_pages($master)}; } } @@@ -245,7 -227,7 +245,7 @@@ sub scan (@) # make sure any destpage's translations has # $page in its backlinks push @{$links{$page}}, - values %{otherlanguages($destpage)}; + values %{otherlanguages_pages($destpage)}; } } } @@@ -259,12 -241,6 +259,12 @@@ sub filter (@) my $page = $params{page}; my $destpage = $params{destpage}; my $content = $params{content}; + my $fullpage = $params{fullpage}; + + unless ($fullpage) { + return $content; + } + if (istranslation($page) && ! alreadyfiltered($page, $destpage)) { $content = po_to_markup($page, $content); setalreadyfiltered($page, $destpage); @@@ -309,7 -285,7 +309,7 @@@ sub pagetemplate (@) } if ($template->query(name => "otherlanguages")) { $template->param(otherlanguages => [otherlanguagesloop($page)]); - map add_depends($page, $_), (values %{otherlanguages($page)}); + map add_depends($page, $_), (values %{otherlanguages_pages($page)}); } if ($config{discussion} && istranslation($page)) { if ($page !~ /.*\/\Q$config{discussionpage}\E$/i && @@@ -362,12 -338,12 +362,12 @@@ sub renamepages (@) return () unless istranslatable($torename{src}); my @ret; - my %otherpages=%{otherlanguages($torename{src})}; + my %otherpages=%{otherlanguages_pages($torename{src})}; while (my ($lang, $otherpage) = each %otherpages) { push @ret, { src => $otherpage, srcfile => $pagesources{$otherpage}, - dest => otherlanguage($torename{dest}, $lang), + dest => otherlanguage_page($torename{dest}, $lang), destfile => $torename{dest}.".".$lang.".po", required => 0, }; @@@ -699,17 -675,6 +699,17 @@@ sub myrootpage (@) return $rootpage; } +sub myisselflink ($$) { + my $page=shift; + my $link=shift; + + return 1 if $origsubs{'isselflink'}->($page, $link); + if (istranslation($page)) { + return $origsubs{'isselflink'}->(masterpage($page), $link); + } + return; +} + # ,---- # | Blackboxes for private data # `---- @@@ -834,7 -799,7 +834,7 @@@ sub islanguagecode ($) return $code =~ /^[a-z]{2}$/; } -sub otherlanguage ($$) { +sub otherlanguage_page ($$) { my $page=shift; my $code=shift; @@@ -842,31 -807,17 +842,31 @@@ return masterpage($page) . '.' . $code; } -sub otherlanguages ($) { +# Returns the list of other languages codes: the master language comes first, +# then the codes are ordered the same way as in po_slave_languages, if it is +# an array, or in the language name lexical order, if it is a hash. +sub otherlanguages_codes ($) { my $page=shift; - my %ret; - return \%ret unless istranslation($page) || istranslatable($page); + my @ret; + return \@ret unless istranslation($page) || istranslatable($page); my $curlang=lang($page); foreach my $lang - ($config{po_master_language}{code}, keys %{$config{po_slave_languages}}) { + ($config{po_master_language}{code}, @slavelanguages) { next if $lang eq $curlang; - $ret{$lang}=otherlanguage($page, $lang); + push @ret, $lang; } + return \@ret; +} + +sub otherlanguages_pages ($) { + my $page=shift; + + my %ret; + map { + $ret{$_} = otherlanguage_page($page, $_) + } @{otherlanguages_codes($page)}; + return \%ret; } @@@ -1017,25 -968,30 +1017,25 @@@ sub otherlanguagesloop ($) my $page=shift; my @ret; - my %otherpages=%{otherlanguages($page)}; - while (my ($lang, $otherpage) = each %otherpages) { - if (istranslation($page) && masterpage($page) eq $otherpage) { - push @ret, { - url => urlto_with_orig_beautiful_urlpath($otherpage, $page), - code => $lang, - language => languagename($lang), - master => 1, - }; - } - elsif (istranslation($otherpage)) { - push @ret, { - url => urlto_with_orig_beautiful_urlpath($otherpage, $page), - code => $lang, - language => languagename($lang), - percent => percenttranslated($otherpage), - } + if (istranslation($page)) { + push @ret, { + url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page), + code => $config{po_master_language}{code}, + language => $config{po_master_language}{name}, + master => 1, + }; + } + foreach my $lang (@{otherlanguages_codes($page)}) { + next if $lang eq $config{po_master_language}{code}; + my $otherpage = otherlanguage_page($page, $lang); + push @ret, { + url => urlto_with_orig_beautiful_urlpath($otherpage, $page), + code => $lang, + language => languagename($lang), + percent => percenttranslated($otherpage), } } - 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; + return @ret; } sub homepageurl (;$) { @@@ -1296,7 -1252,7 +1296,7 @@@ sub match_needstranslation ($$;@) my $percenttranslated=IkiWiki::Plugin::po::percenttranslated($page); if ($percenttranslated eq 'N/A') { - return IkiWiki::FailReason->new("file is not a translation page"); + return IkiWiki::FailReason->new("file is not a translatable page"); } elsif ($percenttranslated < 100) { return IkiWiki::SuccessReason->new("file has $percenttranslated translated"); diff --combined doc/plugins/po.mdwn index 30bac7068,fe4d75748..57f04a476 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@@ -54,10 -54,10 +54,10 @@@ Supported language `po_slave_languages` is used to set the list of supported "slave" languages, such as: - po_slave_languages => { 'fr' => 'Français', + po_slave_languages => [ 'fr' => 'Français', 'es' => 'Español', 'de' => 'Deutsch', - } + ] Decide which pages are translatable ----------------------------------- @@@ -254,6 -254,26 +254,26 @@@ once [[intrigeri]]'s `meta` branch is m An integration branch, called `meta-po`, merges [[intrigeri]]'s `po` and `meta` branches, and thus has this additional features. + Language display order + ---------------------- + + Jonas pointed out that one might want to control the order that links to + other languages are listed, for various reasons. Currently, there is no + order, as `po_slave_languages` is a hash. It would need to be converted + to an array to support this. (If twere done, twere best done quickly.) + --[[Joey]] + + > Done in my po branch, preserving backward compatibility. Please + > review :) --[[intrigeri]] + + >> Right, well my immediate concern is that using an array to hold + >> hash-like pairs is not very clear to the user. It will be displayed + >> in a confusing way by websetup; dumping a setup file will probably + >> also cause it to be formatted in a confusing way. And the code + >> seems to assume that the array length is even, and probably blows + >> up if it is not.. and the value is marked safe so websetup can be + >> used to modify it and break that way too. --[[Joey]] + Pagespecs --------- @@@ -284,6 -304,12 +304,12 @@@ underlay, and the underlays lack transl > Any simple testcase to reproduce it, please? I've never seen this > happen yet. --[[intrigeri]] + >> Sure, go here + >> (Currently 0% translateed) and see the 'WikiLink' link at the bottom, + >> which goes to + >> Compare with eg, the 100% translated Dansk version, where + >> the WikiLink link links to the English WikiLink page. --[[Joey]] + Double commits of po files -------------------------- diff --combined doc/plugins/write.mdwn index 15ed08d82,bb8012342..8071f323e --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@@ -200,9 -200,7 +200,9 @@@ value is ignored Runs on the raw source of a page, before anything else touches it, and can make arbitrary changes. The function is passed named parameters "page", -"destpage", and "content". It should return the filtered content. +"destpage", "content" and "fullpage". "fullpage" is a true value if, +and only if, a full page's content is being filtered, e.g. as opposed +to a directive parameter. It should return the filtered content. ### preprocess @@@ -597,7 -595,10 +597,10 @@@ describes the plugin as a whole. For ex hook(type => "genwrapper", id => "foo", call => \&genwrapper); This hook is used to inject C code (which it returns) into the `main` - function of the ikiwiki wrapper when it is being generated. + function of the ikiwiki wrapper when it is being generated. + + The code runs before anything else -- in particular it runs before + the suid wrapper has sanitized its environment. ## Exported variables