X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/65dca9f89d82cc512f1c10ac8cf70696243e650a..fcd810d236fdf779beb740082953a14feba07f0d:/plugins/rst?ds=sidebyside diff --git a/plugins/rst b/plugins/rst index abf835e2e..838667507 100755 --- a/plugins/rst +++ b/plugins/rst @@ -1,97 +1,46 @@ -#!/usr/bin/python +#!/usr/bin/env python # -*- coding: utf-8 -*- # -# rstproc — xml-rpc-based ikiwiki plugin to process RST files +# rst — 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' +# +__name__ = 'rst' __description__ = 'xml-rpc-based ikiwiki plugin to process RST files' -__version__ = '0.2' +__version__ = '0.3' __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) +from docutils.core import publish_parts; +from proxy import IkiWikiProcedureProxy - def process_request(self, req): - write(self._marshaled_dispatch(req)) +def rst2html(proxy, *args): + kwargs = _to_dict(args) + parts = publish_parts(kwargs["content"], + writer_name="html", + settings_overrides = { 'halt_level': 6 + , 'file_insertion_enabled': 0 + , 'raw_enabled': 1 + }) + return '\n'.join(parts['html_body'].splitlines()[1:-1]) - 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 _to_dict(args): + # args is a list paired by key, value, so we turn it into a dict + return dict((k, v) for k, v in zip(*[iter(args)]*2)) -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 getsetup(proxy, *kwargs): + return 'plugin', { 'safe' : 1, 'rebuild' : 1, 'section' : 'format' } -def importme(): - rpc_call('hook', type='htmlize', id='rst', call='rst2html') +import sys +def debug(s): + sys.stderr.write(__name__ + ':DEBUG:%s\n' % s) + sys.stderr.flush() -handler = SimpleStdinOutXMLRPCHandler() -handler.register_function(importme, name='import') -handler.register_function(rst2html) -while True: - handler.handle_request() +proxy = IkiWikiProcedureProxy(__name__, debug_fn=None) +proxy.hook('getsetup', getsetup) +proxy.hook('htmlize', rst2html) +proxy.run()