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