Changes to work with Lenny MoinMoin 1.7, not ideal solution
[deb/moinmoin.git] / theme / debwiki.py
1 # -*- coding: iso-8859-1 -*-
2 """
3     MoinMoin - modern theme
4
5     @copyright: 2003-2005 Nir Soffer, Thomas Waldmann
6     @license: GNU GPL, see COPYING for details.
7 """
8
9 from MoinMoin.theme import ThemeBase
10 from MoinMoin import wikiutil
11 from MoinMoin.Page import Page
12
13 class Theme(ThemeBase):
14
15     name = "debwiki"
16
17     _ = lambda x: x     # We don't have gettext at this moment, so we fake it
18     icons = {
19         # key         alt                        icon filename      w   h
20         # FileAttach
21         'attach':     ("%(attach_count)s",       "moin-attach.png",   16, 16),
22         'info':       ("[INFO]",                 "moin-info.png",     16, 16),
23         'attachimg':  (_("[ATTACH]"),            "attach.png",        32, 32),
24         # RecentChanges
25         'rss':        (_("[RSS]"),               "moin-rss.png",      16, 16),
26         'deleted':    (_("[DELETED]"),           "moin-deleted.png",  16, 16),
27         'updated':    (_("[UPDATED]"),           "moin-updated.png",  16, 16),
28         'renamed':    (_("[RENAMED]"),           "moin-renamed.png",  16, 16),
29         'conflict':   (_("[CONFLICT]"),          "moin-conflict.png", 16, 16),
30         'new':        (_("[NEW]"),               "moin-new.png",      16, 16),
31         'diffrc':     (_("[DIFF]"),              "moin-diff.png",     16, 16),
32         # General
33         'bottom':     (_("[BOTTOM]"),            "moin-bottom.png",   16, 16),
34         'top':        (_("[TOP]"),               "moin-top.png",      16, 16),
35         'www':        ("[WWW]",                  "moin-www.png",      16, 16),
36         'mailto':     ("[MAILTO]",               "moin-email.png",    16, 16),
37         'news':       ("[NEWS]",                 "moin-news.png",     16, 16),
38         'telnet':     ("[TELNET]",               "moin-telnet.png",   16, 16),
39         'ftp':        ("[FTP]",                  "moin-ftp.png",      16, 16),
40         'file':       ("[FILE]",                 "moin-ftp.png",      16, 16),
41         # search forms
42         'searchbutton': ("[?]",                  "moin-search.png",   16, 16),
43         'interwiki':  ("[%(wikitag)s]",          "moin-inter.png",    16, 16),
44
45         # smileys (this is CONTENT, but good looking smileys depend on looking
46         # adapted to the theme background color and theme style in general)
47         #vvv    ==      vvv  this must be the same for GUI editor converter
48         'X-(':        ("X-(",                    'angry.png',         16, 16),
49         ':D':         (":D",                     'biggrin.png',       16, 16),
50         '<:(':        ("<:(",                    'frown.png',         16, 16),
51         ':o':         (":o",                     'redface.png',       16, 16),
52         ':(':         (":(",                     'sad.png',           16, 16),
53         ':)':         (":)",                     'smile.png',         16, 16),
54         'B)':         ("B)",                     'smile2.png',        16, 16),
55         ':))':        (":))",                    'smile3.png',        16, 16),
56         ';)':         (";)",                     'smile4.png',        16, 16),
57         '/!\\':       ("/!\\",                   'alert.png',         16, 16),
58         '<!>':        ("<!>",                    'attention.png',     16, 16),
59         '(!)':        ("(!)",                    'idea.png',          16, 16),
60         ':-?':        (":-?",                    'tongue.png',        16, 16),
61         ':\\':        (":\\",                    'ohwell.png',        16, 16),
62         '>:>':        (">:>",                    'devil.png',         16, 16),
63         '|)':         ("|)",                     'tired.png',         16, 16),
64         ':-(':        (":-(",                    'sad.png',           16, 16),
65         ':-)':        (":-)",                    'smile.png',         16, 16),
66         'B-)':        ("B-)",                    'smile2.png',        16, 16),
67         ':-))':       (":-))",                   'smile3.png',        16, 16),
68         ';-)':        (";-)",                    'smile4.png',        16, 16),
69         '|-)':        ("|-)",                    'tired.png',         16, 16),
70         '(./)':       ("(./)",                   'checkmark.png',     16, 16),
71         '{OK}':       ("{OK}",                   'thumbs-up.png',     16, 16),
72         '{X}':        ("{X}",                    'icon-error.png',    16, 16),
73         '{i}':        ("{i}",                    'icon-info.png',     16, 16),
74         '{1}':        ("{1}",                    'prio1.png',         15, 13),
75         '{2}':        ("{2}",                    'prio2.png',         15, 13),
76         '{3}':        ("{3}",                    'prio3.png',         15, 13),
77         '{*}':        ("{*}",                    'star_on.png',       16, 16),
78         '{o}':        ("{o}",                    'star_off.png',      16, 16),
79     }
80     del _
81     def header(self, d, **kw):
82         """ Assemble wiki header
83
84         @param d: parameter dictionary
85         @rtype: unicode
86         @return: page header html
87         """
88         html = [
89             # Pre header custom html
90             self.emit_custom_html(self.cfg.page_header1),
91
92             # Header
93             u'<div id="header">',
94                         u'<div id="wikisection">',
95                         u'<p class="section"><a href="/" title="Debian Wiki Homepage">Wiki</a></p>',
96             self.username(d),
97                         u'</div>',
98                         u'<div id="navbar">',
99             self.navibar(d),
100                         u'</div>',
101             self.searchform(d),
102             self.logo(),
103             self.interwiki(d),
104                         #u'<a href="/" title="wiki home">Wiki</a> / ',
105                         u'<div id="breadcrumbs"><a href="/" title="Debian Wiki Homepage">Wiki</a><span class="sep">/</span>',self.trail(d),
106                         u'</div>',
107             #u'<hr id="pageline">',
108             #u'<div id="pageline"><hr style="display:none;"></div>',
109             self.msg(d),
110             self.editbar(d),
111             u'<h1 id="locationline">',
112             self.interwiki(d),
113                         #self.title_with_separators(d),
114                         self.title(d),
115             u'</h1>',
116             u'</div>',
117
118             # Post header custom html (not recommended)
119             self.emit_custom_html(self.cfg.page_header2),
120
121             # Start of page
122             self.startPage(),
123         ]
124         return u'\n'.join(html)
125
126     def editorheader(self, d, **kw):
127         """ Assemble wiki header for editor
128
129         @param d: parameter dictionary
130         @rtype: unicode
131         @return: page header html
132         """
133         html = [
134             # Pre header custom html
135             self.emit_custom_html(self.cfg.page_header1),
136
137             # Header
138             u'<div id="header">',
139             u'<h1 id="locationline">',
140             self.title_with_separators(d),
141             u'</h1>',
142             self.msg(d),
143             u'</div>',
144
145             # Post header custom html (not recommended)
146             self.emit_custom_html(self.cfg.page_header2),
147
148             # Start of page
149             self.startPage(),
150         ]
151         return u'\n'.join(html)
152
153     def footer(self, d, **keywords):
154         """ Assemble wiki footer
155
156         @param d: parameter dictionary
157         @keyword ...:...
158         @rtype: unicode
159         @return: page footer html
160         """
161         page = d['page']
162         html = [
163             # End of page
164             self.endPage(),
165
166             # Pre footer custom html (not recommended!)
167             self.emit_custom_html(self.cfg.page_footer1),
168
169             # Footer
170             u'<div id="footer">',
171         #    self.editbar(d),
172             self.pageinfo(page),
173             self.credits(d),
174             self.showversion(d, **keywords),
175             u'</div>',
176
177             # Post footer custom html
178             self.emit_custom_html(self.cfg.page_footer2),
179             ]
180         return u'\n'.join(html)
181
182     def username(self, d):
183         """ Assemble the username / userprefs link
184
185         @param d: parameter dictionary
186         @rtype: unicode
187         @return: username html
188         """
189         request = self.request
190         _ = request.getText
191
192         userlinks = []
193         # Add username/homepage link for registered users. We don't care
194         # if it exists, the user can create it.
195         if request.user.valid and request.user.name:
196             interwiki = wikiutil.getInterwikiHomePage(request)
197             name = request.user.name
198             aliasname = request.user.aliasname
199             if not aliasname:
200                 aliasname = name
201             title = "%s @ %s" % (aliasname, interwiki[0])
202             # link to (interwiki) user homepage
203             homelink = (request.formatter.interwikilink(1, title=title, id="userhome", generated=True, *interwiki) +
204                         request.formatter.text(name) +
205                         request.formatter.interwikilink(0, title=title, id="userhome", *interwiki))
206             userlinks.append(homelink)
207             # link to userprefs action
208             if 'userprefs' not in self.request.cfg.actions_excluded:
209                 userlinks.append(d['page'].link_to(request, text=_('Settings'),
210                                                querystr={'action': 'userprefs'}, id='userprefs', rel='nofollow'))
211
212         if request.user.valid:
213             if request.user.auth_method in request.cfg.auth_can_logout:
214                 userlinks.append(d['page'].link_to(request, text=_('Logout'),
215                                                    querystr={'action': 'logout', 'logout': 'logout'}, id='logout', rel='nofollow'))
216         else:
217             query = {'action': 'login'}
218             # special direct-login link if the auth methods want no input
219             if request.cfg.auth_login_inputs == ['special_no_input']:
220                 query['login'] = '1'
221             if request.cfg.auth_have_login:
222                 userlinks.append(d['page'].link_to(request, text=_("Login"),
223                                                    querystr=query, id='login', rel='nofollow'))
224
225         userlinks_html = u'<span class="sep"> | </span>'.join(userlinks)
226         html = u'<div id="username">%s</div>' % userlinks_html
227         return html
228
229     def trail(self, d):
230         """ Assemble page trail
231
232         @param d: parameter dictionary
233         @rtype: unicode
234         @return: trail html
235         """
236         request = self.request
237         user = request.user
238         html = ''
239         if not user.valid or user.show_page_trail:
240             trail = user.getTrail()
241             if trail:
242                 items = []
243                 for pagename in trail:
244                     try:
245                         interwiki, page = wikiutil.split_interwiki(pagename)
246                         if interwiki != request.cfg.interwikiname and interwiki != 'Self':
247                             link = (self.request.formatter.interwikilink(True, interwiki, page) +
248                                     self.shortenPagename(page) +
249                                     self.request.formatter.interwikilink(False, interwiki, page))
250                             items.append(link)
251                             continue
252                         else:
253                             pagename = page
254
255                     except ValueError:
256                         pass
257                     page = Page(request, pagename)
258                     title = page.split_title()
259                     title = self.shortenPagename(title)
260                     link = page.link_to(request, title)
261                     items.append(link)
262                 html = u'<div id="pagetrail">%s</div>'% u'<span class="sep">/</span>'.join(items)
263         return html
264
265     def interwiki(self, d):
266         """ Assemble the interwiki name display, linking to page_front_page
267
268         @param d: parameter dictionary
269         @rtype: string
270         @return: interwiki html
271         """
272         if self.request.cfg.show_interwiki:
273             page = wikiutil.getFrontPage(self.request)
274             text = self.request.cfg.interwikiname or 'Self'
275             link = page.link_to(self.request, text=text, rel='nofollow')
276             html = u'<span id="interwiki">%s<span class="sep">: </span></span>' % link
277         else:
278             html = u''
279         return html
280
281 def execute(request):
282     """
283     Generate and return a theme object
284
285     @param request: the request object
286     @rtype: MoinTheme
287     @return: Theme object
288     """
289     return Theme(request)
290