X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/46976ac142a08dffeb8012e60c893ccd8f02ae9a..0760db7368044c0c7aad79e97a87f3af4d9c7d6e:/plugins/rst diff --git a/plugins/rst b/plugins/rst index a719e18ba..fb36245de 100755 --- a/plugins/rst +++ b/plugins/rst @@ -1,102 +1,67 @@ -#!/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' +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# . +# THIS SOFTWARE IS PROVIDED BY IKIWIKI AND CONTRIBUTORS ``AS IS'' +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +__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) +__licence__ = 'BSD-2-clause' -class SimpleStdinOutXMLRPCHandler(SimpleXMLRPCDispatcher): +from docutils.core import publish_parts; +from proxy import IkiWikiProcedureProxy - def __init__(self, allow_none=False, encoding=None): - # see http://bugs.debian.org/470645 - if SimpleXMLRPCDispatcher.__init__.func_code.co_argcount == 1: - # python2.4 and before only took one argument - SimpleXMLRPCDispatcher.__init__(self) - else: - SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) +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 process_request(self, req): - write(self._marshaled_dispatch(req)) +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 handle_request(self): - def processor(req): - self.process_request(req) - while True: - ret = rpc_read(processor) - if ret is not None: return ret +def getsetup(proxy, *kwargs): + return 'plugin', { 'safe' : 1, 'rebuild' : 1, 'section' : 'format' } -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') +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()