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 if not attachments: 183 return self.cfg.banner_string 184 185 # Choose an attachment at random and return the HTML to show it. 186 187 attachment = random.choice(attachments) 188 189 kw = {} 190 kw['src'] = AttachFile.getAttachUrl(pagename, attachment, request) 191 kw['alt'] = self.cfg.banner_alt_text 192 kw['id'] = u'banner' 193 194 target = self.cfg.banner_link_page 195 196 return "%s%s%s" % (formatter.pagelink(1, target), 197 formatter.image(**kw), 198 formatter.pagelink(0)) 199 200 def execute(request): 201 """ 202 Generate and return a theme object 203 204 @param request: the request object 205 @rtype: MoinTheme 206 @return: Theme object 207 """ 208 return Theme(request) 209 210 # vim: tabstop=4 expandtab shiftwidth=4