# -*- coding: iso-8859-1 -*- """ MoinMoin monobook theme. Uses the css sheet from http://wikipedia.org, adapting the moin output to fit it. Adapted by Jim Clark Adapted for CR@NS by Nicolas Salles @license: GNU GPL, see COPYING for details. """ from MoinMoin.theme import ThemeBase from MoinMoin import wikiutil, i18n from MoinMoin.Page import Page class ThemeCrans(ThemeBase): name = "crans" # fake _ function to get gettext recognize those texts: _ = lambda x: x icons = { # key alt icon filename w h # ------------------------------------------------------------------ # navibar 'help': ("%(page_help_contents)s", "moin-help.png", 12, 11), 'find': ("%(page_find_page)s", "moin-search.png", 12, 12), 'diff': (_("Diffs"), "moin-diff.png", 22, 22), 'info': (_("Info"), "moin-info.png", 22, 22), 'edit': (_("Edit"), "moin-edit.png", 22, 22), 'unsubscribe':(_("Unsubscribe"), "moin-unsubscribe.png", 22, 22), 'subscribe': (_("Subscribe"), "moin-subscribe.png",22, 22), 'raw': (_("Raw"), "moin-raw.png", 12, 13), 'xml': (_("XML"), "moin-xml.png", 20, 13), 'print': (_("Print"), "moin-print.png", 16, 14), 'view': (_("View"), "moin-show.png", 22, 22), 'home': (_("Home"), "moin-home.png", 13, 12), 'up': (_("Up"), "moin-parent.png", 15, 13), # format 'format': (_("[TEX]"), "moin-tex.png", 20, 22), # FileAttach 'attach': ("%(attach_count)s", "moin-attach.png", 7, 15), # RecentChanges 'rss': (_("[RSS]"), "moin-rss.png", 36, 14), 'deleted': (_("[DELETED]"), "moin-deleted.png",60, 12), 'updated': (_("[UPDATED]"), "moin-updated.png",60, 12), 'new': (_("[NEW]"), "moin-new.png", 31, 12), 'diffrc': (_("[DIFF]"), "moin-diff.png", 22, 22), # General 'bottom': (_("[BOTTOM]"), "moin-bottom.png", 14, 10), 'top': (_("[TOP]"), "moin-top.png", 14, 10), 'www': ("[WWW]", "moin-www.png", 11, 11), 'mailto': ("[MAILTO]", "moin-email.png", 14, 10), 'news': ("[NEWS]", "moin-news.png", 10, 11), 'telnet': ("[TELNET]", "moin-telnet.png", 10, 11), 'ftp': ("[FTP]", "moin-ftp.png", 11, 11), 'file': ("[FILE]", "moin-ftp.png", 11, 11), # search forms 'searchbutton': ("[?]", "moin-search.png", 12, 12), 'interwiki': ("[%(wikitag)s]", "moin-inter.png", 16, 16), } del _ # Standard set of style sheets stylesheets = ( # media basename ('all', 'common'), ('screen', 'crans'), ('print', 'print'), ('projection', 'projection'), ) # Public functions ##################################################### def header(self, d, **kw): """ Assemble wiki header Here we don't add any menu bars, search bars, etc - instead wait until the footer. This keeps the HTML cleaner and more accessible, making sure the main content arrives first. """ html = [ u'
', u'
', self.startPage(), self.msg(d), self.title(d), ] return u'\n'.join(html) def footer(self, d, **keywords): """ Assemble wiki footer """ html = [ # End of page u'
', self.endPage(), u'
', u'
', self.columnone(d), u'
' ] return u'\n'.join(html) def columnone(self, d): """ assemble all the navigation aids for the page """ page = d['page'] html = [ u'
', self.editbar(d), self.username(d), u'', self.navibar(d), self.searchform(d), self.actionmenu(d), u'
', u'', u'
' ] return u'\n'.join(html) def headscript(self, d): """ Override to not output search/action menu javascript. (perhaps not a good idea) """ return '' def extendedAttrs(self, title, accesskey): """ Helper function for assembling titled access key links """ return 'title="%(title)s [alt-%(accesskey)s]" accesskey=%(accesskey)s' % \ {'accesskey' : accesskey, 'title' : title} def editbar(self, d): """ Display a list of actions for the page. This list will be turned into a set of tabbed views on the page by the css. """ page = d['page'] if not self.shouldShowEditbar(page): return '' # Use cached editbar if possible. cacheKey = 'editbar' cached = self._cache.get(cacheKey) if cached: return cached request = self.request _ = self.request.getText link = wikiutil.link_tag quotedname = wikiutil.quoteWikinameURL(page.page_name) # action, title, description, accesskey tabs = [('view', 'Article', 'View the page content', 'c'), ('edit', 'Edit', 'Edit this page', 'e'), ('diff', 'Show Changes', 'Last page modification', 'd'), ('info', 'Get Info', 'Page history and information', 'h'), #('format', 'Latex', 'Source Latex', 'l'), ('subscribe', 'Subscribe', 'Subscribe to updates to this page', 'w')] items = [] current = self.request.form.get('action', ['view'])[0] for action, title, description, accesskey in tabs: if action == current: cls = 'selected' else: cls = 'none' if action == "subscribe": items.append(u'
  • %s
  • \n' % (cls, action, self.make_iconlink( ["subscribe", "unsubscribe"][self.request.user.isSubscribedTo([d['page_name']])], d))) else: items.append(u'
  • %s
  • \n' % (cls, action, self.make_iconlink(action, d))) html = [ u'
    ', u'
      ', ''.join(items), u'
    ', u'
    ' ] html = ''.join(html) # cache for next call self._cache[cacheKey] = html return html def actionmenu(self, d): """ different implementation of the actionmenu (aka toolbox) """ page = d['page'] # Use cached actionmenu if possible. cacheKey = 'actionmenu' cached = self._cache.get(cacheKey) if cached: return cached request = self.request _ = request.getText quotedname = wikiutil.quoteWikinameURL(page.page_name) menu = [ 'raw', 'print', u'format&mimetype=text/latex', 'refresh', 'AttachFile', 'SpellCheck', 'LikePages', 'LocalSiteMap', 'RenamePage', 'DeletePage', ] titles = { 'raw': _('Show Raw Text', formatted=False), 'print': _('Show Print View', formatted=False), u'format&mimetype=text/latex': _('Obtenir le code latex', formatted=False), 'refresh': _('Delete Cache', formatted=False), 'AttachFile': _('Attach File', formatted=False), 'SpellCheck': _('Check Spelling', formatted=False), # rename action! 'RenamePage': _('Rename Page', formatted=False), 'DeletePage': _('Delete Page', formatted=False), 'LikePages': _('Show Like Pages', formatted=False), 'LocalSiteMap': _('Show Local Site Map', formatted=False), } links = [] # Format standard actions available = request.getAvailableActions(page) for action in menu: # Enable delete cache only if page can use caching if action == 'refresh': if not page.canUseCache(): break # Actions which are not available for this wiki, user or page if action[0].isupper() and not action in available: break; link = wikiutil.link_tag(self.request, \ quotedname + '?action=' + action, titles[action]) links.append(link) # Add custom actions not in the standard menu more = [item for item in available if not item in titles] more.sort() if more: # Add more actions (all enabled) for action in more: data = {'action': action, 'disabled': ''} title = Page(request, action).split_title(request, force=1) # Use translated version if available title = _(title, formatted=False) link = wikiutil.link_tag(self.request, \ quotedname + '?action=' + action, title) links.append(link) html = [ u'
    ', u'
    Toolbox
    ', u'
    ', u'
      ', u'
    • %s
    ' % '\n
  • '.join(links), u'', u'
  • ', u'
    ', ] html = ''.join(html) # cache for next call self._cache[cacheKey] = html return html def username(self, d): """ Assemble the username / userprefs link Copied from the base class, modified to include hotkeys and link titles """ from MoinMoin.Page import Page 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: homepage = Page(request, request.user.name) title = homepage.split_title(request) attrs = self.extendedAttrs(_('User Page'), '.') homelink = homepage.link_to(request, text=title, attrs=attrs) userlinks.append(homelink) # Set pref page to localized Preferences page attrs = self.extendedAttrs(_('My Preferences'), 'u') prefpage = wikiutil.getSysPage(request, 'UserPreferences') title = prefpage.split_title(request) userlinks.append(prefpage.link_to(request, text=title, attrs=attrs)) # Add a logout link (not sure this is really necessary attrs = self.extendedAttrs(_('log out'), 'o') page = d['page'] url = wikiutil.quoteWikinameURL(page.page_name) + \ '?action=userform&logout=1' link = wikiutil.link_tag(self.request, url, 'log out', attrs=attrs) userlinks.append(link) else: # Add prefpage links with title: Login prefpage = wikiutil.getSysPage(request, 'UserPreferences') attrs = self.extendedAttrs('Logging in is not required, but brings benefits', 'o') userlinks.append(prefpage.link_to(request, text=_("Login"), attrs=attrs)) html = [ u'
    ', u'
      ', u'
    • %s
    ' % '\n
  • '.join(userlinks), u'', u'
  • ' ] return ''.join(html) def searchform(self, d): """ assemble HTML code for the search form Tweaks from the bass class to wrap in a 'portlet' class, move the description to a header tag, add an access key of 'f' and add SearchButton class for the buttons """ _ = self.request.getText form = self.request.form updates = { 'search_label' : _('Search:'), 'search_value': wikiutil.escape(form.get('value', [''])[0], 1), 'search_full_label' : _('Text', formatted=False), 'search_title_label' : _('Titles', formatted=False), } d.update(updates) html = u''' ''' % d return html def shouldShowEditbar(self, page): """ Override to include the editbar on edit/preview pages. (at the risk that the user may accidentally cancel an edit) """ if (page.exists(includeDeleted=1) and self.request.user.may.read(page.page_name)): return True return False def navibar(self, d): """ Alterations from the base class to include access keys and descriptions for FrontPage/RecentChanges """ request = self.request found = {} # pages we found. prevent duplicates links = [] # navibar items current = d['page_name'] # Process config navi_bar if request.cfg.navi_bar: for text in request.cfg.navi_bar: pagename, link = self.splitNavilink(text) if pagename == d['page_front_page']: attrs = self.extendedAttrs('Visit the main page', 'z') elif pagename == 'RecentChanges': attrs = self.extendedAttrs('List of recent changes in this wiki', 'r') else: attrs = '' a = wikiutil.link_tag(request, pagename, attrs=attrs) links.append(a) found[pagename] = 1 # Add user links to wiki links, eliminating duplicates. userlinks = request.user.getQuickLinks() for text in userlinks: # Split text without localization, user know what she wants pagename, link = self.splitNavilink(text, localize=0) if not pagename in found: a = wikiutil.link_tag(request, pagename, attrs=attrs) links.append(a) found[pagename] = 1 html = [ u'
    ', u'
    ', u'' % '\n
  • '.join(links), u'', u'
  • ', u'
    ', ] return ''.join(html) def pageinfo(self, page): """ Simple override from base class. Remove

    so footer isn't too big """ _ = self.request.getText if self.shouldShowPageinfo(page): info = page.lastEditInfo() if info: if info['editor']: info = _("last edited %(time)s by %(editor)s") % info else: info = _("last modified %(time)s") % info return info return '' def rtl_stylesheet(self, d): """ monobook uses a separate css page for rtl alterations. Add the rtl stylesheet if the user needs it """ link = ('') html = [] if i18n.getDirection(self.request.lang) == 'rtl': prefix = self.cfg.url_prefix href = '%s/%s/css/%s.css' % (prefix, self.name, 'rtl') html.append(link % (self.stylesheetsCharset, 'all', href)) return '\n'.join(html) def html_head(self, d): """ Tweak the sending of the head, to include right-to-left alterations if necessary """ html = [ u'%(title)s - %(sitename)s' % d, self.headscript(d), # Should move to separate .js file self.html_stylesheets(d), self.rtl_stylesheet(d), self.rsslink(), ] return u' \n'.join(html) def html_stylesheets(self, d): """ On fixe le chemin d'acces vers les feuilles de style """ html = [] for media, nom in self.stylesheets: html.append(u'' % (media, nom)) return u'\n'.join(html) class Theme(ThemeCrans): name = "crans" # Standard set of style sheets stylesheets = ( # media basename ('all', 'common'), ('screen', 'crans'), ('print', 'print'), ('projection', 'projection'), ) def execute(request): """ Generate and return a theme object @param request: the request object @rtype: MoinTheme @return: Theme object """ return Theme(request)