# -*- coding: iso-8859-1 -*-
"""
- Evolution Events, website theme
+ MoinMoin - Generic website theme.
+
+ @copyright: 2009+ Matthijs Kooijman
+ @license: GNU GPL, see COPYING for details.
This theme is meant for wiki's that are meant to function as a website,
meaning nothing fancy and wiki-ish (at least when you're not logged in).
from MoinMoin.theme import ThemeBase
from MoinMoin.Page import Page
from MoinMoin import wikiutil
+from StringIO import StringIO
class SiteTheme(ThemeBase):
# Header
u'<div id="header">',
+ self.logo(),
self.menu(d),
- #self.logo(),
#self.username(d),
#u'<div id="locationline">',
#self.interwiki(d),
# Post header custom html (not recommended)
self.emit_custom_html(self.cfg.page_header2),
- # Start of page
- self.startPage(),
- self.editbar(d),
self.msg(d),
+ self.editbar(d),
+
+ # Start of page
+ self.startPage(d),
]
return u'\n'.join(html)
# Header
u'<div id="header">',
+ self.logo(),
self.menu(d),
u'</div>',
self.emit_custom_html(self.cfg.page_header2),
# Start of page
- self.startPage(),
+ self.startPage(d),
self.msg(d),
]
return u'\n'.join(html)
page = d['page']
html = [
# End of page
- self.endPage(),
+ self.endPage(d),
# Pre footer custom html (not recommended!)
self.emit_custom_html(self.cfg.page_footer1),
#self.editbar(d),
#self.credits(d),
#self.showversion(d, **keywords),
+ u'<div id="footerbottom"></div>',
u'</div>',
# Post footer custom html
@rtype: unicode
@return: menu html
"""
- items = Page(self.request, 'Site/Menu').data.split('\n')
-
- html = '<ul id="menubar">'
-
- for item in items:
- if (not item.startswith("#")):
- (pagename, link) = self.splitNavilink(item)
- html = html + ("<li class=\"menulink\">%s</li>" % link)
-
- html = html + '</ul>'
-
- return html
+ menu = Page(self.request, 'Site/Menu')
+ return u'<div id="menubar">%s</div>' % parse_wiki_page(self.request, menu)
def theme_script(self, name):
""" Format script html from this theme's static dir """
}
return html
-def execute(request):
+ def startPage(self, d):
+ # This opens up #page
+ html = ThemeBase.startPage(self)
+ html += u'<div id="pagetop"></div>\n'
+ html += u'<div id="pagemiddle">\n'
+ return html
+
+ def endPage(self, d):
+ html = u'</div><!-- #pagemiddle -->\n'
+ html += ThemeBase.endPage(self)
+ # This adds #pagebottom and closes #page
+ return html
+
+def parse_wiki_page(request, page):
"""
- Generate and return a theme object
-
- @param request: the request object
- @rtype: MoinTheme
- @return: Theme object
+ 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).
"""
- return Theme(request)
+ 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: