From 65dca9f89d82cc512f1c10ac8cf70696243e650a Mon Sep 17 00:00:00 2001 From: joey Date: Mon, 15 Oct 2007 16:33:02 +0000 Subject: * 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. --- plugins/rst | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 plugins/rst (limited to 'plugins') 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 +# 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 ' +__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('
', 1)[1] + content = content.split('
\n')[:-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() -- cgit v1.2.3