cutpaste: Fix bug that occured in some cases involving inlines when text was pasted...
authorJoey Hess <joey@kitenet.net>
Wed, 15 Sep 2010 20:24:50 +0000 (16:24 -0400)
committerJoey Hess <joey@kitenet.net>
Wed, 15 Sep 2010 20:24:50 +0000 (16:24 -0400)
IkiWiki/Plugin/cutpaste.pm
debian/changelog
doc/bugs/Error:_no_text_was_copied_in_this_page_--_missing_page_dependencies.mdwn

index 4a88171685b8d94cfaced062a9547ea8c3e6d401..0f6ea0b1f3798650219f7a08a66fa77f85151401 100644 (file)
@@ -5,10 +5,9 @@ use warnings;
 use strict;
 use IkiWiki 3.00;
 
-my %savedtext;
-
 sub import {
        hook(type => "getsetup", id => "cutpaste", call => \&getsetup);
+       hook(type => "needsbuild", id => "cutpaste", call => \&needsbuild);
        hook(type => "preprocess", id => "cut", call => \&preprocess_cut, scan => 1);
        hook(type => "preprocess", id => "copy", call => \&preprocess_copy, scan => 1);
        hook(type => "preprocess", id => "paste", call => \&preprocess_paste);
@@ -23,6 +22,22 @@ sub getsetup () {
                },
 }
 
+sub needsbuild (@) {
+       my $needsbuild=shift;
+       foreach my $page (keys %pagestate) {
+               if (exists $pagestate{$page}{cutpaste}) {
+                       if (exists $pagesources{$page} &&
+                           grep { $_ eq $pagesources{$page} } @$needsbuild) {
+                               # remove state, will be re-added if
+                               # the cut/copy directive is still present
+                               # on rebuild.
+                               delete $pagestate{$page}{cutpaste};
+                       }
+               }
+       }
+       return $needsbuild;
+}
+
 sub preprocess_cut (@) {
        my %params=@_;
 
@@ -32,8 +47,7 @@ sub preprocess_cut (@) {
                }
        }
 
-       $savedtext{$params{page}} = {} if not exists $savedtext{$params{"page"}};
-       $savedtext{$params{page}}->{$params{id}} = $params{text};
+       $pagestate{$params{page}}{cutpaste}{$params{id}} = $params{text};
 
        return "" if defined wantarray;
 }
@@ -47,8 +61,7 @@ sub preprocess_copy (@) {
                }
        }
 
-       $savedtext{$params{page}} = {} if not exists $savedtext{$params{"page"}};
-       $savedtext{$params{page}}->{$params{id}} = $params{text};
+       $pagestate{$params{page}}{cutpaste}{$params{id}} = $params{text};
 
        return IkiWiki::preprocess($params{page}, $params{destpage}, $params{text})
                if defined wantarray;
@@ -63,15 +76,15 @@ sub preprocess_paste (@) {
                }
        }
 
-       if (! exists $savedtext{$params{page}}) {
+       if (! exists $pagestate{$params{page}}{cutpaste}) {
                error gettext('no text was copied in this page');
        }
-       if (! exists $savedtext{$params{page}}->{$params{id}}) {
+       if (! exists $pagestate{$params{page}}{cutpaste}{$params{id}}) {
                error sprintf(gettext('no text was copied in this page with id %s'), $params{id});
        }
 
        return IkiWiki::preprocess($params{page}, $params{destpage},
-               $savedtext{$params{page}}->{$params{id}});
+               $pagestate{$params{page}}{cutpaste}{$params{id}});
 }
 
 1;
index 27e0fb1033f8f75345891695ced03d35f8c12cb1..d6eebea7839ca1ac0fe2ab088060ccd02cb5457d 100644 (file)
@@ -24,6 +24,8 @@ ikiwiki (3.20100832) UNRELEASED; urgency=low
     of the rst plugin.
   * git: When updating from remote, use git pull --prune, to avoid possible
     errors from conflicting obsolete remote branches.
+  * cutpaste: Fix bug that occured in some cases involving inlines when
+    text was pasted on a page before being cut.
 
  -- Joey Hess <joeyh@debian.org>  Tue, 07 Sep 2010 12:08:05 -0400
 
index 356f9155afe01f6e50feeb467d81324378ca0594..4535cf35d9c74ceb06cccd28c8044a579bcc8c9d 100644 (file)
@@ -24,3 +24,23 @@ This error shows up only for *news.html*, but not in *news/2010-07-31* or for
 the aggregation in *index.html* or its RSS and atom files.
 
 --[[tschwinge]]
+
+> So the cutpaste plugin, in order to support pastes
+> that come before the corresponding cut in the page,
+> relies on the scan hook being called for the page
+> before it is preprocessed.
+> 
+> In the case of an inline, this doesn't happen, if
+> the page in question has not changed.
+> 
+> Really though it's not just inline, it's potentially anything
+> that preprocesses content. None of those things guarantee that
+> scan gets re-run on it first. 
+> 
+> I think cutpaste is going beyond the intended use of scan hooks,
+> which is to gather link information, not do arbitrary data collection.
+> Requiring scan be run repeatedly could be a lot more work.
+> 
+> Using `%pagestate` to store the cut content when scanning would be 
+> one way to fix this bug. It would mean storing potentially big chunks 
+> of page content in the indexdb. --[[Joey]]