further thoughts
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Sun, 12 Aug 2007 18:23:00 +0000 (18:23 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Sun, 12 Aug 2007 18:23:00 +0000 (18:23 +0000)
doc/todo/support_for_plugins_written_in_other_languages.mdwn

index 65fd84f90786b33eeeec88a4f8e501e57ed56e95..33378a4fe89be83a2d41ff3c21a8991991538491 100644 (file)
@@ -8,19 +8,22 @@ 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,
 
 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,
-written in any language. It could talk XML RPC via stdio.
+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..)
 
 Here's how it would basically look, not showing the actual XML RPC used to
 pass values.
 
 
 Here's how it would basically look, not showing the actual XML RPC used to
 pass values.
 
-       -> init
+       -> import
        <- 1
        <- hook type => preprocess, id => foo
        -> 1
        <- done 1
        -> 1
 
        <- 1
        <- hook type => preprocess, id => foo
        -> 1
        <- done 1
        -> 1
 
-       -> callback type => preprocess id => foo, page => bar
+       -> callback type => preprocess, id => foo, page => bar
        <- 1
        <- getconfig url
        -> "http://example.com", ...
        <- 1
        <- getconfig url
        -> "http://example.com", ...
@@ -41,7 +44,18 @@ From the plugin's POV:
 
 * It's probably sitting in an XML::RPC loop.
 * Get a command from ikiwiki.
 
 * It's probably sitting in an XML::RPC loop.
 * Get a command from ikiwiki.
-* Call the appropriate callback.
-* The callback can use XML::RPC to communicate with ikiwiki to get things
+* 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
   like config values; and to call ikiwiki functions.
 * When the callback returns, use XML::RPC to send a "done" command to ikiwiki.
   like config values; and to call ikiwiki functions.
 * When the callback returns, use XML::RPC to send a "done" command to ikiwiki.
+
+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.