# -*- coding: iso-8859-1 -*-
"""
MoinMoin - c3hl theme
@copyright: 2010 C3-HL
@license: GNU GPL, see COPYING for details.
"""
from MoinMoin.theme import ThemeBase
from MoinMoin import wikiutil
from MoinMoin.Page import Page
class Theme(ThemeBase):
name = "c3hl"
_ = lambda x: x # We don't have gettext at this moment, so we fake it
icons = {
# key alt icon filename w h
# FileAttach
'attach': ("%(attach_count)s", "moin-attach.png", 16, 16),
'info': ("[INFO]", "moin-info.png", 16, 16),
'attachimg': (_("[ATTACH]"), "attach.png", 32, 32),
# RecentChanges
'rss': (_("[RSS]"), "moin-rss.png", 16, 16),
'deleted': (_("[DELETED]"), "moin-deleted.png", 16, 16),
'updated': (_("[UPDATED]"), "moin-updated.png", 16, 16),
'renamed': (_("[RENAMED]"), "moin-renamed.png", 16, 16),
'conflict': (_("[CONFLICT]"), "moin-conflict.png", 16, 16),
'new': (_("[NEW]"), "moin-new.png", 16, 16),
'diffrc': (_("[DIFF]"), "moin-diff.png", 16, 16),
# General
'bottom': (_("[BOTTOM]"), "moin-bottom.png", 16, 16),
'top': (_("[TOP]"), "moin-top.png", 16, 16),
'www': ("[WWW]", "moin-www.png", 16, 16),
'mailto': ("[MAILTO]", "moin-email.png", 16, 16),
'news': ("[NEWS]", "moin-news.png", 16, 16),
'telnet': ("[TELNET]", "moin-telnet.png", 16, 16),
'ftp': ("[FTP]", "moin-ftp.png", 16, 16),
'file': ("[FILE]", "moin-ftp.png", 16, 16),
# search forms
'searchbutton': ("[?]", "moin-search.png", 16, 16),
'interwiki': ("[%(wikitag)s]", "moin-inter.png", 16, 16),
# smileys (this is CONTENT, but good looking smileys depend on looking
# adapted to the theme background color and theme style in general)
#vvv == vvv this must be the same for GUI editor converter
'X-(': ("X-(", 'angry.png', 16, 16),
':D': (":D", 'biggrin.png', 16, 16),
'<:(': ("<:(", 'frown.png', 16, 16),
':o': (":o", 'redface.png', 16, 16),
':(': (":(", 'sad.png', 16, 16),
':)': (":)", 'smile.png', 16, 16),
'B)': ("B)", 'smile2.png', 16, 16),
':))': (":))", 'smile3.png', 16, 16),
';)': (";)", 'smile4.png', 16, 16),
'/!\\': ("/!\\", 'alert.png', 16, 16),
'': ("", 'attention.png', 16, 16),
'(!)': ("(!)", 'idea.png', 16, 16),
':-?': (":-?", 'tongue.png', 16, 16),
':\\': (":\\", 'ohwell.png', 16, 16),
'>:>': (">:>", 'devil.png', 16, 16),
'|)': ("|)", 'tired.png', 16, 16),
':-(': (":-(", 'sad.png', 16, 16),
':-)': (":-)", 'smile.png', 16, 16),
'B-)': ("B-)", 'smile2.png', 16, 16),
':-))': (":-))", 'smile3.png', 16, 16),
';-)': (";-)", 'smile4.png', 16, 16),
'|-)': ("|-)", 'tired.png', 16, 16),
'(./)': ("(./)", 'checkmark.png', 16, 16),
'{OK}': ("{OK}", 'thumbs-up.png', 16, 16),
'{X}': ("{X}", 'icon-error.png', 16, 16),
'{i}': ("{i}", 'icon-info.png', 16, 16),
'{1}': ("{1}", 'prio1.png', 15, 13),
'{2}': ("{2}", 'prio2.png', 15, 13),
'{3}': ("{3}", 'prio3.png', 15, 13),
'{*}': ("{*}", 'star_on.png', 16, 16),
'{o}': ("{o}", 'star_off.png', 16, 16),
}
del _
def shouldShowEditbar(self, page):
if not (page.isWritable() and
self.request.user.may.write(page.page_name)):
return False
return ThemeBase.shouldShowEditbar(self, page)
def topnav(self, d):
request = self.request
links = []
for pagename in request.cfg.topnav:
page = Page(request, pagename)
title = page.split_title()
title = self.shortenPagename(title)
link = page.link_to(request, title)
links.append(link)
return '
%s
' % ' | '.join(links)
def parentlinks(self, d):
_ = self.request.getText
segments = d['page_name'].split('/')
if len(segments) <= 1:
return ''
content = []
curpage = ''
for s in segments[:-1]:
curpage += s
content.append(Page(self.request,
curpage).link_to(self.request, s))
curpage += '/'
path_html = u' | '.join(content)
return u'Zurück zu: %s
' % path_html
def remoteip(self):
nologging = u'Dieser Server loggt keine IP-Adressen.'
addr = self.request.environ['REMOTE_ADDR']
return u'Deine IP-Adresse ist %s
%s
' % (addr, nologging)
return ''
def header(self, d, **kw):
""" Assemble wiki header
@param d: parameter dictionary
@rtype: unicode
@return: page header html
"""
html = [
# Pre header custom html
self.emit_custom_html(self.cfg.page_header1),
# Header
u'',
self.topnav(d),
self.username(d),
u'
',
u'',
u'
',
u'
',
self.logo(),
u'
',
u'
',
u'',
u'
',
self.parentlinks(d),
#u'
',
#self.title_with_separators(d),
#u'
',
# Post header custom html (not recommended)
self.emit_custom_html(self.cfg.page_header2),
# Start of page
self.startPage(),
]
return u'\n'.join(html)
def editorheader(self, d, **kw):
""" Assemble wiki header for editor
@param d: parameter dictionary
@rtype: unicode
@return: page header html
"""
html = [
# Pre header custom html
self.emit_custom_html(self.cfg.page_header1),
# Header
u'
',
u'',
u'
',
u'
',
self.title_with_separators(d),
u'
',
# Post header custom html (not recommended)
self.emit_custom_html(self.cfg.page_header2),
# Start of page
self.startPage(),
]
return u'\n'.join(html)
def footer(self, d, **keywords):
""" Assemble wiki footer
@param d: parameter dictionary
@keyword ...:...
@rtype: unicode
@return: page footer html
"""
page = d['page']
html = [
# End of page
self.pageinfo(page),
self.endPage(),
# Pre footer custom html (not recommended!)
self.emit_custom_html(self.cfg.page_footer1),
u'',
# Footer
u'',
u'
',
# Post footer custom html
self.emit_custom_html(self.cfg.page_footer2),
]
return u'\n'.join(html)
def username(self, d):
""" Assemble the username / userprefs link
@param d: parameter dictionary
@rtype: unicode
@return: username html
"""
request = self.request
_ = request.getText
userlinks = []
# Add username/homepage link for registered users. We don't care
# if it exists, the user can create it.
if request.user.valid and request.user.name:
interwiki = wikiutil.getInterwikiHomePage(request)
name = request.user.name
aliasname = request.user.aliasname
if not aliasname:
aliasname = name
title = "%s @ %s" % (aliasname, interwiki[0])
# link to (interwiki) user homepage
homelink = (request.formatter.interwikilink(1, title=title, id="userhome", generated=True, *interwiki) +
request.formatter.text(name) +
request.formatter.interwikilink(0, title=title, id="userhome", *interwiki))
userlinks.append(homelink)
# link to userprefs action
if 'userprefs' not in self.request.cfg.actions_excluded:
userlinks.append(d['page'].link_to(request, text=_('Settings'),
querystr={'action': 'userprefs'}, id='userprefs', rel='nofollow'))
if request.user.valid:
if request.user.auth_method in request.cfg.auth_can_logout:
userlinks.append(d['page'].link_to(request, text=_('Logout'),
querystr={'action': 'logout', 'logout': 'logout'}, id='logout', rel='nofollow'))
else:
query = {'action': 'login'}
# special direct-login link if the auth methods want no input
if request.cfg.auth_login_inputs == ['special_no_input']:
query['login'] = '1'
if request.cfg.auth_have_login:
userlinks.append(d['page'].link_to(request, text=_("Login"),
querystr=query, id='login', rel='nofollow'))
userlinks.append('
Anmelden mit Client-Zertifikat'
% (request.cfg.clientcerthost, d['page'].url(request)))
userlinks_html = u'
| '.join(userlinks)
html = u'
%s
' % userlinks_html
return html
def trail(self, d):
""" Assemble page trail
@param d: parameter dictionary
@rtype: unicode
@return: trail html
"""
request = self.request
user = request.user
html = ''
if not user.valid or user.show_page_trail:
trail = user.getTrail()
if trail:
items = []
for pagename in trail:
try:
interwiki, page = wikiutil.split_interwiki(pagename)
if interwiki != request.cfg.interwikiname and interwiki != 'Self':
link = (self.request.formatter.interwikilink(True, interwiki, page) +
self.shortenPagename(page) +
self.request.formatter.interwikilink(False, interwiki, page))
items.append(link)
continue
else:
pagename = page
except ValueError:
pass
page = Page(request, pagename)
title = page.split_title()
title = self.shortenPagename(title)
link = page.link_to(request, title)
items.append(link)
html = u'
%s
' % u'
» '.join(items)
return html
def interwiki(self, d):
""" Assemble the interwiki name display, linking to page_front_page
@param d: parameter dictionary
@rtype: string
@return: interwiki html
"""
if self.request.cfg.show_interwiki:
page = wikiutil.getFrontPage(self.request)
text = self.request.cfg.interwikiname or 'Self'
link = page.link_to(self.request, text=text, rel='nofollow')
html = u'
%s: ' % link
else:
html = u''
return html
def execute(request):
"""
Generate and return a theme object
@param request: the request object
@rtype: MoinTheme
@return: Theme object
"""
return Theme(request)