From a128c256a51392fcf752bf612d83a90e8c68027e Mon Sep 17 00:00:00 2001 From: intrigeri Date: Fri, 25 Jun 2010 23:18:34 +0200 Subject: po: added support for html pagetype ... after having audited the po4a Xml and Xhtml modules for security issues. Signed-off-by: intrigeri --- doc/plugins/po.mdwn | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'doc/plugins/po.mdwn') diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 576d36ec1..585e14383 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -213,16 +213,16 @@ preferred `$EDITOR`, without needing to be online. Markup languages support ------------------------ -[[Markdown|mdwn]] is well supported. Some other markup languages supported -by ikiwiki mostly work, but some pieces of syntax are not rendered -correctly on the slave pages: +[[Markdown|mdwn]] and [[html]] are well supported. Some other markup +languages supported by ikiwiki mostly work, but some pieces of syntax +are not rendered correctly on the slave pages: * [[reStructuredText|rst]]: anonymous hyperlinks and internal cross-references * [[wikitext]]: conversion of newlines to paragraphs * [[creole]]: verbatim text is wrapped, tables are broken -* [[html]] and LaTeX: not supported yet; the dedicated po4a modules - could be used to support them, but they would need a security audit +* LaTeX: not supported yet; the dedicated po4a module + could be used to support it, but it would need a security audit * other markup languages have not been tested. Security -- cgit v1.2.3 From 4cf185e781a5f94373b30ec9a0e10dfb626b6d86 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Sat, 26 Jun 2010 00:56:06 +0200 Subject: po_slave_languages can now be a hash, if order matters. --- IkiWiki/Plugin/po.pm | 95 +++++++++++++++++++++++++++++++++------------------- doc/plugins/po.mdwn | 13 ++----- 2 files changed, 62 insertions(+), 46 deletions(-) (limited to 'doc/plugins/po.mdwn') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index ab1cc7ae6..7d5dfee03 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -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"); @@ -104,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, @@ -137,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 { @@ -197,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)}; } } @@ -229,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)}; } } } @@ -295,7 +311,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 && @@ -348,12 +364,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, }; @@ -820,7 +836,7 @@ sub islanguagecode ($) { return $code =~ /^[a-z]{2}$/; } -sub otherlanguage ($$) { +sub otherlanguage_page ($$) { my $page=shift; my $code=shift; @@ -828,17 +844,31 @@ sub otherlanguage ($$) { 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; } @@ -989,30 +1019,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 (;$) { diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 585e14383..6b2a30786 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -54,10 +54,10 @@ Supported languages `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,15 +254,6 @@ once [[intrigeri]]'s `meta` branch is merged. 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]] - Pagespecs --------- -- cgit v1.2.3 From 924f559e5049a63488a5f2baca610299a7e02957 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Sat, 26 Jun 2010 00:59:20 +0200 Subject: typo fix. --- doc/plugins/po.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc/plugins/po.mdwn') diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 6b2a30786..dc0b638e2 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -130,7 +130,7 @@ lighttpd -------- Recent versions of lighttpd should be able to use -`$HTTP["language"]` to configure the translatted pages to be served. +`$HTTP["language"]` to configure the translated pages to be served. See [Lighttpd Issue](http://redmine.lighttpd.net/issues/show/1119) -- cgit v1.2.3 From 4bcd6cc4ffffc2888b2907100ce1decc20e5fcde Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Jul 2010 19:33:10 -0400 Subject: noticed a bug in the po plugin (I should probably put this in bugs/, but I am not sure if intregriti watches there..) --- doc/plugins/po.mdwn | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'doc/plugins/po.mdwn') diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 2dc5ffdc8..4158d7547 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -351,6 +351,16 @@ update. --[[Joey]] > * The ENCODING\n part is due to an inconsistency in po4a, which > I've just send a patch for. --[[intrigeri]] +New pages not translatable +-------------------------- + +Today I added a new English page to l10n.ikiwiki.info. When I saved, +the page did not have the translation links at the top. I waited until +the po plugin had, in the background, created the po files, and refreshed; +still did not see the translation links. Only when I touched the page +source and refreshed did it finally add the translation links. +I can reproduce this bug in a test site. --[[Joey]] + Ugly messages with empty files ------------------------------ -- cgit v1.2.3 From 839fae0b2b85da690b5ec4bcb750fe071c58a53c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Jul 2010 19:42:06 -0400 Subject: response on po_slave_languages structure --- doc/plugins/po.mdwn | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'doc/plugins/po.mdwn') diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index babdc1886..d6f82912c 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -297,6 +297,10 @@ to an array to support this. (If twere done, twere best done quickly.) >>> Joey, which of these solutions do you prefer? Or another one? >>> I tend to prefer the last one. --[[intrigeri]] +>>>> I prefer the pipe separator, I think. I'm concerned that there is +>>>> no way to really sanely represent complex data structures in web +>>>> setup. --[[Joey]] + Pagespecs --------- -- cgit v1.2.3 From 35c9956df0cb92a1088d763a45e863079bfd8e50 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Jul 2010 20:03:04 -0400 Subject: Revert "po_slave_languages can now be a hash, if order matters." This reverts commit 4cf185e781a5f94373b30ec9a0e10dfb626b6d86. That commit broke t/po.t (probably the test case only is testing too close the the old implementation and needs correcting). Also, we have not decided how to want to represent it yet, so I'm not ready for this change. Conflicts: IkiWiki/Plugin/po.pm doc/plugins/po.mdwn --- IkiWiki/Plugin/po.pm | 98 +++++++++++++++++++--------------------------------- doc/plugins/po.mdwn | 4 +-- 2 files changed, 37 insertions(+), 65 deletions(-) (limited to 'doc/plugins/po.mdwn') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index dc73c73c3..224412676 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -28,7 +28,6 @@ use UNIVERSAL; my %translations; my @origneedsbuild; my %origsubs; -my @slavelanguages; # ordered as in config po_slave_languages memoize("istranslatable"); memoize("_istranslation"); @@ -105,11 +104,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,24 +137,6 @@ sub checkconfig () { $field, 'po')); } } - - if (ref $config{po_slave_languages} eq 'ARRAY') { - my %slaves; - if (@{$config{po_slave_languages}} % 2 != 0) { - error(sprintf(gettext("The %s field is invalid."), 'po_slave_languages')); - } - 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 { @@ -216,7 +197,7 @@ sub needsbuild () { # make existing translations depend on the corresponding master page foreach my $master (keys %translations) { - map add_depends($_, $master), values %{otherlanguages_pages($master)}; + map add_depends($_, $master), values %{otherlanguages($master)}; } } @@ -248,7 +229,7 @@ sub scan (@) { # make sure any destpage's translations has # $page in its backlinks push @{$links{$page}}, - values %{otherlanguages_pages($destpage)}; + values %{otherlanguages($destpage)}; } } } @@ -306,7 +287,7 @@ sub pagetemplate (@) { } if ($template->query(name => "otherlanguages")) { $template->param(otherlanguages => [otherlanguagesloop($page)]); - map add_depends($page, $_), (values %{otherlanguages_pages($page)}); + map add_depends($page, $_), (values %{otherlanguages($page)}); } if ($config{discussion} && istranslation($page)) { if ($page !~ /.*\/\Q$config{discussionpage}\E$/i && @@ -359,12 +340,12 @@ sub renamepages (@) { return () unless istranslatable($torename{src}); my @ret; - my %otherpages=%{otherlanguages_pages($torename{src})}; + my %otherpages=%{otherlanguages($torename{src})}; while (my ($lang, $otherpage) = each %otherpages) { push @ret, { src => $otherpage, srcfile => $pagesources{$otherpage}, - dest => otherlanguage_page($torename{dest}, $lang), + dest => otherlanguage($torename{dest}, $lang), destfile => $torename{dest}.".".$lang.".po", required => 0, }; @@ -831,7 +812,7 @@ sub islanguagecode ($) { return $code =~ /^[a-z]{2}$/; } -sub otherlanguage_page ($$) { +sub otherlanguage ($$) { my $page=shift; my $code=shift; @@ -839,31 +820,17 @@ sub otherlanguage_page ($$) { return masterpage($page) . '.' . $code; } -# 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 ($) { +sub otherlanguages ($) { 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}, @slavelanguages) { + ($config{po_master_language}{code}, keys %{$config{po_slave_languages}}) { next if $lang eq $curlang; - push @ret, $lang; + $ret{$lang}=otherlanguage($page, $lang); } - return \@ret; -} - -sub otherlanguages_pages ($) { - my $page=shift; - - my %ret; - map { - $ret{$_} = otherlanguage_page($page, $_) - } @{otherlanguages_codes($page)}; - return \%ret; } @@ -1014,25 +981,30 @@ sub otherlanguagesloop ($) { my $page=shift; my @ret; - 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), + 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), + } } } - 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 homepageurl (;$) { diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index d6f82912c..53327c1da 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -54,10 +54,10 @@ Supported languages `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 ----------------------------------- -- cgit v1.2.3