1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - ep2008 (EuroPython 2008) theme 4 5 @copyright: 2003-2008 by Nir Soffer, Thomas Waldmann, Paul Boddie 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 """ 8 9 from MoinMoin.theme import ThemeBase 10 from MoinMoin.action import AttachFile 11 import random 12 13 class Theme(ThemeBase): 14 15 name = "ep2008" 16 17 def rsslink(self, d=None): 18 """ Create rss link in head, used by FireFox 19 20 RSS link for FireFox. This shows an rss link in the bottom of 21 the page and let you subscribe to the wiki rss feed. 22 23 @rtype: unicode 24 @return: html head 25 """ 26 27 extra_rss = self.cfg.extra_rss 28 if d is not None: 29 return ThemeBase.rsslink(self, d) + u'\n' + extra_rss 30 else: 31 return ThemeBase.rsslink(self) + u'\n' + extra_rss 32 33 def header(self, d, **kw): 34 """ Assemble wiki header 35 36 @param d: parameter dictionary 37 @rtype: unicode 38 @return: page header html 39 """ 40 html = [ 41 # Pre header custom html 42 self.emit_custom_html(self.cfg.page_header1), 43 44 # Header 45 u'<div id="header">', 46 self.logo(), 47 48 # Banner 49 self.banner(d), 50 51 self.searchform(d), 52 self.navibar(d), 53 self.msg(d), 54 55 # NOTE: Hack everything into the header 56 u'<div id="end-of-header">', 57 u'</div>', 58 u'</div>', 59 60 # Post header custom html (not recommended) 61 self.emit_custom_html(self.cfg.page_header2), 62 63 # Start of page 64 u'<div class="page-%s">' % d['page_name'], 65 self.startPage(), 66 ] 67 return u'\n'.join(html) 68 69 def editorheader(self, d, **kw): 70 """ Assemble wiki header for editor 71 72 @param d: parameter dictionary 73 @rtype: unicode 74 @return: page header html 75 """ 76 html = [ 77 # Pre header custom html 78 self.emit_custom_html(self.cfg.page_header1), 79 80 # Header 81 u'<div id="header">', 82 self.title(d), 83 self.msg(d), 84 u'</div>', 85 86 # Post header custom html (not recommended) 87 self.emit_custom_html(self.cfg.page_header2), 88 89 # Start of page 90 u'<div class="page-%s">' % d['page_name'], 91 self.startPage(), 92 ] 93 return u'\n'.join(html) 94 95 def footer(self, d, **keywords): 96 """ Assemble wiki footer 97 98 @param d: parameter dictionary 99 @keyword ...:... 100 @rtype: unicode 101 @return: page footer html 102 """ 103 request = self.request 104 formatter = request.formatter 105 page = d['page'] 106 107 if self.cfg.special_username: 108 username = self.specialUsername(d) 109 else: 110 username = self.username(d) 111 112 html = [ 113 # End of page 114 #self.pageinfo(page), 115 self.endPage(), 116 u'</div>', 117 118 # Pre footer custom html (not recommended!) 119 self.emit_custom_html(self.cfg.page_footer1), 120 121 # Footer 122 u'<div id="footer">', 123 u'<div id="contact">', 124 formatter.pagelink(1, self.cfg.contact_page), 125 self.cfg.contact_label, 126 formatter.pagelink(0), 127 u'</div>', 128 u'<div id="contribute">', 129 #self.cfg.contribute_string, 130 #u'<div class="contribute-hidden">', 131 #self.username(d), 132 #u'<div id="locationline">', 133 #self.interwiki(d), 134 #self.title(d), 135 #u'</div>', 136 username, 137 self.editbar(d), 138 self.trail(d), 139 #u'</div>', 140 u'</div>', 141 self.credits(d), 142 self.showversion(d, **keywords), 143 u'</div>', 144 145 # Post footer custom html 146 self.emit_custom_html(self.cfg.page_footer2), 147 ] 148 return u'\n'.join(html) 149 150 def editbarItems(self, page): 151 """ Return list of items to show on the editbar 152 153 This is separate method to make it easy to customize the 154 editbar in sub classes. 155 """ 156 157 request = self.request 158 159 items = [self.editorLink(page), 160 self.infoLink(page), 161 self.subscribeLink(page), 162 self.quicklinkLink(page),] 163 164 if page.isWritable() and request.user.valid and request.user.may.write(page.page_name): 165 items.append(self.attachmentsLink(page)) 166 167 if request.user.valid: 168 items.append(self.actionsMenu(page)) 169 170 return items 171 172 def specialUsername(self, d): 173 request = self.request 174 _ = request.getText 175 176 if request.user.valid and request.user.name: 177 return u'<div class="username">%s</div>' % request.formatter.text(request.user.name) 178 else: 179 # NOTE: Using the contribute string! 180 return u'<div class="no-username">%s</div>' % \ 181 d['page'].link_to(request, text=self.cfg.contribute_string, 182 querystr={'action': 'login'}, id="login") 183 184 def banner(self, d): 185 request = self.request 186 formatter = request.formatter 187 188 # Either get banners per page or acquire them from a central source. 189 190 if self.cfg.banner_per_page: 191 pagename = d["page"].page_name 192 else: 193 pagename = self.cfg.banner_attachment_page 194 195 # Only get attachments with a certain prefix. 196 197 attachments = [] 198 for filename in AttachFile._get_files(request, pagename): 199 if filename.startswith(self.cfg.banner_prefix): 200 attachments.append(filename) 201 202 # Display the default banner if no attachments are found. 203 204 target = self.cfg.banner_link_page 205 206 if not attachments: 207 return "%s%s%s" % (formatter.pagelink(1, target), 208 self.cfg.banner_string, 209 formatter.pagelink(0)) 210 211 # Choose an attachment at random and return the HTML to show it. 212 213 attachment = random.choice(attachments) 214 215 kw = {} 216 kw['src'] = AttachFile.getAttachUrl(pagename, attachment, request) 217 kw['alt'] = self.cfg.banner_alt_text 218 kw['id'] = u'banner' 219 220 return "%s%s%s" % (formatter.pagelink(1, target), 221 formatter.image(**kw), 222 formatter.pagelink(0)) 223 224 def execute(request): 225 """ 226 Generate and return a theme object 227 228 @param request: the request object 229 @rtype: MoinTheme 230 @return: Theme object 231 """ 232 return Theme(request) 233 234 # vim: tabstop=4 expandtab shiftwidth=4