X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/5b78246d11948e93f54ae32dd800e9adaf55a546..12c5786df4e74c143f24398b8d0028000b61daba:/doc/plugins/write/external.mdwn diff --git a/doc/plugins/write/external.mdwn b/doc/plugins/write/external.mdwn index 3612dd9c3..cbcd9bf19 100644 --- a/doc/plugins/write/external.mdwn +++ b/doc/plugins/write/external.mdwn @@ -1,13 +1,20 @@ External plugins are standalone, executable programs, that can be written in any language. When ikiwiki starts up, it runs the program, and -communicates with it using XML RPC. If you want to [[write]] an external +communicates with it using [XML RPC][xmlrpc]. If you want to [[write]] an external plugin, read on.. +[xmlrpc]: http://www.xmlrpc.com/ + ikiwiki contains one sample external plugin, named `externaldemo`. This is written in perl, but is intended to be an example of how to write an external plugin in your favorite programming language. Wow us at how much easier you can do the same thing in your favorite language. ;-) +There's now a second external plugin, the [[rst]] plugin, written in +python. It uses a `proxy.py`, a helper library for ikiwiki python plugins. + +[[!toc ]] + ## How external plugins use XML RPC While XML RPC is typically used over http, ikiwiki doesn't do that. @@ -43,6 +50,14 @@ to access any such global hash. To get the "url" configuration value, call `getvar("config", "url")`. To set it, call `setvar("config", "url", "http://example.com/)`. +The `%pagestate` is a special hash with a more complex format. To access +it, external plugins can use the `getstate` and `setstate` RPCs. To access +stored state, call `getstate("page", "id", "key")`, and to store state, +call `setstate("page", "id", "key", "value")`. + +To access ikiwiki's ARGV array, call `getargv()`. To change its ARGV, call +`setargv(array)`. + ## Notes on function parameters The [[plugin_interface_documentation|write]] talks about functions that take @@ -66,6 +81,19 @@ Other languages might not find it so easy. If not, it might be a good idea to convert these named parameters into something more natural for the language as part of their XML RPC interface. +## undef + +XML RPC has a limitation that it does not have a way to pass +undef/NULL/None. There is an extension to the protocol that supports this, +but it is not yet available in the [[!cpan XML::RPC]] library used by +ikiwiki. + +Until the extension is available, ikiwiki allows undef to be communicated +over XML RPC by passing a sentinal value, a hash with a single key "null" +with a value of an empty string. External plugins that need to communicate +null values to or from ikiwiki will have to translate between undef and +the sentinal. + ## Function injection Some parts of ikiwiki are extensible by adding functions. For example, the @@ -85,13 +113,10 @@ to 1. Since XML RPC can't pass around references to objects, it can't be used with functions that take or return such references. That means you can't -use XML RPC for `cgi` or `formbuilder` hooks (which are passed CGI and +100% use XML RPC for `cgi` or `formbuilder` hooks (which are passed CGI and FormBuilder perl objects), or use it to call `template()` (which returns a perl HTML::Template object). -Also. the `getopt` hook doesn't work, as ARGV is not available to the external -plugin. - ## Performance issues Since each external plugin is a separate process, when ikiwiki is @@ -115,8 +140,8 @@ number of calls. Injecting a replacement for a commonly called ikiwiki function could result in a lot more RPC calls than expected and slow eveything down. `pagetitle`, for instance, is called about 100 times -per page build. Memoizing injected functions whenever possible is a very -good idea. +per page build. Whenever possible, you should tell ikiwiki to memoize +injected functions. In general, use common sense, and your external plugin will probably perform ok.