diff options
Diffstat (limited to 'plugins')
-rwxr-xr-x | plugins/rst | 97 |
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() |