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