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, see COPYING 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 page = d['page'] 88 89 if self.cfg.special_username: 90 username = self.specialUsername(d) 91 else: 92 username = self.username(d) 93 94 html = [ 95 # End of page 96 self.pageinfo(page), 97 self.endPage(), 98 u'</div>', 99 100 # Pre footer custom html (not recommended!) 101 self.emit_custom_html(self.cfg.page_footer1), 102 103 # Footer 104 u'<div id="footer">', 105 self.cfg.contact_string, 106 u'<div id="contribute">', 107 #self.cfg.contribute_string, 108 #u'<div class="contribute-hidden">', 109 #self.username(d), 110 #u'<div id="locationline">', 111 #self.interwiki(d), 112 #self.title(d), 113 #u'</div>', 114 username, 115 self.editbar(d), 116 self.trail(d), 117 #u'</div>', 118 u'</div>', 119 self.credits(d), 120 self.showversion(d, **keywords), 121 u'</div>', 122 123 # Post footer custom html 124 self.emit_custom_html(self.cfg.page_footer2), 125 ] 126 return u'\n'.join(html) 127 128 def editbarItems(self, page): 129 """ Return list of items to show on the editbar 130 131 This is separate method to make it easy to customize the 132 editbar in sub classes. 133 """ 134 135 request = self.request 136 137 items = [self.editorLink(page), 138 self.infoLink(page), 139 self.subscribeLink(page), 140 self.quicklinkLink(page),] 141 142 if page.isWritable() and request.user.valid and request.user.may.write(page.page_name): 143 items.append(self.attachmentsLink(page)) 144 145 if request.user.valid: 146 items.append(self.actionsMenu(page)) 147 148 return items 149 150 def specialUsername(self, d): 151 request = self.request 152 _ = request.getText 153 154 if request.user.valid and request.user.name: 155 return u'<div class="username">%s</div>' % request.formatter.text(request.user.name) 156 else: 157 # NOTE: Using the contribute string! 158 return u'<div class="no-username">%s</div>' % \ 159 d['page'].link_to(request, text=self.cfg.contribute_string, 160 querystr={'action': 'login'}, id="login") 161 162 def banner(self, d): 163 request = self.request 164 formatter = request.formatter 165 166 # Either get banners per page or acquire them from a central source. 167 168 if self.cfg.banner_per_page: 169 pagename = d["page"].page_name 170 else: 171 pagename = self.cfg.banner_attachment_page 172 173 # Only get attachments with a certain prefix. 174 175 attachments = [] 176 for filename in AttachFile._get_files(request, pagename): 177 if filename.startswith(self.cfg.banner_prefix): 178 attachments.append(filename) 179 180 # Display the default banner if no attachments are found. 181 182 target = self.cfg.banner_link_page 183 184 if not attachments: 185 return "%s%s%s" % (formatter.pagelink(1, target), 186 self.cfg.banner_string, 187 formatter.pagelink(0)) 188 189 # Choose an attachment at random and return the HTML to show it. 190 191 attachment = random.choice(attachments) 192 193 kw = {} 194 kw['src'] = AttachFile.getAttachUrl(pagename, attachment, request) 195 kw['alt'] = self.cfg.banner_alt_text 196 kw['id'] = u'banner' 197 198 return "%s%s%s" % (formatter.pagelink(1, target), 199 formatter.image(**kw), 200 formatter.pagelink(0)) 201 202 def execute(request): 203 """ 204 Generate and return a theme object 205 206 @param request: the request object 207 @rtype: MoinTheme 208 @return: Theme object 209 """ 210 return Theme(request) 211 212 # vim: tabstop=4 expandtab shiftwidth=4