1 # -*- coding: iso-8859-1 -*-
3 MoinMoin - Generic website theme.
5 @copyright: 2009+ Matthijs Kooijman
6 @license: GNU GPL, see COPYING for details.
8 This theme is meant for wiki's that are meant to function as a website,
9 meaning nothing fancy and wiki-ish (at least when you're not logged in).
11 This theme is meant to be subclassed. Subclasses should at least define a
12 name, and possibly override other stuff.
15 from MoinMoin.theme import ThemeBase
16 from MoinMoin.Page import Page
17 from MoinMoin import wikiutil
18 from StringIO import StringIO
20 class SiteTheme(ThemeBase):
23 if self.request.user.valid:
24 return ThemeBase.editbar(self, d)
28 def searchform(self, d):
29 if self.request.user.valid:
30 return ThemeBase.searchform(self, d)
35 if self.request.user.valid:
36 return ThemeBase.navibar(self, d)
40 def header(self, d, **kw):
41 """ Assemble wiki header
43 @param d: parameter dictionary
45 @return: page header html
48 # Pre header custom html
49 self.emit_custom_html(self.cfg.page_header1),
56 #u'<div id="locationline">',
61 #u'<hr id="pageline">',
62 #u'<div id="pageline"><hr style="display:none;"></div>',
66 # Post header custom html (not recommended)
67 self.emit_custom_html(self.cfg.page_header2),
75 return u'\n'.join(html)
77 def editorheader(self, d, **kw):
78 """ Assemble wiki header for editor
80 @param d: parameter dictionary
82 @return: page header html
85 # Pre header custom html
86 self.emit_custom_html(self.cfg.page_header1),
94 # Post header custom html (not recommended)
95 self.emit_custom_html(self.cfg.page_header2),
101 return u'\n'.join(html)
103 def footer(self, d, **keywords):
104 """ Assemble wiki footer
106 @param d: parameter dictionary
109 @return: page footer html
116 # Pre footer custom html (not recommended!)
117 self.emit_custom_html(self.cfg.page_footer1),
120 u'<div id="footer">',
126 #self.showversion(d, **keywords),
127 u'<div id="footerbottom"></div>',
130 # Post footer custom html
131 self.emit_custom_html(self.cfg.page_footer2),
133 return u'\n'.join(html)
136 """ Assemble a "main" menu
138 @param d: parameter dictionary
142 menu = Page(self.request, 'Site/Menu')
143 return u'<div id="menubar">%s</div>' % parse_wiki_page(self.request, menu)
145 def theme_script(self, name):
146 """ Format script html from this theme's static dir """
147 src = '%s/%s/js/%s.js' % (self.request.cfg.url_prefix_static, self.name, name)
148 return '<script type="text/javascript" src="%s"></script>' % src
150 def pageinfo(self, page):
151 """ Output page name and "last modified". This overwrites the pageinfo
152 from ThemeBase to hide the username, which is useless and always
153 produces a link to the non-existing homepage of the last editor. """
154 _ = self.request.getText
156 if self.shouldShowPageinfo(page):
157 info = page.lastEditInfo()
159 info = _("last modified %(time)s") % info
160 pagename = page.page_name
161 info = "%s (%s)" % (wikiutil.escape(pagename), info)
162 html = '<p id="pageinfo" class="info"%(lang)s>%(info)s</p>\n' % {
163 'lang': self.ui_lang_attr(),
168 def startPage(self, d):
169 # This opens up #page
170 html = ThemeBase.startPage(self)
171 html += u'<div id="pagetop"></div>\n'
172 html += u'<div id="pagemiddle">\n'
175 def endPage(self, d):
176 html = u'</div><!-- #pagemiddle -->\n'
177 html += ThemeBase.endPage(self)
178 # This adds #pagebottom and closes #page
181 def parse_wiki_page(request, page):
183 This is an ugly hack to render a page into a string. By default,
184 formatters render using request.write automatically, which prevents us
185 from capturing the output. By disguising a StringIO buffer as a request
186 object, we manage to get at the rendered contents.
188 However, when {{{#!wiki or similar blocks are used, stuff breaks (since
189 that creates a second parser that doesn't get our StringIO buffer).
191 Parser = wikiutil.searchAndImportPlugin(request.cfg, "parser", 'wiki')
192 # Create a stringIO buffer, to capture the output
194 # Make the buffer look like the request, since the parser writes
195 # directly to the request
196 buffer.form = request.form
197 buffer.getText = request.getText
198 buffer.cfg = request.cfg
199 # Create a new formatter. Since we need to set its page, we can't use
201 from MoinMoin.formatter.text_html import Formatter
202 formatter = Formatter(request)
203 formatter.setPage(page)
205 # Create the parser and parse the page
206 parser = Parser(page.data, buffer)
207 parser.format(formatter)
208 # Return the captured buffer
209 return buffer.getvalue()
211 # vim: set sw=4 sts=4 expandtab: