diff MoinMoin/theme/modernized.py @ 3796:668a7f2f1775

Introducing a remake of the default theme: Modernized * a new set of tango icons * improved colors of the header * better display with CSS disabled * minor spacing and border adjustments * cleaner css for the header
author Radomir Dopieralski <moindev@sheep.art.pl>
date Tue, 24 Jun 2008 22:39:50 +0200
parents
children e22cd9105e37
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MoinMoin/theme/modernized.py	Tue Jun 24 22:39:50 2008 +0200
@@ -0,0 +1,314 @@
+# -*- 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):
+
+    name = "modernized"
+
+    _ = 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(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(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 title(self, d):
+        """ Assemble the title (now using breadcrumbs)
+
+        @param d: parameter dictionary
+        @rtype: string
+        @return: title html
+        """
+        _ = self.request.getText
+        content = []
+        if d['title_text'] == d['page'].split_title(): # just showing a page, no action
+            curpage = ''
+            segments = d['page_name'].split('/') # was: title_text
+            for s in segments[:-1]:
+                curpage += s
+                content.append(Page(self.request, curpage).link_to(self.request, s))
+                curpage += '/'
+            link_text = segments[-1]
+            link_title = _('Click to do a full-text search for this title')
+            link_query = {
+                'action': 'fullsearch',
+                'value': 'linkto:"%s"' % d['page_name'],
+                'context': '180',
+            }
+            # we dont use d['title_link'] any more, but make it ourselves:
+            link = d['page'].link_to(self.request, link_text, querystr=link_query, title=link_title, css_class='backlink', rel='nofollow')
+            content.append(link)
+        else:
+            content.append(wikiutil.escape(d['title_text']))
+
+        location_html = u'<span class="sep">/</span>'.join(content)
+        html = u'<span id="pagelocation">%s</span>' % location_html
+        return 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"> &raquo; </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)
+