X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/e3624de63c799427fbd95fa5bbef9462f95912c6..80781387fc5f0c797f6e1b8678db2f253af4b7f8:/IkiWiki/Plugin/external.pm diff --git a/IkiWiki/Plugin/external.pm b/IkiWiki/Plugin/external.pm index 204442c1e..066f15cf1 100644 --- a/IkiWiki/Plugin/external.pm +++ b/IkiWiki/Plugin/external.pm @@ -1,12 +1,12 @@ #!/usr/bin/perl # Support for external plugins written in other languages. -# Communication via XML RPC a pipe. +# Communication via XML RPC to a pipe. # See externaldemo for an example of a plugin that uses this. package IkiWiki::Plugin::external; use warnings; use strict; -use IkiWiki 2.00; +use IkiWiki 3.00; use RPC::XML; use RPC::XML::Parser; use IPC::Open2; @@ -14,7 +14,7 @@ use IO::Handle; my %plugins; -sub import { #{{{ +sub import { my $self=shift; my $plugin=shift; return unless defined $plugin; @@ -32,17 +32,17 @@ sub import { #{{{ $RPC::XML::ENCODING="utf-8"; rpc_call($plugins{$plugin}, "import"); -} #}}} +} -sub rpc_write ($$) { #{{{ +sub rpc_write ($$) { my $fh=shift; my $string=shift; $fh->print($string."\n"); $fh->flush; -} #}}} +} -sub rpc_call ($$;@) { #{{{ +sub rpc_call ($$;@) { my $plugin=shift; my $command=shift; @@ -131,12 +131,12 @@ sub rpc_call ($$;@) { #{{{ } return undef; -} #}}} +} package IkiWiki::RPC::XML; use Memoize; -sub getvar ($$$) { #{{{ +sub getvar ($$$) { my $plugin=shift; my $varname="IkiWiki::".shift; my $key=shift; @@ -145,9 +145,9 @@ sub getvar ($$$) { #{{{ my $ret=$varname->{$key}; use strict 'refs'; return $ret; -} #}}} +} -sub setvar ($$$;@) { #{{{ +sub setvar ($$$;@) { my $plugin=shift; my $varname="IkiWiki::".shift; my $key=shift; @@ -157,18 +157,18 @@ sub setvar ($$$;@) { #{{{ my $ret=$varname->{$key}=$value; use strict 'refs'; return $ret; -} #}}} +} -sub getstate ($$$$) { #{{{ +sub getstate ($$$$) { my $plugin=shift; my $page=shift; my $id=shift; my $key=shift; return $IkiWiki::pagestate{$page}{$id}{$key}; -} #}}} +} -sub setstate ($$$$;@) { #{{{ +sub setstate ($$$$;@) { my $plugin=shift; my $page=shift; my $id=shift; @@ -176,22 +176,22 @@ sub setstate ($$$$;@) { #{{{ my $value=shift; return $IkiWiki::pagestate{$page}{$id}{$key}=$value; -} #}}} +} -sub getargv ($) { #{{{ +sub getargv ($) { my $plugin=shift; return \@ARGV; -} #}}} +} -sub setargv ($@) { #{{{ +sub setargv ($@) { my $plugin=shift; my $array=shift; @ARGV=@$array; -} #}}} +} -sub inject ($@) { #{{{ +sub inject ($@) { # Bind a given perl function name to a particular RPC request. my $plugin=shift; my %params=@_; @@ -202,12 +202,20 @@ sub inject ($@) { #{{{ my $sub = sub { IkiWiki::Plugin::external::rpc_call($plugin, $params{call}, @_) }; + $sub=memoize($sub) if $params{memoize}; + + # This will add it to the symbol table even if not present. + no warnings; eval qq{*$params{name}=\$sub}; - memoize($params{name}) if $params{memoize}; + use warnings; + + # This will ensure that everywhere it was exported to sees + # the injected version. + IkiWiki::inject(name => $params{name}, call => $sub); return 1; -} #}}} +} -sub hook ($@) { #{{{ +sub hook ($@) { # the call parameter is a function name to call, since XML RPC # cannot pass a function reference my $plugin=shift; @@ -217,16 +225,15 @@ sub hook ($@) { #{{{ delete $params{call}; IkiWiki::hook(%params, call => sub { - my $ret=IkiWiki::Plugin::external::rpc_call($plugin, $callback, @_); - return $ret; + IkiWiki::Plugin::external::rpc_call($plugin, $callback, @_); }); -} #}}} +} -sub pagespec_match ($@) { #{{{ +sub pagespec_match ($@) { # convert pagespec_match's return object into a XML RPC boolean my $plugin=shift; return RPC::XML::boolean->new(0 + IkiWiki::pagespec_march(@_)); -} #}}} +} 1