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