X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/46976ac142a08dffeb8012e60c893ccd8f02ae9a..a6e69822f68864512d49a954a4581511246f0e0b:/plugins/rst diff --git a/plugins/rst b/plugins/rst index a719e18ba..ba0f543f9 100755 --- a/plugins/rst +++ b/plugins/rst @@ -1,102 +1,86 @@ -#!/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' +# Copyright © 2007-2008 martin f. krafft +# 2007-2011 Joey Hess +# 2009 Ulrik Sverdrup +# 2011 Simon McVittie +# 2012 W. Trevor King +# +# 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.4' __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 +__licence__ = 'BSD-2-clause' -def write(s): - # no comment - sys.stdout.write(s) - sys.stdout.flush() +import sys as _sys -def debug(s): - print >>sys.stderr, __name__ + ':DEBUG:' + s - sys.stderr.flush() +from proxy import IkiWikiProcedureProxy -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) +publish_parts = None -class SimpleStdinOutXMLRPCHandler(SimpleXMLRPCDispatcher): - 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): + # delayed import so docutils is only needed if you *use* rst - + # http://bugs.debian.org/637604 + global publish_parts + if publish_parts is None: + try: + from docutils.core import publish_parts + except ImportError as e: + proxy.error('cannot import docutils.core: {0}: {1}'.format( + e.__class__.__name__, e)) + raise - def process_request(self, req): - write(self._marshaled_dispatch(req)) + 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') +def debug(s): + _sys.stderr.write(__name__ + ':DEBUG:{0}\n'.format(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()