From ec5754fc4e62f7603fdbd2dfdf827bd8f8d5dd7a Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Thu, 29 Apr 2010 12:47:10 +0200 Subject: [PATCH] site: Redo the menu generation. Previously there was some very specific parsing code, now we just parse and show the entire Menu page. --- plugin/theme/site.py | 45 ++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/plugin/theme/site.py b/plugin/theme/site.py index 226680b..c2e1659 100644 --- a/plugin/theme/site.py +++ b/plugin/theme/site.py @@ -15,6 +15,7 @@ from MoinMoin.theme import ThemeBase from MoinMoin.Page import Page from MoinMoin import wikiutil +from StringIO import StringIO class SiteTheme(ThemeBase): @@ -138,18 +139,8 @@ class SiteTheme(ThemeBase): @rtype: unicode @return: menu html """ - items = Page(self.request, 'Site/Menu').data.split('\n') - - html = '' - - return html + menu = Page(self.request, 'Site/Menu') + return u'' % parse_wiki_page(self.request, menu) def theme_script(self, name): """ Format script html from this theme's static dir """ @@ -187,4 +178,34 @@ class SiteTheme(ThemeBase): # This adds #pagebottom and closes #page return html +def parse_wiki_page(request, page): + """ + This is an ugly hack to render a page into a string. By default, + formatters render using request.write automatically, which prevents us + from capturing the output. By disguising a StringIO buffer as a request + object, we manage to get at the rendered contents. + + However, when {{{#!wiki or similar blocks are used, stuff breaks (since + that creates a second parser that doesn't get our StringIO buffer). + """ + Parser = wikiutil.searchAndImportPlugin(request.cfg, "parser", 'wiki') + # Create a stringIO buffer, to capture the output + buffer = StringIO() + # Make the buffer look like the request, since the parser writes + # directly to the request + buffer.form = request.form + buffer.getText = request.getText + buffer.cfg = request.cfg + # Create a new formatter. Since we need to set its page, we can't use + # request.formatter. + from MoinMoin.formatter.text_html import Formatter + formatter = Formatter(request) + formatter.setPage(page) + + # Create the parser and parse the page + parser = Parser(page.data, buffer) + parser.format(formatter) + # Return the captured buffer + return buffer.getvalue() + # vim: set sw=4 sts=4 expandtab: -- 2.30.2