2017-03-11 00:12:48 +01:00
|
|
|
# -*- coding: iso-8859-1 -*-
|
|
|
|
"""
|
|
|
|
MoinMoin - modern theme
|
|
|
|
|
|
|
|
@copyright: 2003-2005 Nir Soffer, Thomas Waldmann
|
|
|
|
@license: GNU GPL, see COPYING for details.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from MoinMoin.theme import ThemeBase
|
|
|
|
from MoinMoin import wikiutil
|
|
|
|
from MoinMoin.Page import Page
|
|
|
|
|
|
|
|
class Theme(ThemeBase):
|
|
|
|
|
2017-03-11 00:17:09 +01:00
|
|
|
name = "acaro"
|
2017-03-11 00:12:48 +01:00
|
|
|
|
|
|
|
_ = 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 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'<div id="header">',
|
|
|
|
self.searchform(d),
|
|
|
|
self.logo(),
|
|
|
|
self.username(d),
|
|
|
|
u'<h1 id="locationline">',
|
|
|
|
self.interwiki(d),
|
|
|
|
self.title_with_separators(d),
|
|
|
|
u'</h1>',
|
|
|
|
self.trail(d),
|
|
|
|
self.navibar(d),
|
|
|
|
#u'<hr id="pageline">',
|
|
|
|
u'<div id="pageline"><hr style="display:none;"></div>',
|
|
|
|
self.msg(d),
|
|
|
|
self.editbar(d),
|
|
|
|
u'</div>',
|
|
|
|
|
|
|
|
# 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'<div id="header">',
|
|
|
|
u'<h1 id="locationline">',
|
|
|
|
self.title_with_separators(d),
|
|
|
|
u'</h1>',
|
|
|
|
self.msg(d),
|
|
|
|
u'</div>',
|
|
|
|
|
|
|
|
# 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),
|
|
|
|
|
|
|
|
# Footer
|
|
|
|
u'<div id="footer">',
|
|
|
|
self.editbar(d),
|
|
|
|
self.credits(d),
|
|
|
|
self.showversion(d, **keywords),
|
|
|
|
u'</div>',
|
|
|
|
|
|
|
|
# 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_html = u'<span class="sep"> | </span>'.join(userlinks)
|
|
|
|
html = u'<div id="username">%s</div>' % 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'<div id="pagetrail">%s</div>' % u'<span class="sep"> » </span>'.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'<span id="interwiki">%s<span class="sep">: </span></span>' % 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)
|
|
|
|
|