]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
po: Always filter .po files
authorSimon McVittie <smcv@debian.org>
Sat, 1 Dec 2018 21:18:23 +0000 (21:18 +0000)
committerSimon McVittie <smcv@debian.org>
Sun, 24 Feb 2019 17:23:34 +0000 (17:23 +0000)
The input to filter hooks is meant to be the content of a source file
on disk. If we only filter once per (page, destpage) pair, and a page
is inlined into the same destpage more than once, then the second
occurrence will render as the result of htmlizing .po source as if
it was Markdown (or whatever the type of the corresponding master page
is), which is never going to end well.

The alreadyfiltered mechanism was added in commit 1e874b3f to avoid
preprocessing loops, but I'm not sure where it could lead to a loop:
filter hooks are only called from IkiWiki::filter, which is only called
on page content from disk or on proposed content being previewed.
According to <https://bugs.debian.org/911356#41>, deleting the
alreadyfiltered mechanism resolves the problem, as well as simplifying
the code.

Closes: #911356
Tested-by: intrigeri
CHANGELOG
IkiWiki/Plugin/po.pm
doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
t/po.t

index ad37e72e8b0243836a1d26004979ce555c69545e..5237ee7b8a4dc40bce3b36dd400213a287d6034a 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,18 @@
+ikiwiki (3.20190208) UNRELEASED; urgency=medium
+
+  * po: Always filter .po files.
+    The po plugin in previous ikiwiki releases made the second and
+    subsequent filter call per (page, destpage) pair into a no-op,
+    apparently in an attempt to prevent *recursive* filtering (which as
+    far as we can tell can't happen anyway), with the undesired effect
+    of interpreting the raw .po file as page content (e.g. Markdown)
+    if it was inlined into the same page twice, which is apparently
+    something that tails.org does. Simplify this by deleting the code
+    that prevented repeated filtering. Thanks, intrigeri
+    (Closes: #911356)
+
+ -- Simon McVittie <smcv@debian.org>  Sun, 24 Feb 2019 17:11:39 +0000
+
 ikiwiki (3.20190207) upstream; urgency=medium
 
   [ Amitai Schleier ]
index 418e8e58a2f1a705e8498ad9e22b7afaf8d493ec..13b98b739bcd3ea76a6c059f95601bdadc6c1aa6 100644 (file)
@@ -51,7 +51,6 @@ sub import {
        hook(type => "checkcontent", id => "po", call => \&checkcontent);
        hook(type => "canremove", id => "po", call => \&canremove);
        hook(type => "canrename", id => "po", call => \&canrename);
-       hook(type => "editcontent", id => "po", call => \&editcontent);
        hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
        hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
@@ -303,9 +302,8 @@ sub filter (@) {
        my $page = $params{page};
        my $destpage = $params{destpage};
        my $content = $params{content};
-       if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
+       if (istranslation($page)) {
                $content = po_to_markup($page, $content);
-               setalreadyfiltered($page, $destpage);
        }
        return $content;
 }
@@ -520,15 +518,6 @@ sub canrename (@) {
        return undef;
 }
 
-# As we're previewing or saving a page, the content may have
-# changed, so tell the next filter() invocation it must not be lazy.
-sub editcontent () {
-       my %params=@_;
-
-       unsetalreadyfiltered($params{page}, $params{page});
-       return $params{content};
-}
-
 sub formbuilder_setup (@) {
        my %params=@_;
        my $form=$params{form};
@@ -736,42 +725,6 @@ sub myisselflink ($$) {
        return;
 }
 
-# ,----
-# | Blackboxes for private data
-# `----
-
-{
-       my %filtered;
-
-       sub alreadyfiltered($$) {
-               my $page=shift;
-               my $destpage=shift;
-
-               return exists $filtered{$page}{$destpage}
-                        && $filtered{$page}{$destpage} eq 1;
-       }
-
-       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;
-       }
-}
-
 # ,----
 # | Helper functions
 # `----
@@ -1146,7 +1099,6 @@ sub commit_and_refresh ($) {
                IkiWiki::rcs_update();
        }
        # Reinitialize module's private variables.
-       resetalreadyfiltered();
        resettranslationscache();
        flushmemoizecache();
        # Trigger a wiki refresh.
index a926135b03996cd8b03eabe12a98ae498d10c02d..26d3717b9eb03bb34367bb5cac25d64bbabaa48c 100644 (file)
@@ -177,3 +177,6 @@ be resolved by renaming.
 
 If it's valid to remove the `alreadyfiltered` mechanism, my
 `wip/po-filter-every-time` branch does that. Please test?
+
+> intrigeri says [this change works as intended on tails.org](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=911356#41),
+> so I've applied it. [[done]] --[[smcv]]
diff --git a/t/po.t b/t/po.t
index 82f9e2078a4a3900f267fbb3875f251a9768fa0a..ccb508bef0a9895b6c745c3096b031844570e205 100755 (executable)
--- a/t/po.t
+++ b/t/po.t
@@ -440,20 +440,6 @@ like($output{debian911356}, qr{
        <p>After\sinlines</p>
 }sx);
 
-like($output{'debian911356.fr'}, qr{
-       <p>Avant\sla\spremière\sinline</p>
-       \s*
-       <p>Contenu\sfrançais</p>
-       \s*
-       <p>Entre\sles\sinlines</p>
-       \s*
-       .*      # TODO: This paragraph gets mangled (Debian #911356)
-       \s*
-       <p>Après\sles\sinlines</p>
-}sx);
-
-TODO: {
-local $TODO = "Debian bug #911356";
 like($output{'debian911356.fr'}, qr{
        <p>Avant\sla\spremière\sinline</p>
        \s*
@@ -465,7 +451,6 @@ like($output{'debian911356.fr'}, qr{
        \s*
        <p>Après\sles\sinlines</p>
 }sx);
-};
 
 # Variation of Debian #911356 without using raw inlines.
 like($output{debian911356ish}, qr{
@@ -496,28 +481,6 @@ like($output{debian911356ish}, qr{
        <p>After\sinlines</p>
 }sx);
 
-like($output{'debian911356ish.fr'}, qr{
-       <p>Avant\sla\spremière\sinline</p>
-       \s*
-       <!--feedlinks-->
-       \s*
-       <div\sclass="inlinecontent">
-       \s*
-       <h6>debian911356-inlined\.fr</h6>
-       \s*
-       <p>Contenu\sfrançais</p>
-       \s*
-       </div><!--inlinecontent-->
-       \s*
-       <p>Entre\sles\sinlines</p>
-       \s*
-       .*      # TODO: This paragraph gets mangled (Debian #911356)
-       \s*
-       <p>Après\sles\sinlines</p>
-}sx);
-
-TODO: {
-local $TODO = "Debian bug #911356";
 like($output{'debian911356ish.fr'}, qr{
        <p>Avant\sla\spremière\sinline</p>
        \s*
@@ -545,6 +508,5 @@ like($output{'debian911356ish.fr'}, qr{
        \s*
        <p>Après\sles\sinlines</p>
 }sx);
-};
 
 done_testing;