diff options
author | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2007-10-15 16:33:02 +0000 |
---|---|---|
committer | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2007-10-15 16:33:02 +0000 |
commit | 65dca9f89d82cc512f1c10ac8cf70696243e650a (patch) | |
tree | 53e0c9e87da2fcd86f23a557ac2132c92b700bb6 /plugins/rst | |
parent | 68c77ef01fff197c65678f6f23a12cea66f635db (diff) |
* 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/rst')
-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() |