From 225ec8d44fd17210fe5a8369475286991fd1a3ab Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 8 Oct 2010 11:37:57 +0200 Subject: Initial commit --- c3hl.py | 346 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 c3hl.py (limited to 'c3hl.py') diff --git a/c3hl.py b/c3hl.py new file mode 100644 index 0000000..bdca306 --- /dev/null +++ b/c3hl.py @@ -0,0 +1,346 @@ +# -*- 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'' % 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'', + 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) + -- cgit v1.2.3