aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>2007-10-15 16:33:02 +0000
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>2007-10-15 16:33:02 +0000
commit65dca9f89d82cc512f1c10ac8cf70696243e650a (patch)
tree53e0c9e87da2fcd86f23a557ac2132c92b700bb6 /plugins
parent68c77ef01fff197c65678f6f23a12cea66f635db (diff)
downloadikiwiki-65dca9f89d82cc512f1c10ac8cf70696243e650a.tar
ikiwiki-65dca9f89d82cc512f1c10ac8cf70696243e650a.tar.gz
* Rewritten rst plugin by madduck is a python program that communicates with
ikiwiki via XML RPC. This should be much faster than the old plugin that had to fork python for every rst page render. Note that if you use the rst plugin, you now need to have the RPC::XML perl module installed.
Diffstat (limited to 'plugins')
-rwxr-xr-xplugins/rst97
1 files changed, 97 insertions, 0 deletions
diff --git a/plugins/rst b/plugins/rst
new file mode 100755
index 000000000..abf835e2e
--- /dev/null
+++ b/plugins/rst
@@ -0,0 +1,97 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# rstproc — xml-rpc-based ikiwiki plugin to process RST files
+#
+# TODO: the top of this file should be converted to a python library for
+# ikiwiki plugins
+#
+# based a little bit on rst.pm by Sergio Talens-Oliag, but only a little bit. :)
+#
+# Copyright © martin f. krafft <madduck@madduck.net>
+# Released under the terms of the GNU GPL version 2
+
+__name__ = 'rstproc'
+__description__ = 'xml-rpc-based ikiwiki plugin to process RST files'
+__version__ = '0.2'
+__author__ = 'martin f. krafft <madduck@madduck.net>'
+__copyright__ = 'Copyright © ' + __author__
+__licence__ = 'GPLv2'
+
+from docutils.core import publish_string;
+import posix
+import select
+import sys
+import xmlrpclib
+import xml.parsers.expat
+from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
+
+def write(s):
+ # no comment
+ sys.stdout.write(s)
+ sys.stdout.flush()
+
+def debug(s):
+ print >>sys.stderr, __name__ + ':DEBUG:' + s
+ sys.stderr.flush()
+
+def rpc_read(processor):
+ acc = ''
+ ret = None
+ while True:
+ line = sys.stdin.readline()
+ if line is None: continue
+ if len(line) == 0: sys.exit(posix.EX_OK)
+# debug('read line: ' + line)
+ acc += line
+ try:
+ ret = processor(acc)
+# debug('processed: ' + acc)
+# debug('got back: ' + ret.__class__.__name__)
+ return ret
+ except xml.parsers.expat.ExpatError:
+# debug('request invalid or incomplete: ' + acc)
+ pass
+ return None
+
+def rpc_call(cmd, **kwargs):
+ call = xmlrpclib.dumps(sum(kwargs.items(), ()), cmd)
+ write(call + '\n')
+ resp = rpc_read(lambda resp: resp)
+
+class SimpleStdinOutXMLRPCHandler(SimpleXMLRPCDispatcher):
+
+ def __init__(self):
+ SimpleXMLRPCDispatcher.__init__(self)
+
+ def process_request(self, req):
+ write(self._marshaled_dispatch(req))
+
+ def handle_request(self):
+ def processor(req):
+ self.process_request(req)
+ while True:
+ ret = rpc_read(processor)
+ if ret is not None: return ret
+
+def rst2html(*kwargs):
+ # FIXME arguments should be treated as a hash, the order could change
+ # at any time and break this.
+ html = publish_string(kwargs[3], writer_name='html',
+ settings_overrides = { 'halt_level': 6
+ , 'file_insertion_enabled': 0
+ , 'raw_enabled': 1
+ })
+ content = html.split('<div class="document">', 1)[1]
+ content = content.split('</div>\n</body>')[:-1][0].strip()
+# debug('content = ' + content)
+ return content
+
+def importme():
+ rpc_call('hook', type='htmlize', id='rst', call='rst2html')
+
+handler = SimpleStdinOutXMLRPCHandler()
+handler.register_function(importme, name='import')
+handler.register_function(rst2html)
+while True:
+ handler.handle_request()