summaryrefslogtreecommitdiff
path: root/plugins/rst
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/rst')
-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()