1 # -*- coding: iso-8859-1 -*- 2 3 """ 4 MoinMoin - MinimalMoin theme 5 @copyright: 2009, 2010 Paul Boddie <paul@boddie.org.uk> 6 @copyright: (portions) 2003-2008 MoinMoin:ThomasWaldmann, 2003-2005 Nir Soffer 7 @license: GNU GPL (v2 or later), see COPYING.txt for details. 8 """ 9 10 from MoinMoin.theme import ThemeBase 11 from MoinMoin import i18n 12 from MoinMoin import wikiutil 13 from MoinMoin import version 14 from MoinMoin.Page import Page 15 import re 16 17 class Theme(ThemeBase): 18 19 name = "minimalmoin" 20 21 # Icon definitions from the modernized theme... 22 23 _ = lambda x: x # We don't have gettext at this moment, so we fake it 24 icons = { 25 # key alt icon filename w h 26 # FileAttach 27 'attach': ("%(attach_count)s", "moin-attach.png", 16, 16), 28 'info': ("[INFO]", "moin-info.png", 16, 16), 29 'attachimg': (_("[ATTACH]"), "attach.png", 32, 32), 30 # RecentChanges 31 'rss': (_("[RSS]"), "moin-rss.png", 16, 16), 32 'deleted': (_("[DELETED]"), "moin-deleted.png", 16, 16), 33 'updated': (_("[UPDATED]"), "moin-updated.png", 16, 16), 34 'renamed': (_("[RENAMED]"), "moin-renamed.png", 16, 16), 35 'conflict': (_("[CONFLICT]"), "moin-conflict.png", 16, 16), 36 'new': (_("[NEW]"), "moin-new.png", 16, 16), 37 'diffrc': (_("[DIFF]"), "moin-diff.png", 16, 16), 38 # General 39 'bottom': (_("[BOTTOM]"), "moin-bottom.png", 16, 16), 40 'top': (_("[TOP]"), "moin-top.png", 16, 16), 41 'www': ("[WWW]", "moin-www.png", 16, 16), 42 'mailto': ("[MAILTO]", "moin-email.png", 16, 16), 43 'news': ("[NEWS]", "moin-news.png", 16, 16), 44 'telnet': ("[TELNET]", "moin-telnet.png", 16, 16), 45 'ftp': ("[FTP]", "moin-ftp.png", 16, 16), 46 'file': ("[FILE]", "moin-ftp.png", 16, 16), 47 # search forms 48 'searchbutton': ("[?]", "moin-search.png", 16, 16), 49 'interwiki': ("[%(wikitag)s]", "moin-inter.png", 16, 16), 50 51 # smileys (this is CONTENT, but good looking smileys depend on looking 52 # adapted to the theme background color and theme style in general) 53 #vvv == vvv this must be the same for GUI editor converter 54 'X-(': ("X-(", 'angry.png', 16, 16), 55 ':D': (":D", 'biggrin.png', 16, 16), 56 '<:(': ("<:(", 'frown.png', 16, 16), 57 ':o': (":o", 'redface.png', 16, 16), 58 ':(': (":(", 'sad.png', 16, 16), 59 ':)': (":)", 'smile.png', 16, 16), 60 'B)': ("B)", 'smile2.png', 16, 16), 61 ':))': (":))", 'smile3.png', 16, 16), 62 ';)': (";)", 'smile4.png', 16, 16), 63 '/!\\': ("/!\\", 'alert.png', 16, 16), 64 '<!>': ("<!>", 'attention.png', 16, 16), 65 '(!)': ("(!)", 'idea.png', 16, 16), 66 ':-?': (":-?", 'tongue.png', 16, 16), 67 ':\\': (":\\", 'ohwell.png', 16, 16), 68 '>:>': (">:>", 'devil.png', 16, 16), 69 '|)': ("|)", 'tired.png', 16, 16), 70 ':-(': (":-(", 'sad.png', 16, 16), 71 ':-)': (":-)", 'smile.png', 16, 16), 72 'B-)': ("B-)", 'smile2.png', 16, 16), 73 ':-))': (":-))", 'smile3.png', 16, 16), 74 ';-)': (";-)", 'smile4.png', 16, 16), 75 '|-)': ("|-)", 'tired.png', 16, 16), 76 '(./)': ("(./)", 'checkmark.png', 16, 16), 77 '{OK}': ("{OK}", 'thumbs-up.png', 16, 16), 78 '{X}': ("{X}", 'icon-error.png', 16, 16), 79 '{i}': ("{i}", 'icon-info.png', 16, 16), 80 '{1}': ("{1}", 'prio1.png', 15, 13), 81 '{2}': ("{2}", 'prio2.png', 15, 13), 82 '{3}': ("{3}", 'prio3.png', 15, 13), 83 '{*}': ("{*}", 'star_on.png', 16, 16), 84 '{o}': ("{o}", 'star_off.png', 16, 16), 85 } 86 del _ 87 88 def header(self, d, **kw): 89 """ Assemble page header 90 91 @param d: parameter dictionary 92 @rtype: unicode 93 @return: page header html 94 """ 95 96 request = self.request 97 fmt = request.formatter 98 html = [] 99 100 # NOTE: Some pages cause section numbers to be enabled, affecting the 101 # NOTE: theme. 102 103 show_section_numbers = fmt._show_section_numbers 104 fmt._show_section_numbers = 0 105 106 # The header section. 107 108 html.append(fmt.div(on=1, attr={"id" : "header"})) 109 110 html.append(self.title(d)) 111 html.append(self.about(d)) 112 html.append(self.mainpages(d)) 113 114 html.append(fmt.div(on=0)) 115 116 # Show any pertinent message. 117 118 html.append(self.msg(d)) 119 120 # Complete the header. 121 122 html.append(self.startPage()) 123 124 # NOTE: Some pages cause section numbers to be enabled, affecting the 125 # NOTE: theme. 126 127 fmt._show_section_numbers = show_section_numbers 128 129 return u''.join(html) 130 131 editorheader = header 132 133 def footer(self, d, **kw): 134 """ Assemble page footer 135 136 @param d: parameter dictionary 137 @rtype: unicode 138 @return: page footer html 139 """ 140 141 request = self.request 142 fmt = request.formatter 143 _ = request.getText 144 page = d["page"] 145 html = [] 146 147 # NOTE: Some pages cause section numbers to be enabled, affecting the 148 # NOTE: theme. 149 150 show_section_numbers = fmt._show_section_numbers 151 fmt._show_section_numbers = 0 152 153 # End the page. 154 155 html.append(self.endPage()) 156 157 # The footer section. 158 159 html.append(fmt.div(on=1, attr={"id" : "footer"})) 160 161 if self.shouldShowEditbar(page): 162 html.append(self.menuholder(d, {"class" : "editing"}, _("Editing options"), self.editbar)) 163 html.append(self.menuholder(d, {"id" : "navigation"}, _("Useful pages"), self.navibar)) 164 html.append(self.menuholder(d, {"id" : "identity"}, _("User information"), self.username)) 165 166 #html.append(self.trail(d)) 167 168 html.append(fmt.div(on=0)) 169 170 # NOTE: Some pages cause section numbers to be enabled, affecting the 171 # NOTE: theme. 172 173 fmt._show_section_numbers = show_section_numbers 174 175 return u''.join(html) 176 177 def mainpages(self, d, **kw): 178 """ Link to the front page and potentially other pages. 179 180 @param d: parameter dictionary 181 @rtype: unicode 182 @return: front page link html 183 """ 184 185 request = self.request 186 fmt = request.formatter 187 _ = request.getText 188 html = [] 189 190 page = wikiutil.getFrontPage(self.request) 191 192 html.append(fmt.bullet_list(on=1, attr={"id" : "mainpages"})) 193 html.append(fmt.listitem(on=1)) 194 html.append(page.link_to(request, text=_("Front page"), rel='nofollow')) 195 html.append(fmt.listitem(on=0)) 196 html.append(fmt.bullet_list(on=0)) 197 198 return u''.join(html) 199 200 def about(self, d, **kw): 201 """ Link to the controls in the footer. 202 203 @param d: parameter dictionary 204 @rtype: unicode 205 @return: about link html 206 """ 207 208 request = self.request 209 fmt = request.formatter 210 _ = request.getText 211 html = [] 212 213 html.append(fmt.bullet_list(on=1, attr={"id" : "pageabout"})) 214 html.append(fmt.listitem(on=1)) 215 216 html.append(fmt.anchorlink(on=1, name="footer")) 217 html.append(fmt.text(_("About this page"))) 218 html.append(fmt.anchorlink(on=0)) 219 220 html.append(fmt.listitem(on=0)) 221 html.append(fmt.bullet_list(on=0)) 222 223 return u''.join(html) 224 225 def menuholder(self, d, menu_attr, menu_title, menu_fn): 226 """ Wrap controls in a menu container. 227 228 @param d: parameter dictionary 229 @param menu_attr: menu container element attributes 230 @param menu_title: the menu label text 231 @param menu_fn: the function or method producing the controls 232 @rtype: unicode 233 @return: menu container html 234 """ 235 236 request = self.request 237 fmt = request.formatter 238 html = [] 239 240 html.append(fmt.div(on=1, attr=menu_attr)) 241 html.append(fmt.span(on=1, attr={"class" : "menutitleholder"})) 242 html.append(fmt.span(on=1, attr={"class" : "menutitle"})) 243 html.append(fmt.text(menu_title)) 244 html.append(fmt.span(on=0)) 245 html.append(menu_fn(d)) 246 html.append(fmt.span(on=0)) 247 html.append(fmt.div(on=0)) 248 249 return u''.join(html) 250 251 # Theme instantiation. 252 253 def execute(request): 254 """ 255 Generate and return a theme object 256 257 @param request: the request object 258 @rtype: MoinTheme 259 @return: Theme object 260 """ 261 return Theme(request) 262 263 # vim: tabstop=4 expandtab shiftwidth=4