From b7f46c969f877d8ff6ee1d81032dcd1b5d572e45 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 1 Sep 2013 12:44:02 -0500 Subject: [PATCH] multiple renderers for wiki (issue 1298), thanks Alan and sorry this took forever --- VERSION | 2 +- gluon/tools.py | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 65e2fffd..c14ef9ff 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.09.01.12.40.14 +Version 2.6.0-development+timestamp.2013.09.01.12.42.52 diff --git a/gluon/tools.py b/gluon/tools.py index 2e042138..aae48d53 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -5196,8 +5196,13 @@ class Wiki(object): r = getattr(self, "%s_render" % self.settings.render) elif callable(self.settings.render): r = self.settings.render + elif isinstance(self.settings.render, dict): + return lambda page: self.settings.render.get(page.render, + getattr(self, + "%s_render" % (page.render or 'markmin')))(page) else: - raise ValueError("Invalid render type %s" % type(render)) + raise ValueError( + "Invalid render type %s" % type(self.settings.render)) return r def __init__(self, auth, env=None, render='markmin', @@ -5208,7 +5213,24 @@ class Wiki(object): settings = self.settings = auth.settings.wiki - # render: "markmin", "html", ..., + """render argument options: + - "markmin" + - "html" + - + Sets a custom render function + - dict(html=, markmin=...): + dict(...) allows multiple custom render functions + - "multiple" + Is the same as {}. It enables per-record formats + using builtins + """ + engines = set(['markmin', 'html']) + show_engine = False + if render == "multiple": + render = {} + if isinstance(render, dict): + [engines.add(key) for key in render] + show_engine = True settings.render = render perms = settings.manage_permissions = manage_permissions @@ -5254,6 +5276,11 @@ class Wiki(object): Field('html', 'text', compute=self.get_renderer(), readable=False, writable=False), + Field('render', default="markmin", + readable=show_engine, + writable=show_engine, + requires=IS_EMPTY_OR( + IS_IN_SET(engines))), auth.signature], 'vars':{'format':'%(title)s', 'migrate':migrate}}), ('wiki_tag', { @@ -5528,7 +5555,11 @@ class Wiki(object): if (prevbutton.hasClass('nopreview')) { prevbutton.addClass('preview').removeClass( 'nopreview').html('Edit Source'); - web2py_ajax_page('post', '%(url)s', {body : jQuery('#wiki_page_body').val()}, 'preview'); + try{var wiki_render = jQuery('#wiki_page_render').val()} + catch(e){var wiki_render = null;} + web2py_ajax_page('post', \ + '%(url)s', {body: jQuery('#wiki_page_body').val(), \ + render: wiki_render}, 'preview'); form.fadeOut('fast', function() {preview.fadeIn()}); } else { prevbutton.addClass( @@ -5802,6 +5833,10 @@ class Wiki(object): def preview(self, render): request = current.request + # FIXME: This is an ugly hack to ensure a default render + # engine if not specified (with multiple render engines) + if not "render" in request.post_vars: + request.post_vars.render = None return render(request.post_vars)