[wiki] thème solenoid
This commit is contained in:
parent
4a7d07cdfd
commit
0d1203dab1
2 changed files with 692 additions and 0 deletions
75
wiki/action/allactions.py
Normal file
75
wiki/action/allactions.py
Normal file
|
@ -0,0 +1,75 @@
|
|||
# -*- coding: iso-8859-1 -*-
|
||||
"""
|
||||
All Actions action
|
||||
|
||||
Lists the actions available for the current page.
|
||||
Based on Mandarin's PageAction.
|
||||
|
||||
@copyright: Radomir Dopieralski, and possibly others
|
||||
2009, 2010 Renato Silva
|
||||
|
||||
@license: See the README file.
|
||||
"""
|
||||
|
||||
from MoinMoin import wikiutil
|
||||
from MoinMoin.Page import Page
|
||||
|
||||
def execute(pagename, request):
|
||||
_ = request.getText
|
||||
from MoinMoin.formatter.text_html import Formatter
|
||||
fmt = request.formatter = Formatter(request)
|
||||
|
||||
emit_http_headers = getattr(request, 'emit_http_headers', None) or getattr(request, 'http_headers', None)
|
||||
if emit_http_headers is not None:
|
||||
emit_http_headers()
|
||||
|
||||
request.setContentLanguage(request.lang)
|
||||
request.theme.send_title(_('Actions for %s') % pagename, page_name=pagename)
|
||||
request.write(fmt.startContent("content")) # content div provides direction support
|
||||
request.write(availableactions(request))
|
||||
request.write(fmt.endContent())
|
||||
request.theme.send_footer(pagename)
|
||||
|
||||
def actionlink(request, action, title, comment=''):
|
||||
page = request.page
|
||||
params = '%s?action=%s' % (page.page_name, action)
|
||||
if action == 'RenamePage':
|
||||
params += '&subpages_checked=1'
|
||||
link = wikiutil.link_tag(request, params, title)
|
||||
return u''.join([u'<li>', link, comment, u'</li>'])
|
||||
|
||||
|
||||
def availableactions(request):
|
||||
page = request.page
|
||||
_ = request.getText
|
||||
links = []
|
||||
try:
|
||||
available = request.getAvailableActions(page) # Moin 1.8
|
||||
except AttributeError:
|
||||
from MoinMoin.action import get_available_actions
|
||||
available = get_available_actions(request.cfg, page, request.user) # Moin 1.9
|
||||
|
||||
def split_and_translate(title):
|
||||
title = Page(request, title).split_title(request)
|
||||
return _(title, formatted=False)
|
||||
|
||||
available = [(split_and_translate(action), action) for action in available]
|
||||
|
||||
if page.isWritable() and request.user.may.write(page.page_name):
|
||||
available.append((_('Edit Text'), 'edit'))
|
||||
|
||||
if request.user.valid and request.user.email:
|
||||
subscribed = request.user.isSubscribedTo([page.page_name])
|
||||
title = (_('Subscribe'), _('Unsubscribe'))[subscribed]
|
||||
action = ('subscribe', 'unsubscribe')[subscribed]
|
||||
available.append((title, action))
|
||||
|
||||
available.append((_('Print View'), 'print'))
|
||||
available.append((_('View Raw Text'), 'raw'))
|
||||
available.append((_('Delete Cache'), 'refresh'))
|
||||
|
||||
available.sort()
|
||||
for title, action in available:
|
||||
links.append(actionlink(request, action, title))
|
||||
|
||||
return u'<ul>%s</ul>' % u''.join(links)
|
617
wiki/theme/solenoid.py
Normal file
617
wiki/theme/solenoid.py
Normal file
|
@ -0,0 +1,617 @@
|
|||
# -*- coding: iso-8859-1 -*-
|
||||
"""
|
||||
MoinMoin Solenoid theme
|
||||
|
||||
@copyright: 2007 Radomir Dopieralski <moin@sheep.art.pl>, Oliver Siemoneit
|
||||
2009, 2010 Renato Silva
|
||||
|
||||
@license: See the README file.
|
||||
"""
|
||||
|
||||
from MoinMoin import wikiutil
|
||||
from MoinMoin.theme import ThemeBase, modernized
|
||||
from MoinMoin.Page import Page
|
||||
from MoinMoin.i18n import Translation, translations, po_filename
|
||||
import re, os, glob, StringIO
|
||||
|
||||
class Theme(ThemeBase):
|
||||
|
||||
name = "solenoid"
|
||||
Name = name.capitalize()
|
||||
home = "http://moinmo.in/ThemeMarket/Solenoid"
|
||||
|
||||
_ = lambda x: x
|
||||
|
||||
icons = {
|
||||
|
||||
# Key Alt Icon filename W H
|
||||
# ----------------------------------------------------------------------------------
|
||||
# Navibar
|
||||
'help': ("%(page_help_contents)s", "moin-help.png", 16, 16),
|
||||
'find': ("%(page_find_page)s", "moin-search.png", 16, 16),
|
||||
'diff': (_("Diffs"), "moin-diff.png", 20, 16),
|
||||
'info': (_("Info"), "moin-info.png", 16, 16),
|
||||
'edit': (_("Edit"), "moin-edit.png", 16, 16),
|
||||
'unsubscribe': (_("Unsubscribe"), "moin-unsubscribe.png", 16, 16),
|
||||
'subscribe': (_("Subscribe"), "moin-subscribe.png", 16, 16),
|
||||
'addquicklink': (_("Add quicklink"), "moin-addquicklink.png", 16, 16),
|
||||
'delquicklink': (_("Delete quicklink"), "moin-delquicklink.png", 16, 16),
|
||||
|
||||
'raw': (_("Raw"), "moin-raw.png", 16, 16),
|
||||
'xml': (_("XML"), "moin-xml.png", 20, 13),
|
||||
'print': (_("Print"), "moin-print.png", 16, 16),
|
||||
'view': (_("View"), "moin-show.png", 16, 16),
|
||||
'home': (_("Home"), "moin-home.png", 16, 16),
|
||||
'up': (_("Up"), "moin-parent.png", 16, 16),
|
||||
|
||||
# FileAttach
|
||||
'attach': ("%(attach_count)s", "moin-attach.png", 16, 16),
|
||||
'attachimg': ("[ATTACH]", "attach.png", 32, 32),
|
||||
|
||||
# RecentChanges
|
||||
'rss': (_("[RSS]"), "moin-rss.png", 39, 14),
|
||||
'deleted': (_("[DELETED]"), "moin-deleted.png", 16, 16),
|
||||
'updated': (_("[UPDATED]"), "moin-edit.png", 16, 16),
|
||||
'renamed': (_("[RENAMED]"), "moin-renamed.png", 16, 16),
|
||||
'conflict': (_("[CONFLICT]"), "moin-conflict.png", 23, 16),
|
||||
'new': (_("[NEW]"), "moin-new.png", 16, 16),
|
||||
'diffrc': (_("[DIFF]"), "moin-diff.png", 16, 16),
|
||||
|
||||
# General
|
||||
'bottom': (_("[BOTTOM]"), "moin-bottom.png", 12, 12),
|
||||
'top': (_("[TOP]"), "moin-top.png", 12, 12),
|
||||
'www': ("[WWW]", "moin-www.png", 12, 12),
|
||||
'mailto': ("[MAILTO]", "moin-email.png", 12, 12),
|
||||
'news': ("[NEWS]", "moin-news.png", 12, 12),
|
||||
'irc': ("[IRC]", "moin-irc.png", 15, 15),
|
||||
'telnet': ("[TELNET]", "moin-telnet.png", 12, 12),
|
||||
'ftp': ("[FTP]", "moin-ftp.png", 12, 12),
|
||||
'file': ("[FILE]", "moin-ftp.png", 12, 12),
|
||||
|
||||
# Search forms
|
||||
'searchbutton': ("[?]", "moin-search.png", 16, 16),
|
||||
'interwiki': ("[%(wikitag)s]", "moin-inter.png", 12, 12),
|
||||
'badinterwiki': ("[%(wikitag)s]", "moin-badinter.png", 12, 12),
|
||||
|
||||
# Smileys
|
||||
'X-(': ("X-(", 'angry.png', 18, 18),
|
||||
':D': (":D", 'biggrin.png', 18, 18),
|
||||
'<:(': ("<:(", 'frown.png', 18, 18),
|
||||
':o': (":o", 'redface.png', 18, 18),
|
||||
':(': (":(", 'sad.png', 18, 18),
|
||||
':)': (":)", 'smile.png', 18, 18),
|
||||
'B)': ("B)", 'smile2.png', 18, 18),
|
||||
':))': (":))", 'smile3.png', 18, 18),
|
||||
';)': (";)", 'smile4.png', 18, 18),
|
||||
'/!\\': ("/!\\", 'alert.png', 16, 16),
|
||||
'<!>': ("<!>", 'attention.png', 16, 16),
|
||||
'(!)': ("(!)", 'idea.png', 16, 16),
|
||||
':-?': (":-?", 'tongue.png', 18, 18),
|
||||
':\\': (":\\", 'ohwell.png', 18, 18),
|
||||
'>:>': (">:>", 'devil.png', 18, 18),
|
||||
'|)': ("|)", 'tired.png', 18, 18),
|
||||
':-(': (":-(", 'sad.png', 18, 18),
|
||||
':-)': (":-)", 'smile.png', 18, 18),
|
||||
'B-)': ("B-)", 'smile2.png', 18, 18),
|
||||
':-))': (":-))", 'smile3.png', 18, 18),
|
||||
';-)': (";-)", 'smile4.png', 18, 18),
|
||||
'|-)': ("|-)", 'tired.png', 18, 18),
|
||||
'(./)': ("(./)", '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', 16, 16),
|
||||
'{2}': ("{2}", 'prio2.png', 16, 16),
|
||||
'{3}': ("{3}", 'prio3.png', 16, 16),
|
||||
'{*}': ("{*}", 'star_on.png', 16, 16),
|
||||
'{o}': ("{o}", 'star_off.png', 16, 16),
|
||||
|
||||
# New big icons for classic theme
|
||||
'diff-big': (_("Diffs"), "moin-diff-big.png", 31, 25),
|
||||
'info-big': (_("Info"), "moin-info-big.png", 25, 25),
|
||||
'edit-big': (_("Edit"), "moin-edit-big.png", 25, 25),
|
||||
'unsubscribe-big': (_("Unsubscribe"), "moin-unsubscribe-big.png", 25, 25),
|
||||
'subscribe-big': (_("Subscribe"), "moin-subscribe-big.png", 25, 25),
|
||||
'raw-big': (_("Raw"), "moin-raw-big.png", 25, 25),
|
||||
'print-big': (_("Print"), "moin-print-big.png", 25, 25),
|
||||
'view-big': (_("View"), "moin-show-big.png", 25, 25),
|
||||
'delquicklink-big': (_("Delete quicklink"), "moin-delquicklink-big.png", 25, 25),
|
||||
'addquicklink-big': (_("Add quicklink"), "moin-addquicklink-big.png", 25, 25),
|
||||
'attach-big': (_("Add/Manage files"), "moin-iconattach-big.png", 25, 25),
|
||||
}
|
||||
|
||||
del _
|
||||
|
||||
def _(self, text):
|
||||
lang = self.request.lang
|
||||
_translations = self._translations
|
||||
if lang in _translations:
|
||||
if text in _translations[lang]:
|
||||
return _translations[lang][text]
|
||||
return self.request.getText(text, formatted=False)
|
||||
|
||||
def _get_config(self, source, config_name, default=None):
|
||||
return getattr(source, '%s_%s' % (self.name, config_name), default)
|
||||
|
||||
def get_bool_user_config(self, config_name):
|
||||
user = self.request.user
|
||||
if not user.valid:
|
||||
return None
|
||||
user_config = self._get_config(user, config_name)
|
||||
return {'0': False, '1': True}.get(user_config, None)
|
||||
|
||||
def get_config(self, config_name, default=None, by_user=True):
|
||||
if by_user and self.userprefs_allowed:
|
||||
user_config = self.get_bool_user_config(config_name)
|
||||
if user_config is not None:
|
||||
return user_config
|
||||
return self._get_config(self.cfg, config_name, default)
|
||||
|
||||
def _remove_old_userprefs(self):
|
||||
user = self.request.user
|
||||
old_attribute = 'solenoid_enable_prefs'
|
||||
if hasattr(user, old_attribute):
|
||||
delattr(user, old_attribute)
|
||||
user.save()
|
||||
|
||||
def __init__(self, request):
|
||||
ThemeBase.__init__(self, request)
|
||||
append_translation = self.get_config('append_translation', default=True, by_user=False)
|
||||
self._translations = self.theme_translations(append_translation)
|
||||
self.cms_mode = self.get_config('cms_mode', default=False, by_user=False)
|
||||
|
||||
self._remove_old_userprefs()
|
||||
self.userprefs_allowed = self.get_config('userprefs', default=False, by_user=False)
|
||||
if self.userprefs_allowed:
|
||||
self.userprefs_definition = [
|
||||
(bool, 'clear', self._('Clear look')),
|
||||
(bool, 'shadow', self._('Shadows for box mode')),
|
||||
(bool, 'full_screen', self._('Full screen mode')) ]
|
||||
|
||||
try:
|
||||
self.static_prefix = self.cfg.url_prefix_static
|
||||
except AttributeError:
|
||||
self.static_prefix = self.cfg.url_prefix
|
||||
|
||||
def theme_translations(self, append=False):
|
||||
"""Load personal translations to be used by this theme.
|
||||
|
||||
@param append: if True makes theme translation global by appending it to the default Moin translation system.
|
||||
@return: a dict (indexed by language) of translation dicts, or an empty dict if append=True.
|
||||
"""
|
||||
_translations = {}
|
||||
request = self.request
|
||||
po_dir = os.path.join('i18n', self.name)
|
||||
|
||||
for lang_file in glob.glob(po_filename(request, i18n_dir=po_dir, language='*', domain='Theme')):
|
||||
dummy_language, domain, ext = os.path.basename(lang_file).split('.')
|
||||
language = dummy_language.split('_')[0]
|
||||
t = Translation(dummy_language, domain)
|
||||
t.loadLanguage(request, trans_dir=po_dir)
|
||||
|
||||
if append:
|
||||
if not language in translations:
|
||||
translations[language] = Translation(language)
|
||||
translations[language].loadLanguage(request)
|
||||
translations[language].raw.update(t.raw)
|
||||
else:
|
||||
_translations[language] = {}
|
||||
for key, text in t.raw.items():
|
||||
_translations[language][key] = text
|
||||
|
||||
return _translations
|
||||
|
||||
def title_for_print(self, d):
|
||||
_ = self._
|
||||
cfg = self.request.cfg
|
||||
page_path = wikiutil.escape(d['title_text'].replace('/', ' / '))
|
||||
lines = d['page'].get_raw_body().split('\n')
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if not line.startswith('#') and not line.startswith('<<') and not line == '':
|
||||
|
||||
inline_display = u''
|
||||
print_action = self.request.action == 'print'
|
||||
for media, display in (('all', ('none', 'block')[print_action]), ('print', 'block')):
|
||||
inline_display += '<style media="%s" type="text/css"> #pagelocation-print { display: %s; } </style>' % (media, display)
|
||||
|
||||
if re.sub('^\s*=+\s+[^=]+\s+=+\s*$', '', line) == '':
|
||||
# If page starts with a title, then make page path a header before it
|
||||
return u'%s<span id="pagelocation-print">%s: %s</span>' % (inline_display, _('Page name'), page_path)
|
||||
else:
|
||||
# Page does not start with a title, so we use page path as title
|
||||
interwiki_name = '%s: ' % (cfg.interwikiname or 'Wiki')
|
||||
prefix = ['', interwiki_name][cfg.show_interwiki]
|
||||
return u'%s<h1 id="pagelocation-print">%s%s</h1>' % (inline_display, prefix, page_path)
|
||||
break
|
||||
return u''
|
||||
|
||||
def header(self, d):
|
||||
_ = self._
|
||||
wrapper_class = u'wrapper'
|
||||
sidebar = self.sidebar(d)
|
||||
if sidebar == u'':
|
||||
wrapper_class += u' no-sidebar'
|
||||
page_title = self.title(d)
|
||||
site_logo = self.logo()
|
||||
if (site_logo == ''):
|
||||
site_logo = page_title.replace('<h1>', '<div class="logo">').replace('</h1>', '</div>')
|
||||
site_logo = site_logo.replace('id="', 'id="logo_')
|
||||
site_logo = site_logo.replace("id='", "id='logo_")
|
||||
page_title = '<h1> </h1>'
|
||||
page_title = (page_title, '')[self.cms_mode and not self.request.user.valid]
|
||||
parts = [
|
||||
self.emit_custom_html(self.cfg.page_header1),
|
||||
u'<div class="header">',
|
||||
site_logo,
|
||||
self.searchform(d),
|
||||
self.username(d),
|
||||
self.gotobar(d),
|
||||
self.msg(d),
|
||||
self.editbar(d),
|
||||
page_title,
|
||||
self.logged_trail(d),
|
||||
u'</div>',
|
||||
self.emit_custom_html(self.cfg.page_header2),
|
||||
self.title_for_print(d),
|
||||
u'<div class="%s">' % wrapper_class,
|
||||
sidebar,
|
||||
u'<div class="content"%s>\n' % self.content_lang_attr(),
|
||||
"<!--[if lt IE 7]><div class='outdated-ie'><p><b>%s! </b>%s</p></div><![endif]-->"
|
||||
% (_("Attention"), _("You are using an outdated version of Internet Explorer "
|
||||
"which is not supported by this site. Please update your browser."))
|
||||
]
|
||||
return u''.join(parts)
|
||||
|
||||
editorheader = header
|
||||
|
||||
def title(self, d):
|
||||
if self.request.action == 'print':
|
||||
return self.title_for_print(d)
|
||||
modernized_theme = modernized.Theme(self.request)
|
||||
try:
|
||||
screen_title = self.title_with_separators # Moin 1.9
|
||||
except AttributeError:
|
||||
screen_title = modernized_theme.title # Moin 1.8
|
||||
return u'<h1>%s%s</h1>' % (modernized_theme.interwiki(d), screen_title(d))
|
||||
|
||||
def logged_trail(self, d):
|
||||
user = self.request.user
|
||||
html = u""
|
||||
if user.valid and user.show_page_trail:
|
||||
if len(user.getTrail())>1:
|
||||
html = self.trail(d)
|
||||
return html
|
||||
|
||||
def footer(self, d, **keywords):
|
||||
page = d['page']
|
||||
custom_footer = self.cfg.page_credits
|
||||
if isinstance(custom_footer, list):
|
||||
if self.get_config('theme_credit', True, by_user=False):
|
||||
theme_link = u'<a href="%s">%s Theme Powered</a>' % (self.home, self.Name)
|
||||
custom_footer = [theme_link] + custom_footer
|
||||
custom_footer = ' | '.join(custom_footer)
|
||||
custom_footer = '<span id="custom-footer">%s</span>' % custom_footer
|
||||
parts = [
|
||||
u'<div id="pagebottom"></div>',
|
||||
u'</div></div>', # wrapper and content divs
|
||||
self.emit_custom_html(self.cfg.page_footer1),
|
||||
u'<div class="footer">',
|
||||
self.emit_custom_html(custom_footer),
|
||||
self.pageinfo(page),
|
||||
u'</div>',
|
||||
self.emit_custom_html(self.cfg.page_footer2),
|
||||
]
|
||||
return u''.join(parts)
|
||||
|
||||
def sidebar(self, d, **keywords):
|
||||
""" Display page called SideBar as an additional element on every page
|
||||
|
||||
@param d: parameter dictionary
|
||||
@rtype: string
|
||||
@return: sidebar html
|
||||
"""
|
||||
request = self.request
|
||||
_ = self._
|
||||
sidebar = request.getPragma('sidebar', u'SideBar')
|
||||
page = Page(request, sidebar)
|
||||
if not page.exists() or not request.user.may.read(page.page_name):
|
||||
return u''
|
||||
buff = StringIO.StringIO()
|
||||
request.redirect(buff)
|
||||
try:
|
||||
try:
|
||||
page.send_page(content_only=1, content_id="sidebar")
|
||||
except TypeError:
|
||||
page.send_page(request, content_only=1, content_id="sidebar")
|
||||
finally:
|
||||
request.redirect()
|
||||
return u'<div class="sidebar">%s<div id="sidebar-end"></div></div>' % buff.getvalue()
|
||||
|
||||
def editbar(self, d, **keywords):
|
||||
if self.cms_mode and not self.request.user.valid:
|
||||
return u''
|
||||
page = d['page']
|
||||
if not self.shouldShowEditbar(page):
|
||||
return u''
|
||||
result = []
|
||||
enabled_items = self.request.cfg.edit_bar
|
||||
suplementation_enabled = self.request.cfg.supplementation_page
|
||||
|
||||
if 'Edit' in enabled_items:
|
||||
result.append(self.edit_link(page))
|
||||
result.append(self.revert_link(page))
|
||||
|
||||
if 'Comments' in enabled_items:
|
||||
result.append(self.toggle_comments_link(page))
|
||||
|
||||
if ('Discussion' in enabled_items and
|
||||
self.request.getPragma('supplementation-page', suplementation_enabled) in
|
||||
(True, 1, 'on', '1')):
|
||||
result.append(self.supplementation_page_nameLink(page))
|
||||
|
||||
if 'Info' in enabled_items:
|
||||
result.append(self.info_link(page))
|
||||
if 'Subscribe' in enabled_items:
|
||||
result.append(self.subscribeLink(page))
|
||||
if 'Quicklink' in enabled_items:
|
||||
result.append(self.quicklinkLink(page))
|
||||
if 'Attachments' in enabled_items:
|
||||
result.append(self.attach_link(page))
|
||||
|
||||
if 'ActionsMenu' in enabled_items:
|
||||
result.append(self.actionsMenu(page).replace('</form>', '<input type="hidden" name="subpages_checked" value="1"></form>'))
|
||||
else:
|
||||
result.append(self.admin_link(page))
|
||||
return u'<div class="editbar"> %s </div>' % (u' '.join(result))
|
||||
|
||||
def edit_link(self, page):
|
||||
if not (page.isWritable() and self.request.user.may.write(page.page_name)):
|
||||
return self.disabledEdit()
|
||||
params = '%s?action=edit' % wikiutil.quoteWikinameURL(page.page_name)
|
||||
return wikiutil.link_tag(self.request, params, self._('Edit'), css_class="edit", name="texteditlink")
|
||||
|
||||
def info_link(self, page):
|
||||
params = '%s?action=info' % wikiutil.quoteWikinameURL(page.page_name)
|
||||
return wikiutil.link_tag(self.request, params, self._('History'), css_class="history")
|
||||
|
||||
def revert_link(self, page):
|
||||
try:
|
||||
rev = self.request.rev
|
||||
except AttributeError:
|
||||
return u''
|
||||
if not (rev and page.isWritable() and self.request.user.may.revert(page.page_name)):
|
||||
return u''
|
||||
params = '%s?action=revert&rev=%d' % (wikiutil.quoteWikinameURL(page.page_name), rev)
|
||||
return wikiutil.link_tag(self.request, params, self._('Revert'), css_class="revert")
|
||||
|
||||
def attach_link(self, page):
|
||||
params = '%s?action=AttachFile' % wikiutil.quoteWikinameURL(page.page_name)
|
||||
return wikiutil.link_tag(self.request, params, self._('Attachments'), css_class="attachments")
|
||||
|
||||
def toggle_comments_link(self, page):
|
||||
return '''<span class="toggleCommentsButton" style="display:none;">
|
||||
<a href="#" class="nbcomment" onClick="toggleComments();return false;">%s</a></span>''' % self._('Comments')
|
||||
|
||||
def admin_link(self, page):
|
||||
params = '%s?action=allactions' % wikiutil.quoteWikinameURL(page.page_name)
|
||||
return wikiutil.link_tag(self.request, params, self._('All Actions'), css_class="admin")
|
||||
|
||||
def gotobar(self, d, **k):
|
||||
request = self.request
|
||||
found = {}
|
||||
items = []
|
||||
item_template = u'<li class="%s">%s</li>'
|
||||
current = d['page_name']
|
||||
if request.cfg.navi_bar:
|
||||
for text in request.cfg.navi_bar:
|
||||
pagename, link = self.splitNavilink(text, localize=1)
|
||||
if self.request.user.may.read(pagename):
|
||||
cls = ['wikilink', 'wikilink current'][pagename == current]
|
||||
items.append(item_template %(cls, link))
|
||||
found[pagename] = 1
|
||||
userlinks = request.user.getQuickLinks()
|
||||
for text in userlinks:
|
||||
pagename, link = self.splitNavilink(text, localize=0)
|
||||
if not pagename in found:
|
||||
cls = ['userlink', 'userlink current'][pagename == current]
|
||||
items.append(item_template % (cls, link))
|
||||
found[pagename] = 1
|
||||
return u'<ul class="gotobar">%s<li class="clear"></li></ul>' % u' '.join(items)
|
||||
|
||||
def browser_is_konqueror(self):
|
||||
try:
|
||||
browser = self.request.user_agent.browser # Moin 1.9
|
||||
except AttributeError:
|
||||
browser = self.request.http_user_agent # Moin 1.8
|
||||
return 'konqueror' in browser.lower()
|
||||
|
||||
def html_stylesheets(self, d):
|
||||
|
||||
def ie_version_spec(ie_style): return re.compile('msie/.*_ie').sub('IE ', ie_style)
|
||||
def ie_style(style, ie_version): return 'msie/%s_ie%d' % (style, ie_version)
|
||||
def is_konqueror_style(style): return style.startswith('konqueror')
|
||||
def is_ie_style(style): return style.startswith('msie')
|
||||
|
||||
def ie_content(content, version_spec='IE'):
|
||||
version_spec = version_spec.replace('<= ', 'lte ')
|
||||
return '<!--[if %s]>%s<![endif]-->' % (version_spec, content)
|
||||
|
||||
def is_expected(style, namespace, custom_dir_exists):
|
||||
if namespace == '/custom':
|
||||
return custom_dir_exists
|
||||
else:
|
||||
return not (is_ie_style(style) or is_konqueror_style(style)) or (style in expected_styles)
|
||||
|
||||
def get_media_param():
|
||||
try:
|
||||
return self.request.values.get('media')
|
||||
except AttributeError:
|
||||
return self.request.form.get('media', [None])[0]
|
||||
|
||||
def add_style(style, media='all'):
|
||||
styles.append((style, media))
|
||||
if self.browser_is_konqueror():
|
||||
styles.append(('konqueror/%s' % style, media))
|
||||
for version in [7, 8]:
|
||||
style_for_ie = ie_style(style, version)
|
||||
styles.append((style_for_ie, media))
|
||||
|
||||
expected_styles = [ie_style(style, version) for style, version in (
|
||||
('style', 7),
|
||||
('style', 8),
|
||||
('shadow', 8),
|
||||
('shadow_clear', 8)
|
||||
)]
|
||||
expected_styles.append('konqueror/style')
|
||||
expected_styles.append('konqueror/shadow')
|
||||
expected_styles.append('konqueror/shadow_clear')
|
||||
|
||||
clear = self.get_config('clear', default=False)
|
||||
shadow = self.get_config('shadow', default=False)
|
||||
full_screen = self.get_config('full_screen', default=False)
|
||||
print_action = self.request.action == 'print'
|
||||
|
||||
tags = []
|
||||
styles = []
|
||||
add_style('style')
|
||||
if clear:
|
||||
add_style('clear')
|
||||
|
||||
if print_action:
|
||||
add_style('print')
|
||||
if get_media_param() == 'projection':
|
||||
add_style('projection')
|
||||
else:
|
||||
add_style('projection', media='projection')
|
||||
else:
|
||||
if full_screen:
|
||||
add_style('full', media='screen')
|
||||
elif shadow:
|
||||
add_style('shadow', media='screen')
|
||||
if clear:
|
||||
add_style('shadow_clear', media='screen')
|
||||
|
||||
add_style('print', media='print')
|
||||
add_style('print', media='projection')
|
||||
add_style('projection', media='projection')
|
||||
|
||||
static_dir = self.get_config('htdocs_dir', by_user=False)
|
||||
if static_dir is None:
|
||||
try:
|
||||
# Moin 1.9
|
||||
from MoinMoin.web.static import STATIC_FILES_PATH
|
||||
static_dir = STATIC_FILES_PATH
|
||||
except ImportError:
|
||||
# Moin 1.8
|
||||
moin_base = re.sub('MoinMoin$', '', self.cfg.moinmoin_dir)
|
||||
static_dir = os.path.join(moin_base, 'wiki', 'htdocs')
|
||||
if not os.path.exists(static_dir):
|
||||
static_dir = '/usr/share/moin/htdocs'
|
||||
|
||||
link_template = '<link rel="stylesheet" type="text/css" media="%s" href="%s">'
|
||||
url_prefix = "%s/%s/css" % (self.static_prefix, self.name)
|
||||
css_dir = os.path.join(static_dir, self.name, 'css')
|
||||
custom_dir = os.path.join(css_dir, 'custom')
|
||||
found_css_dir = os.path.exists(css_dir)
|
||||
found_custom_dir = found_css_dir and os.path.exists(custom_dir)
|
||||
|
||||
for style, media in styles:
|
||||
for namespace in ['', '/custom']:
|
||||
css_url = '%s%s/%s.css' % (url_prefix, namespace, style)
|
||||
css_file = '%s%s/%s.css' % (css_dir, namespace, style)
|
||||
if not found_css_dir or (is_expected(style, namespace, found_custom_dir) and os.path.exists(css_file)):
|
||||
css_link = link_template % (media, css_url)
|
||||
if is_ie_style(style):
|
||||
css_link = ie_content(css_link, ie_version_spec(style))
|
||||
tags.append(css_link)
|
||||
|
||||
return '\n'.join(tags)
|
||||
|
||||
def searchform(self, d):
|
||||
_ = self._
|
||||
form = self.request.form
|
||||
updates = {
|
||||
'search_label' : _('Search:'),
|
||||
'search_value': wikiutil.escape(form.get('value', [''])[0], 1),
|
||||
'search_full_label' : _('Text'),
|
||||
'search_title_label' : _('Titles'),
|
||||
}
|
||||
d.update(updates)
|
||||
|
||||
return u'''
|
||||
<form class="search" method="get" action="">
|
||||
<p>
|
||||
<input type="hidden" name="action" value="fullsearch">
|
||||
<input type="hidden" name="context" value="180">
|
||||
<label for="search">%(search_label)s</label>
|
||||
<input id="search" type="text" name="value" value="%(search_value)s">
|
||||
<input id="titlesearch" name="titlesearch" type="submit" value="%(search_title_label)s">
|
||||
<input id="fullsearch" name="fullsearch" type="submit" value="%(search_full_label)s">
|
||||
</p>
|
||||
</form>''' % d
|
||||
|
||||
def pageinfo(self, page):
|
||||
if self.cms_mode and not self.request.user.valid:
|
||||
return u''
|
||||
if self.request.action == 'print':
|
||||
return u''
|
||||
_ = self._
|
||||
html = ''
|
||||
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
|
||||
html = '<span class="time"%(lang)s>%(info)s</span>\n' % {
|
||||
'lang': self.ui_lang_attr(),
|
||||
'info': info
|
||||
}
|
||||
return html
|
||||
|
||||
def logo(self):
|
||||
logo = u''
|
||||
if self.cfg.logo_string:
|
||||
pagename = wikiutil.getFrontPage(self.request).page_name
|
||||
pagename = wikiutil.quoteWikinameURL(pagename)
|
||||
logo = wikiutil.link_tag(self.request, pagename, self.cfg.logo_string, css_class="logo")
|
||||
return logo
|
||||
|
||||
def headscript(self, d):
|
||||
"""Override the stupid default script with its hardcoded HTML structure"""
|
||||
return u'''<script type="text/javascript"><!--
|
||||
function add_gui_editor_links() {
|
||||
// Add gui editor link after the text editor link
|
||||
|
||||
// If the variable is not set or browser is not compatible, exit
|
||||
try {gui_editor_link_href}
|
||||
catch (e) {
|
||||
//alert("add_gui_editor_links: gui_editor_link_href not here");
|
||||
return
|
||||
}
|
||||
if (can_use_gui_editor() == false){
|
||||
//alert("add_gui_editor_links: can't use gui_editor");
|
||||
return;
|
||||
}
|
||||
var all = document.getElementsByName('texteditlink');
|
||||
for (i = 0; i < all.length; i++) {
|
||||
var textEditorLink = all[i];
|
||||
// Create a a link
|
||||
var guiEditorLink = document.createElement('a');
|
||||
guiEditorLink.href = gui_editor_link_href;
|
||||
guiEditorLink.className = "edit";
|
||||
var text = document.createTextNode(gui_editor_link_text);
|
||||
guiEditorLink.appendChild(text);
|
||||
// Insert in the editbar
|
||||
var editbar = textEditorLink.parentNode
|
||||
editbar.insertBefore(guiEditorLink, textEditorLink);
|
||||
}
|
||||
}
|
||||
--></script>
|
||||
'''
|
||||
|
||||
def execute(request):
|
||||
return Theme(request)
|
Loading…
Add table
Add a link
Reference in a new issue