X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/4ef96e2d9994c407f0f2f46301eb91fab6b48a37..137ed653ea6b080d540f0740e280e22aa2d40e43:/IkiWiki/Plugin/cutpaste.pm diff --git a/IkiWiki/Plugin/cutpaste.pm b/IkiWiki/Plugin/cutpaste.pm index b1161ba06..0f6ea0b1f 100644 --- a/IkiWiki/Plugin/cutpaste.pm +++ b/IkiWiki/Plugin/cutpaste.pm @@ -3,18 +3,42 @@ package IkiWiki::Plugin::cutpaste; use warnings; use strict; -use IkiWiki 2.00; -use UNIVERSAL; +use IkiWiki 3.00; -my %savedtext; - -sub import { #{{{ +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); -} # }}} +} + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => undef, + section => "widget", + }, +} + +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 (@) { #{{{ +sub preprocess_cut (@) { my %params=@_; foreach my $param (qw{id text}) { @@ -23,13 +47,12 @@ 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; -} # }}} +} -sub preprocess_copy (@) { #{{{ +sub preprocess_copy (@) { my %params=@_; foreach my $param (qw{id text}) { @@ -38,14 +61,13 @@ 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}, - IkiWiki::filter($params{page}, $params{destpage}, $params{text})) if defined wantarray; -} # }}} + return IkiWiki::preprocess($params{page}, $params{destpage}, $params{text}) + if defined wantarray; +} -sub preprocess_paste (@) { #{{{ +sub preprocess_paste (@) { my %params=@_; foreach my $param (qw{id}) { @@ -54,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}, - IkiWiki::filter($params{page}, $params{destpage}, $savedtext{$params{page}}->{$params{id}})); -} # }}} + return IkiWiki::preprocess($params{page}, $params{destpage}, + $pagestate{$params{page}}{cutpaste}{$params{id}}); +} 1;