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