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
# 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, replacing a core function.
+ # Note use of automatic memoization.
+ rpc_call("inject", name => "IkiWiki::formattime",
+ call => "formattime", memoize => 1);
+
print STDERR "externaldemo plugin successfully imported\n";
}
return "externaldemo plugin preprocessing on $title!";
}
-sub bob {
- print STDERR "externaldemo plugin's bob called via RPC";
+sub formattime {
+ print STDERR "externaldemo plugin's formattime called via RPC";
+ return scalar "formatted time: ".localtime(shift);
}
# Now all that's left to do is loop and handle each incoming RPC request.