From b09b8621b241987ab389272d8a21ecb4f83904d6 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Fri, 30 Jul 2010 16:09:46 +0200 Subject: po: use rescan hook instead of rebuilding twice. The po rescan hook re-runs the scan hooks, and runs the preprocess ones in scan mode, both on the po-to-markup converted content. This way, plugins such as meta are given a chance to gather correct information, rather than ugly/buggy escaped data it did gather from unconverted PO files. --- IkiWiki/Plugin/po.pm | 57 ++++++++++++++++++++-------------------------------- 1 file changed, 22 insertions(+), 35 deletions(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 6395ebdc2..519b6d12c 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -39,6 +39,7 @@ sub import { hook(type => "checkconfig", id => "po", call => \&checkconfig); hook(type => "needsbuild", id => "po", call => \&needsbuild); hook(type => "scan", id => "po", call => \&scan, last => 1); + hook(type => "rescan", id => "po", call => \&rescan); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1); @@ -272,6 +273,27 @@ sub filter (@) { return $content; } +# re-run the scan hooks and run the preprocess ones in scan +# mode on the po-to-markup converted content +sub rescan (@) { + my %params=@_; + my $page=$params{page}; + my $content=$params{content}; + + return unless exists $config{rebuild} && $config{rebuild}; + return unless istranslation($page); + + $content = po_to_markup($page, $content); + require IkiWiki; + IkiWiki::run_hooks(scan => sub { + shift->( + page => $page, + content => $content, + ); + }); + IkiWiki::preprocess($page, $page, $content, 1); +} + sub htmlize (@) { my %params=@_; @@ -384,41 +406,6 @@ sub mydelete (@) { sub change (@) { my @rendered=@_; - # All meta titles are first extracted at scan time, i.e. before we turn - # PO files back into translated markdown; escaping of double-quotes in - # PO files breaks the meta plugin's parsing enough to save ugly titles - # to %pagestate at this time. - # - # Then, at render time, every page passes in turn through the Great - # Rendering Chain (filter->preprocess->linkify->htmlize), and the meta - # plugin's preprocess hook is this time in a position to correctly - # extract the titles from slave pages. - # - # This is, unfortunately, too late: if the page A, linking to the page - # B, is rendered before B, it will display the wrongly-extracted meta - # title as the link text to B. - # - # On the one hand, such a corner case only happens on rebuild: on - # refresh, every rendered page is fixed to contain correct meta titles. - # On the other hand, it can take some time to get every page fixed. - # We therefore re-render every rendered page after a rebuild to fix them - # at once. As this more or less doubles the time needed to rebuild the - # wiki, we do so only when really needed. - - if (@rendered - && exists $config{rebuild} && defined $config{rebuild} && $config{rebuild} - && UNIVERSAL::can("IkiWiki::Plugin::meta", "getsetup") - && exists $config{meta_overrides_page_title} - && defined $config{meta_overrides_page_title} - && $config{meta_overrides_page_title}) { - debug(sprintf(gettext("rebuilding all pages to fix meta titles"))); - resetalreadyfiltered(); - require IkiWiki::Render; - foreach my $file (@rendered) { - IkiWiki::render($file, sprintf(gettext("building %s"), $file)); - } - } - my $updated_po_files=0; # Refresh/create POT and PO files as needed. -- cgit v1.2.3 From 5948bb01cb45f715befd107356873a3d3bb1d7d9 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Fri, 30 Jul 2010 16:20:12 +0200 Subject: po: rescan converted content on refresh too. --- IkiWiki/Plugin/po.pm | 1 - 1 file changed, 1 deletion(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 519b6d12c..a2010e1be 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -280,7 +280,6 @@ sub rescan (@) { my $page=$params{page}; my $content=$params{content}; - return unless exists $config{rebuild} && $config{rebuild}; return unless istranslation($page); $content = po_to_markup($page, $content); -- cgit v1.2.3 From d9f0b56a412799feafe041b088db327a4d373c6e Mon Sep 17 00:00:00 2001 From: intrigeri Date: Mon, 2 Aug 2010 12:09:15 +0200 Subject: po(mybestlink): avoid linking to non-existent translation pages. --- IkiWiki/Plugin/po.pm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index a2010e1be..6b708e850 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -583,7 +583,7 @@ sub mybestlink ($$) { my $res=$origsubs{'bestlink'}->(masterpage($page), $link); my @caller = caller(1); if (length $res - && istranslatable($res) + && istranslatedto($res, lang($page)) && istranslation($page) && !(exists $caller[3] && defined $caller[3] && ($caller[3] eq "IkiWiki::PageSpec::match_link"))) { @@ -764,6 +764,15 @@ sub istranslatable ($) { return; } +sub istranslatedto ($$) { + my $page=shift; + my $destlang = shift; + + $page=~s#^/##; + return 0 unless istranslatable($page); + exists $pagesources{otherlanguage_page($page, $destlang)}; +} + sub _istranslation ($) { my $page=shift; -- cgit v1.2.3 From d8a99e97ad6b02b5a5c7666dc2e98f1d6bc50550 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Mon, 2 Aug 2010 12:50:40 +0200 Subject: po: avoid bringing duplicates into %links --- IkiWiki/Plugin/po.pm | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 6b708e850..610ae664b 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -234,15 +234,15 @@ sub scan (@) { my $content=$params{content}; if (istranslation($page)) { - foreach my $destpage (@{$links{$page}}) { - if (istranslatable($destpage)) { - # replace the occurence of $destpage in $links{$page} - for (my $i=0; $i<@{$links{$page}}; $i++) { - if (@{$links{$page}}[$i] eq $destpage) { - @{$links{$page}}[$i] = $destpage . '.' . lang($page); - last; - } - } + # replace the occurence of $destpage in $links{$page} + my @orig_links = @{$links{$page}}; + $links{$page} = []; + foreach my $destpage (@orig_links) { + if (istranslatedto($destpage, lang($page))) { + add_link($page, $destpage . '.' . lang($page)); + } + else { + add_link($page, $destpage); } } } @@ -251,8 +251,9 @@ sub scan (@) { if (istranslatable($destpage)) { # make sure any destpage's translations has # $page in its backlinks - push @{$links{$page}}, - values %{otherlanguages_pages($destpage)}; + foreach my $link (values %{otherlanguages_pages($destpage)}) { + add_link($page, $link); + } } } } -- cgit v1.2.3 From 352c62a8de8b2e7b532c487e74283ed36558abd3 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Mon, 2 Aug 2010 13:10:28 +0200 Subject: po: ignore non-existent translations in otherlanguages* --- IkiWiki/Plugin/po.pm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 610ae664b..dd89a96d1 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -850,7 +850,10 @@ sub otherlanguages_codes ($) { foreach my $lang ($config{po_master_language}{code}, @slavelanguages) { next if $lang eq $curlang; - push @ret, $lang; + if ($lang eq $config{po_master_language}{code} || + istranslatedto(masterpage($page), $lang)) { + push @ret, $lang; + } } return \@ret; } -- cgit v1.2.3 From 5b0890f402d5033334a5dc8c07180bab09dd35a1 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Mon, 2 Aug 2010 13:39:41 +0200 Subject: po: re-scan in scan hook rather than using the rescan hook that won't be added. --- IkiWiki/Plugin/po.pm | 57 ++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index dd89a96d1..f3530faf3 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -39,7 +39,6 @@ sub import { hook(type => "checkconfig", id => "po", call => \&checkconfig); hook(type => "needsbuild", id => "po", call => \&needsbuild); hook(type => "scan", id => "po", call => \&scan, last => 1); - hook(type => "rescan", id => "po", call => \&rescan); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1); @@ -224,16 +223,21 @@ sub needsbuild () { } } -# Massage the recorded state of internal links so that: -# - it matches the actually generated links, rather than the links as written -# in the pages' source -# - backlinks are consistent in all cases sub scan (@) { my %params=@_; my $page=$params{page}; my $content=$params{content}; + my $run_by_po=$params{run_by_po}; - if (istranslation($page)) { + # Massage the recorded state of internal links so that: + # - it matches the actually generated links, rather than the links as + # written in the pages' source + # - backlinks are consistent in all cases + + # A second scan pass is made over translation pages, so as an + # optimization, we only do so on the second pass in this case, + # i.e. when this hook is called by itself. + if ($run_by_po && istranslation($page)) { # replace the occurence of $destpage in $links{$page} my @orig_links = @{$links{$page}}; $links{$page} = []; @@ -246,17 +250,34 @@ sub scan (@) { } } } - elsif (! istranslatable($page) && ! istranslation($page)) { + # No second scan pass is done for a non-translation page, so + # links massaging must happen on first pass in this case. + elsif (! $run_by_po && ! istranslatable($page) && ! istranslation($page)) { foreach my $destpage (@{$links{$page}}) { if (istranslatable($destpage)) { # make sure any destpage's translations has # $page in its backlinks foreach my $link (values %{otherlanguages_pages($destpage)}) { add_link($page, $link); - } + } } } } + + # Re-run the preprocess hooks in scan mode, then the scan hooks, + # over the po-to-markup converted content + return if $run_by_po; # avoid looping endlessly + return unless istranslation($page); + $content = po_to_markup($page, $content); + require IkiWiki; + IkiWiki::preprocess($page, $page, $content, 1); + IkiWiki::run_hooks(scan => sub { + shift->( + page => $page, + content => $content, + run_by_po => 1, + ); + }); } # We use filter to convert PO to the master page's format, @@ -274,26 +295,6 @@ sub filter (@) { return $content; } -# re-run the scan hooks and run the preprocess ones in scan -# mode on the po-to-markup converted content -sub rescan (@) { - my %params=@_; - my $page=$params{page}; - my $content=$params{content}; - - return unless istranslation($page); - - $content = po_to_markup($page, $content); - require IkiWiki; - IkiWiki::run_hooks(scan => sub { - shift->( - page => $page, - content => $content, - ); - }); - IkiWiki::preprocess($page, $page, $content, 1); -} - sub htmlize (@) { my %params=@_; -- cgit v1.2.3