X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/aa306957bac11477b914ac19b93890184ffe4062..7aa10a2952a0d0ee8543f575966f7e4a780c993c:/IkiWiki/Plugin/external.pm diff --git a/IkiWiki/Plugin/external.pm b/IkiWiki/Plugin/external.pm index aeee15dea..a4cc1dd3c 100644 --- a/IkiWiki/Plugin/external.pm +++ b/IkiWiki/Plugin/external.pm @@ -8,7 +8,6 @@ use warnings; use strict; use IkiWiki 3.00; use RPC::XML; -use RPC::XML::Parser; use IPC::Open2; use IO::Handle; @@ -29,7 +28,9 @@ sub import { $plugins{$plugin}={in => $plugin_read, out => $plugin_write, pid => $pid, accum => ""}; + $RPC::XML::ENCODING="utf-8"; + $RPC::XML::FORCE_STRING_ENCODING="true"; rpc_call($plugins{$plugin}, "import"); } @@ -55,7 +56,19 @@ sub rpc_call ($$;@) { $plugin->{accum}.=$_; while ($plugin->{accum} =~ /^\s*(<\?xml\s.*?<\/(?:methodCall|methodResponse)>)\n(.*)/s) { $plugin->{accum}=$2; - my $r = RPC::XML::Parser->new->parse($1); + my $parser; + eval q{ + use RPC::XML::ParserFactory; + $parser = RPC::XML::ParserFactory->new; + }; + if ($@) { + # old interface + eval q{ + use RPC::XML::Parser; + $parser = RPC::XML::Parser->new; + }; + } + my $r=$parser->parse($1); error("XML RPC parser failure: $r") unless ref $r; if ($r->isa('RPC::XML::response')) { my $value=$r->value; @@ -72,9 +85,9 @@ sub rpc_call ($$;@) { # XML-RPC v1 does not allow for # nil/null/None/undef values to be - # transmitted, so until - # XML::RPC::Parser honours v2 - # (), external plugins send + # transmitted. The extension + # is the right fix, but for + # back-compat, let external plugins send # a hash with one key "null" pointing # to an empty string. if (exists $hash{null} && @@ -232,15 +245,11 @@ sub hook ($@) { sub pagespec_match ($@) { # convert return object into a XML RPC boolean my $plugin=shift; + my $page=shift; + my $spec=shift; - return RPC::XML::boolean->new(0 + IkiWiki::pagespec_march(@_)); -} - -sub pagespec_match_list ($@) { - # convert return object into a XML RPC boolean - my $plugin=shift; - - return RPC::XML::boolean->new(0 + IkiWiki::pagespec_march_list(@_)); + return RPC::XML::boolean->new(0 + IkiWiki::pagespec_match( + $page, $spec, @_)); } 1