2007-08-12 20:05:45 +02:00
|
|
|
ikiwiki should support writing plugins in other languages
|
|
|
|
|
|
|
|
While it should be possible to call ikiwiki from C, doing the callbacks in C is
|
|
|
|
probably hard. And accessing perl at all from C is ugly. It also doesn't
|
|
|
|
make it very easy to write plugins in an interpreted language, since that
|
|
|
|
would mean linking perl and eg, python in one binary. (Been there, done
|
|
|
|
that, never again.)
|
|
|
|
|
|
|
|
Instead, I'm considering using XML RPC to let ikiwiki communicate with a
|
|
|
|
child process that it can spawn. The child could then be any program,
|
2007-08-12 20:23:00 +02:00
|
|
|
written in any language. It could talk XML RPC via stdio. (This assumes
|
|
|
|
that most languages allow easily serialising XML::RPC calls and responses
|
|
|
|
to a file descriptor. Some XML RPC implementations may be hardcoded to use
|
|
|
|
http..)
|
2007-08-12 20:05:45 +02:00
|
|
|
|
|
|
|
Here's how it would basically look, not showing the actual XML RPC used to
|
|
|
|
pass values.
|
|
|
|
|
2007-08-12 20:23:00 +02:00
|
|
|
-> import
|
2007-08-12 20:05:45 +02:00
|
|
|
<- 1
|
|
|
|
<- hook type => preprocess, id => foo
|
|
|
|
-> 1
|
|
|
|
<- done 1
|
|
|
|
-> 1
|
|
|
|
|
2007-08-12 20:23:00 +02:00
|
|
|
-> callback type => preprocess, id => foo, page => bar
|
2007-08-12 20:05:45 +02:00
|
|
|
<- 1
|
|
|
|
<- getconfig url
|
|
|
|
-> "http://example.com", ...
|
|
|
|
<- debug "foo"
|
|
|
|
-> 1
|
|
|
|
<- done "my return value"
|
|
|
|
-> 1
|
|
|
|
|
|
|
|
From ikiwiki's POV:
|
|
|
|
|
|
|
|
* ikiwiki always initiates each conversation with a command
|
|
|
|
* After sending a command, ikiwiki reads commands, dispatches them, and
|
|
|
|
returns the results, in a loop.
|
|
|
|
* The loop continues until the plugin calls the "done" command, with a value
|
|
|
|
that is the return value for the command that initiated the conversation.
|
|
|
|
|
|
|
|
From the plugin's POV:
|
|
|
|
|
|
|
|
* It's probably sitting in an XML::RPC loop.
|
|
|
|
* Get a command from ikiwiki.
|
2007-08-12 20:23:00 +02:00
|
|
|
* Disaptch the command to the appropriate function. The main commands seem
|
|
|
|
to be "import" and "callback"; callback can call any function that the
|
|
|
|
plugin has registered a hook for. Others commands might include
|
|
|
|
"rcs_*" for RCS plugins..
|
|
|
|
* The function can use XML::RPC to communicate with ikiwiki to get things
|
2007-08-12 20:05:45 +02:00
|
|
|
like config values; and to call ikiwiki functions.
|
|
|
|
* When the callback returns, use XML::RPC to send a "done" command to ikiwiki.
|
2007-08-12 20:23:00 +02:00
|
|
|
|
|
|
|
Simple enough, really. ikiwiki would need to add accessor functions for
|
|
|
|
all important variables, such as "getconfig" and "setconfig". It would
|
|
|
|
probably be easiest for ikiwiki to dispatch a command by just evaling
|
|
|
|
IkiWiki::$command.
|
|
|
|
|
|
|
|
Plugin programs could be dropped into /usr/share/ikiwiki/plugins/, and
|
|
|
|
load_plugin() would just open2 the plugin program and call import.
|