From 25447bccae0439ea56da7a788482a4807c7c459d Mon Sep 17 00:00:00 2001 From: intrigeri Date: Fri, 30 Jul 2010 16:05:07 +0200 Subject: Added a rescan hook. This is needed for the po plugin vs. e.g. meta titles. In order to get rid of the ugly "rebuilding all pages to fix meta titles" thing, Joey suggested to make "po, at scan time, re-run the scan hooks, passing them modified content (either converted from po to mdwn or with the escaped stuff cheaply de-escaped)". This would unfortunately not work, as the meta plugin gathers its data using the preprocess hook in scan mode: it would overwrite with buggy data the correct data we would have forced it to gather in po's scan hook. We then need a hook that runs *after* the preprocess hook has been run in scan mode, but *before* any page rendering is started. Hence this one. --- IkiWiki/Plugin/skeleton.pm.example | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example index a57a2c8fe..708d92830 100644 --- a/IkiWiki/Plugin/skeleton.pm.example +++ b/IkiWiki/Plugin/skeleton.pm.example @@ -18,6 +18,7 @@ sub import { hook(type => "filter", id => "skeleton", call => \&filter); hook(type => "linkify", id => "skeleton", call => \&linkify); hook(type => "scan", id => "skeleton", call => \&scan); + hook(type => "rescan", id => "skeleton", call => \&rescan); hook(type => "htmlize", id => "skeleton", call => \&htmlize); hook(type => "sanitize", id => "skeleton", call => \&sanitize); hook(type => "indexhtml", id => "skeleton", call => \&indexhtml); @@ -104,6 +105,12 @@ sub scan (@) { debug("skeleton plugin running as scan"); } +sub rescan (@) { + my %params=@_; + + debug("skeleton plugin running as rescan"); +} + sub htmlize (@) { my %params=@_; -- cgit v1.2.3 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') 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') 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') 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') 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') 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 46a997db16e68ecdf3e1c13ea444afdb4e767a2f Mon Sep 17 00:00:00 2001 From: intrigeri Date: Mon, 2 Aug 2010 13:14:33 +0200 Subject: Revert "Added a rescan hook." This reverts commit 25447bccae0439ea56da7a788482a4807c7c459d. --- IkiWiki/Plugin/skeleton.pm.example | 7 ------- IkiWiki/Render.pm | 8 -------- doc/plugins/write.mdwn | 11 ----------- 3 files changed, 26 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example index 708d92830..a57a2c8fe 100644 --- a/IkiWiki/Plugin/skeleton.pm.example +++ b/IkiWiki/Plugin/skeleton.pm.example @@ -18,7 +18,6 @@ sub import { hook(type => "filter", id => "skeleton", call => \&filter); hook(type => "linkify", id => "skeleton", call => \&linkify); hook(type => "scan", id => "skeleton", call => \&scan); - hook(type => "rescan", id => "skeleton", call => \&rescan); hook(type => "htmlize", id => "skeleton", call => \&htmlize); hook(type => "sanitize", id => "skeleton", call => \&sanitize); hook(type => "indexhtml", id => "skeleton", call => \&indexhtml); @@ -105,12 +104,6 @@ sub scan (@) { debug("skeleton plugin running as scan"); } -sub rescan (@) { - my %params=@_; - - debug("skeleton plugin running as rescan"); -} - sub htmlize (@) { my %params=@_; diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 5ce802317..a653ab2da 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -183,14 +183,6 @@ sub scan ($) { # Preprocess in scan-only mode. preprocess($page, $page, $content, 1); - - run_hooks(rescan => sub { - shift->( - page => $page, - content => $content, - ); - }); - } else { will_render($file, $file, 1); diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 335320394..10b4df835 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -194,17 +194,6 @@ them to `%links`. Present in IkiWiki 2.40 and later. The function is passed named parameters "page" and "content". Its return value is ignored. -### rescan - - hook(type => "rescan", id => "foo", call => \&scan); - -This hook is called after the scan hook has been run, as well as the -preprocess hook in scan mode. It is used to collect additional -metadata that depends on a first scan to have been performed already. - -The function is passed named parameters "page" and "content". Its return -value is ignored. - ### filter hook(type => "filter", id => "foo", call => \&filter); -- 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') 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 From 0055354e3cce1d1fb8ea2ac0d5c67a4c16a2b0b0 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Mon, 2 Aug 2010 15:27:52 +0200 Subject: fix copy'n'paste error --- IkiWiki/Plugin/skeleton.pm.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example index a57a2c8fe..341d67867 100644 --- a/IkiWiki/Plugin/skeleton.pm.example +++ b/IkiWiki/Plugin/skeleton.pm.example @@ -255,7 +255,7 @@ sub genwrapper () { debug("skeleton plugin running in genwrapper"); } -sub savestate () { +sub disable () { debug("skeleton plugin running in disable"); } -- cgit v1.2.3