1 # -*- coding: iso-8859-1 -*-
3 MoinMoin - sinorca4moin theme
7 Inspired by Haran's sinorca-design published at www.oswd.org.
11 @license: GNU GPL, see COPYING for details.
16 from MoinMoin.theme import ThemeBase
17 from MoinMoin.Page import Page
18 from MoinMoin.config.multiconfig import _url_re_list, _makeConfig, _getConfigName
19 from MoinMoin import wikiutil, error
22 class Theme(ThemeBase):
26 def farmWikiList(self):
28 Generate list of links pointing to the wikis of the farm
30 Fore each Subwiki a link to Frontpage and RecentChanges (image) is
31 created. If interwiki_preferred is specified in the farmconfig the
32 links will be created only for these wikis else links to all wikis
33 in farmconfig.wiki will be created.
35 _ = self.request.getText
36 farmwikis = [wiki_name for wiki_name, reg in _url_re_list()]
37 if self.request.cfg.interwiki_preferred:
38 wikis = self.request.cfg.interwiki_preferred
39 # remove everything that is not a wiki of the farm
40 wikis = [w for w in wikis if w in farmwikis]
45 return [] # creating links is useless for one wiki
48 for wiki_name in wikis:
49 cfg = _makeConfig(wiki_name)
51 if wiki_name == _getConfigName(self.request.url):
52 highlight = u' class="highlight"'
54 interwiki_list = wikiutil.load_wikimap(self.request)
55 wiki_url = interwiki_list[cfg.interwikiname]
56 rc = _("RecentChanges")
57 linkList.append(''.join([
58 u' <a title="%s" href="%s"%s>%s</a>' %
59 (cfg.sitename, wiki_url, highlight, cfg.interwikiname),
60 u'<a title="%s" href="%s%s">' %
61 (rc, wiki_url, wikiutil.quoteWikinameURL(rc)),
62 u'<img src="%s/sinorca4moin/img/moin-diff.png" alt="%s"' %
63 (cfg.url_prefix_static, rc),
64 u' height="11" width="15"></a>',
66 except KeyError: # probably no interwikiname in config
68 Missing the wiki '%s' in the interwiki list.
70 Please add the interwiki-name and the url of this wiki to 'intermap.txt'.
72 #raise error.ConfigurationError(msg)
80 Links to subwikis if it's a farm else uses page_header2.
82 linkList = self.farmWikiList()
84 subheader = ' |\n'.join(linkList)
86 subheader = self.request.cfg.page_header2
88 u'<div class="subHeader">',
95 Assemble the title (not as html list as in standard method!)
97 Code copied from title-method in __init__.py - only one line was changed.
99 @param d: parameter dictionary
103 _ = self.request.getText
105 if d['title_text'] == d['page'].split_title(): # just showing a page,
106 curpage = '' # no action
107 segments = d['page_name'].split('/') # was: title_text
108 for s in segments[:-1]:
110 # next line is modified compared to method in _init__.py
111 content.append("%s / " % Page(self.request,
112 curpage).link_to(self.request, s))
114 link_text = segments[-1]
115 link_title = _('Click to do a full-text search for this title')
117 'action': 'fullsearch',
118 'value': 'linkto:"%s"' % d['page_name'],
121 # we dont use d['title_link'] any more, but make it ourselves:
122 link = d['page'].link_to(self.request, link_text,
124 title=link_title, css_class='backlink',
126 content.append(('<li>%s</li>') % link)
128 content.append('<li>%s</li>' % wikiutil.escape(d['title_text']))
131 <ul id="pagelocation">
134 ''' % "".join(content)
137 def iconbar(self, d):
141 @param d: parameter dictionary
143 @return: iconbar html
146 if self.cfg.page_iconbar and self.request.user.show_toolbar and d['page_name']:
147 iconbar.append('<ul id="iconbar">\n')
148 icons = self.cfg.page_iconbar[:]
151 if d['page_parent_page']:
152 iconbar.append('<li>%s</li>\n' % self.make_iconlink(icon, d))
153 elif icon == "subscribe" and self.cfg.mail_enabled:
154 iconbar.append('<li>%s</li>\n' % self.make_iconlink(
155 ["subscribe", "unsubscribe"][self.request.user.isSubscribedTo([d['page_name']])], d))
157 iconbar.append('<li>%s</li>\n' % self.make_iconlink(icon, d))
158 iconbar.append('</ul>\n')
159 return ''.join(iconbar)
161 def wikipanel(self, d):
162 """ Create wiki panel """
163 _ = self.request.getText
165 u'<div class="sidepanel">',
166 u'<h1>%s</h1>' % _("Wiki"),
170 return u'\n'.join(html)
172 def pagepanel(self, d):
173 """ Create page panel """
174 _ = self.request.getText
175 if self.shouldShowEditbar(d['page']):
177 u'<div class="sidepanel">',
178 u'<h1>%s</h1>' % _("Page"),
182 return u'\n'.join(html)
185 def userpanel(self, d):
186 """ Create user panel """
187 _ = self.request.getText
190 u'<div class="sidepanel">',
191 u'<h1>%s</h1>' % _("User"),
195 return u'\n'.join(html)
197 def linkedSitename(self):
198 """ Create title from sitename and link to FrontPage """
199 frontpage = wikiutil.getFrontPage(self.request).page_name
200 html = wikiutil.link_tag(self.request,
201 wikiutil.quoteWikinameURL(frontpage),
202 self.request.cfg.sitename)
205 def flexible_userhome(self, d):
206 """ Determine content in superheader and sidebar based on page_header1 """
207 if self.cfg.page_header1:
208 superheader = self.cfg.page_header1
209 userpanel = self.userpanel(d)
211 #superheader = self.username(d)
212 superheader = '\n'.join([
213 u' <div class="right">',
218 return superheader, userpanel
220 def shortenPagename(self, name):
222 Shorten page names (overrides default method)
224 Changes compared to default: for hierarchical names a part of
225 the first level is always shown.
227 @param name: page name, unicode
229 @return: shortened version of page name
231 l1Length = 8 # length to which level1 of page name will be truncated
232 maxLength = self.maxPagenameLength()
233 if len(name) > maxLength:
234 half, left = divmod(maxLength, 2)
235 name = name.split('/')
237 # select separator based on number of levels
239 nameStart, nameEnd = name[0], name[-1]
240 if (len(nameStart) + len(nameEnd) > maxLength-4
241 and len(nameStart) > l1Length):
243 if len(nameEnd) > maxLength-6-l1Length:
244 name = u'%s../../%s..' % (nameStart[:l1Length],
245 nameEnd[:maxLength-8-l1Length])
247 lenStart = max(maxLength-len(nameEnd)-6, l1Length)
248 name = u'%s../../%s' % (nameStart[:lenStart],
249 nameEnd[:maxLength-6-lenStart])
250 elif len(nameStart) + len(nameEnd) > maxLength-4:
252 name = u'%s/../%s..' % (nameStart,
253 nameEnd[:maxLength-6-len(nameStart)])
255 name = u'%s/../%s' % (nameStart, nameEnd)
257 nameStart, nameEnd = name[0], name[-1]
258 if (len(nameStart) + len(nameEnd) > maxLength-1
259 and len(nameStart) > l1Length):
261 if len(nameEnd) > maxLength-3-l1Length:
262 name = u'%s../%s..' % (nameStart[:l1Length],
263 nameEnd[:maxLength-5-l1Length])
265 lenStart = max(maxLength-len(nameEnd)-3, l1Length)
266 name = u'%s../%s' % (nameStart[:lenStart],
267 nameEnd[:maxLength-3-lenStart])
268 elif len(nameStart) + len(nameEnd) > maxLength-1:
270 name = u'%s/%s..' % (nameStart,
271 nameEnd[:maxLength-3-len(nameStart)])
273 name = u'%s/%s' % (nameStart, nameEnd)
275 # simply replace middle with '...' for long pagenames
276 half, left = divmod(maxLength-3, 2)
278 name = u'%s...%s' % (name[:half + left], name[-half:])
285 @param d: parameter dictionary
287 @return: page header html
289 _ = self.request.getText
291 superheader, userpanel = self.flexible_userhome(d)
295 u'<div id="header">',
298 u' <div class="superHeader">',
304 u' <div class="midHeader">',
305 u' <div id="locationline">',
307 #self.interwiki(d), # makes no sense in this theme
308 self.linkedSitename(),
312 # we display all wikis of the farm as links in one line
313 self.emit_custom_html(self.subheader()),
315 # Custom html below header (not recomended!)
316 #self.emit_custom_html(self.cfg.page_header2),
322 u'<div id="sidebar">',
338 return u'\n'.join(html)
340 def editorheader(self, d):
342 Assemble page header for editor
344 @param d: parameter dictionary
346 @return: page header html
348 _ = self.request.getText
349 superheader, userpanel = self.flexible_userhome(d)
353 u'<div id="header">',
356 u' <div class="superHeader">',
361 u' <div class="midHeader">',
363 u' <div id="locationline">',
365 #self.interwiki(d), # makes no sense in this theme
366 self.linkedSitename(),
370 # we display all wikis of the farm as links in one line
371 self.emit_custom_html(self.subheader()),
375 u'<div id="sidebar">',
386 return u'\n'.join(html)
388 def footer(self, d, **keywords):
389 """ Assemble page footer
391 @param d: parameter dictionary
394 @return: page footer html
399 #? # Used to extend the page to the bottom of the sidebar
400 #? u'<div id="pagebottom"></div>',
404 # Pre footer custom html (not recommended!)
405 #self.emit_custom_html(self.cfg.page_footer1),
408 u'<div id="footer">',
410 self.showversion(d, **keywords),
413 # Post footer custom html
414 #self.emit_custom_html(self.cfg.page_footer2),
416 return u'\n'.join(html)
418 def splitNavilink_off(self, text, localize=1):
420 Split navibar links into pagename, link to page
422 This overrides the defaut method. In contrast to default quicklinks
423 are cut down to a maximum length
425 @param text: the text used in config or user preferences
427 @return: pagename or url, link to page or url
429 request = self.request
431 # Handle [pagename title] or [url title] formats
432 if text.startswith('[') and text.endswith(']'):
434 pagename, title = text[1:-1].strip().split(' ', 1)
435 title = title.strip()
437 except (ValueError, TypeError):
438 # Just use the text as is.
439 pagename = title = text
441 # Handle regular pagename like "FrontPage"
443 # Use localized pages for the current user
445 page = wikiutil.getLocalizedPage(request, text)
447 page = Page(request, text)
448 pagename = page.page_name
449 title = page.split_title(request)
450 title = self.shortenPagename(title)
451 link = page.link_to(request, title)
453 from MoinMoin import config
454 for scheme in self.linkSchemas:
455 if pagename.startswith(scheme):
456 title = self.shortenPagename(wikiutil.escape(title)) # DL change
457 link = '<a href="%s">%s</a>' % (pagename, title)
458 return pagename, link
460 # remove wiki: url prefix
461 if pagename.startswith("wiki:"):
462 pagename = pagename[5:]
464 # try handling interwiki links
466 interwiki, page = pagename.split(':', 1)
467 thiswiki = request.cfg.interwikiname
468 if interwiki == thiswiki:
470 title = self.shortenPagename(page) # DL change
473 self.request.formatter.interwikilink(True, interwiki, page) +
475 self.request.formatter.interwikilink(False, interwiki, page))
479 # Normalize page names, replace '_' with ' '. Usually
480 # all names use spaces internally, but for
481 # [name_with_spaces label] we must save the underscores
483 pagename = request.normalizePagename(pagename)
484 link = Page(request, pagename).link_to(request, title)
486 return pagename, link
489 def execute(request):
491 Generate and return a theme object
493 @param request: the request object
495 @return: Theme object
497 return Theme(request)