site: Redo the menu generation.
[matthijs/projects/wipi.git] / plugin / theme / site.py
index 37bff91f75dc2e4b3341aa25054417f6f7bf8ab1..c2e1659eb6dd4b155bd1769b050244319d15fea0 100644 (file)
@@ -1,6 +1,9 @@
 # -*- 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).
@@ -12,6 +15,7 @@
 from MoinMoin.theme import ThemeBase
 from MoinMoin.Page import Page
 from MoinMoin import wikiutil
+from StringIO import StringIO
 
 class SiteTheme(ThemeBase):
 
@@ -46,8 +50,8 @@ 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),
@@ -62,10 +66,11 @@ class SiteTheme(ThemeBase):
             # 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)
 
@@ -82,6 +87,7 @@ class SiteTheme(ThemeBase):
 
             # Header
             u'<div id="header">',
+            self.logo(),
             self.menu(d),
             u'</div>',
 
@@ -89,7 +95,7 @@ class SiteTheme(ThemeBase):
             self.emit_custom_html(self.cfg.page_header2),
 
             # Start of page
-            self.startPage(),
+            self.startPage(d),
             self.msg(d),
         ]
         return u'\n'.join(html)
@@ -105,7 +111,7 @@ class SiteTheme(ThemeBase):
         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),
@@ -118,6 +124,7 @@ class SiteTheme(ThemeBase):
             #self.editbar(d),
             #self.credits(d),
             #self.showversion(d, **keywords),
+            u'<div id="footerbottom"></div>',
             u'</div>',
 
             # Post footer custom html
@@ -132,18 +139,8 @@ class SiteTheme(ThemeBase):
             @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 """
@@ -168,14 +165,47 @@ class SiteTheme(ThemeBase):
                     }
         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: