+ my $handle=sub {
+ my $escape=shift;
+ my $command=shift;
+ my $params=shift;
+ if (length $escape) {
+ return "[[$command $params]]";
+ }
+ elsif ($preprocessing{$page}) {
+ # Avoid loops of preprocessed pages preprocessing
+ # other pages that preprocess them, etc.
+ return "[[$command would cause preprocessing loop]]";
+ }
+ elsif (exists $hooks{preprocess}{$command}) {
+ # Note: preserve order of params, some plugins may
+ # consider it significant.
+ my @params;
+ while ($params =~ /(?:(\w+)=)?(?:"""(.*?)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) {
+ my $key=$1;
+ my $val;
+ if (defined $2) {
+ $val=$2;
+ $val=~s/\r\n/\n/mg;
+ $val=~s/^\n+//g;
+ $val=~s/\n+$//g;
+ }
+ elsif (defined $3) {
+ $val=$3;
+ }
+ elsif (defined $4) {
+ $val=$4;
+ }
+
+ if (defined $key) {
+ push @params, $key, $val;
+ }
+ else {
+ push @params, $val, '';
+ }
+ }
+ $preprocessing{$page}=1;
+ my $ret=$hooks{preprocess}{$command}{call}->(
+ @params,
+ page => $page,
+ destpage => $destpage,
+ );
+ delete $preprocessing{$page};
+ return $ret;
+ }
+ else {
+ return "[[$command not processed]]";
+ }
+ };