]> sipb.mit.edu Git - ikiwiki.git/blobdiff - plugins/externaldemo
Merge branch 'master' of ssh://git.ikiwiki.info/srv/git/ikiwiki.info
[ikiwiki.git] / plugins / externaldemo
index 6bbced30ee70cc697e7745a8c478df40ccf81733..24861dcc91d4c9dfe44e4277e80ce357f1e56577 100755 (executable)
@@ -8,7 +8,6 @@ use strict;
 print STDERR "externaldemo plugin running as pid $$\n";
 
 use RPC::XML;
-use RPC::XML::Parser;
 use IO::Handle;
 
 # autoflush stdout
@@ -23,14 +22,27 @@ sub rpc_read {
        while (<>) {
                $accum.=$_;
 
-               # Kinda hackish approch to parse a single XML RPC out of the
-               # accumulated input. Relies on calls always ending with a
-               # newline, which ikiwiki's protocol requires be true.
+               # Kinda hackish approach to parse a single XML RPC out of the
+               # accumulated input. Perl's RPC::XML library doesn't
+               # provide a better way to do it. Relies on calls always ending
+               # with a newline, which ikiwiki's protocol requires be true.
                if ($accum =~ /^\s*(<\?xml\s.*?<\/(?:methodCall|methodResponse)>)\n(.*)/s) {
                        $accum=$2; # the rest
        
                        # Now parse the XML RPC.
-                       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);
                        if (! ref $r) {
                                die "error: XML RPC parse failure $r";
                        }
@@ -100,15 +112,15 @@ sub import {
        # stage of ikiwiki.
        rpc_call("hook", type => "preprocess", id => "externaldemo", call => "preprocess");
 
-       # Here's an example of how to inject an arbitrary function into
-       # ikiwiki. Ikiwiki will be able to call bob() just like any other
-       # function.
-       rpc_call("inject", name => "IkiWiki::bob", call => "bob");
-
        # Here's an exmaple of how to access values in %IkiWiki::config.
        print STDERR "url is set to: ".
                rpc_call("getvar", "config", "url")."\n";
 
+       # Here's an example of how to inject an arbitrary function into
+       # ikiwiki. Note use of automatic memoization.
+       rpc_call("inject", name => "IkiWiki::bob",
+               call => "formattime", memoize => 1);
+
        print STDERR "externaldemo plugin successfully imported\n";
 }