[wiki-lenny] on retire ce qui est dans le paquet debian custom
darcs-hash:20090314090711-bd074-5773471654807d83978f6ab5fea6cf009078dbea.gz
This commit is contained in:
parent
8fdb1392da
commit
4bdf440b15
6 changed files with 10 additions and 908 deletions
5
wiki-lenny/local/formatter/__init__.py
Normal file
5
wiki-lenny/local/formatter/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# -*- coding: iso-8859-1 -*-
|
||||||
|
|
||||||
|
from MoinMoin.util import pysupport
|
||||||
|
|
||||||
|
modules = pysupport.getPackageModules(__file__)
|
|
@ -1,94 +0,0 @@
|
||||||
# -*- coding: iso-8859-1 -*-
|
|
||||||
"""
|
|
||||||
..
|
|
||||||
.... ............ ........
|
|
||||||
. ....... . .... ..
|
|
||||||
. ... .. .. .. .. ..... . ..
|
|
||||||
.. .. ....@@@. .. . ........ .
|
|
||||||
.. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
|
|
||||||
.@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
|
|
||||||
@@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
|
|
||||||
.@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
|
|
||||||
...@@@.... @@@ .@@.......... ........ ..... ..
|
|
||||||
. ..@@@@.. . .@@@@. .. ....... . .............
|
|
||||||
. .. .... .. .. . ... ....
|
|
||||||
. . .... ............. .. ...
|
|
||||||
.. .. ... ........ ... ...
|
|
||||||
................................
|
|
||||||
|
|
||||||
MoinMoin - Box parser
|
|
||||||
|
|
||||||
PURPOSE:
|
|
||||||
une boite jolie
|
|
||||||
|
|
||||||
CALLING SEQUENCE:
|
|
||||||
{{{
|
|
||||||
#!Box titre
|
|
||||||
blablabla
|
|
||||||
|
|
||||||
tables, images....
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Copyright 2008 Antoine Durand-Gasselin <adg@crans.org>
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os,string,re,StringIO
|
|
||||||
from MoinMoin import config, wikiutil
|
|
||||||
from MoinMoin.parser.text_moin_wiki import Parser as WikiParser
|
|
||||||
|
|
||||||
Dependencies = []
|
|
||||||
color_list = ['orange', 'black', 'red', 'green', 'blue', 'gray']
|
|
||||||
|
|
||||||
#####################################################################
|
|
||||||
# Parser : classe principale, c'est elle qui fait tout
|
|
||||||
#######
|
|
||||||
class Parser:
|
|
||||||
parsername = "Box"
|
|
||||||
Dependencies=Dependencies
|
|
||||||
|
|
||||||
def __init__(self, raw, request, **kw):
|
|
||||||
self.form = request.form
|
|
||||||
self.request = request
|
|
||||||
self.raw = raw
|
|
||||||
self.settings = self.parseArgs(kw["format_args"])
|
|
||||||
|
|
||||||
def getRandomColor(self):
|
|
||||||
nb_of_colors = color_list.__len__()
|
|
||||||
from random import randint
|
|
||||||
colorNum = randint(0, nb_of_colors - 1)
|
|
||||||
return color_list[colorNum]
|
|
||||||
|
|
||||||
def parseArgs(self, argsString):
|
|
||||||
argList = argsString.split(u',')
|
|
||||||
settings = {}
|
|
||||||
for anArg in argList:
|
|
||||||
anArg = anArg.strip(u' ')
|
|
||||||
if anArg.find(u'color=')!=-1:
|
|
||||||
theColor = anArg.split(u'=')[1].lower()
|
|
||||||
if theColor == 'random':
|
|
||||||
theColor = self.getRandomColor()
|
|
||||||
settings['color'] = theColor
|
|
||||||
else:
|
|
||||||
settings['title'] = anArg
|
|
||||||
return settings
|
|
||||||
|
|
||||||
def format(self, formatter):
|
|
||||||
|
|
||||||
# on utilise la classe qui va fabriquer le code html
|
|
||||||
try: title = self.settings['title']
|
|
||||||
except: title = ''
|
|
||||||
try: color = self.settings['color']
|
|
||||||
except: color=None
|
|
||||||
|
|
||||||
content_buf = StringIO.StringIO()
|
|
||||||
self.request.redirect(content_buf)
|
|
||||||
WikiParser(self.raw, self.request).format(formatter)
|
|
||||||
content = content_buf.getvalue()
|
|
||||||
self.request.redirect()
|
|
||||||
|
|
||||||
del content_buf
|
|
||||||
|
|
||||||
# On le fout dans une boîte
|
|
||||||
self.request.write(formatter.crans_box(title, content, color))
|
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""
|
|
||||||
..
|
|
||||||
.... ............ ........
|
|
||||||
. ....... . .... ..
|
|
||||||
. ... .. .. .. .. ..... . ..
|
|
||||||
.. .. ....@@@. .. . ........ .
|
|
||||||
.. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
|
|
||||||
.@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
|
|
||||||
@@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
|
|
||||||
.@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
|
|
||||||
...@@@.... @@@ .@@.......... ........ ..... ..
|
|
||||||
. ..@@@@.. . .@@@@. .. ....... . .............
|
|
||||||
. .. .... .. .. . ... ....
|
|
||||||
. . .... ............. .. ...
|
|
||||||
.. .. ... ........ ... ...
|
|
||||||
................................
|
|
||||||
|
|
||||||
MoinMoin - Portail parser
|
|
||||||
|
|
||||||
PURPOSE:
|
|
||||||
Pour afficher un portail a la wikipedia.
|
|
||||||
|
|
||||||
CALLING SEQUENCE:
|
|
||||||
{{{
|
|
||||||
#!Portail
|
|
||||||
image1.png @@ title1 @@ description 1
|
|
||||||
image2.png @@ title2 @@ description 2
|
|
||||||
image3.png @@ title3 @@ description 3
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Copyright 2008 Antoine Durand-Gasselin <adg@crans.org>
|
|
||||||
|
|
||||||
"""
|
|
||||||
import os,string,re,StringIO
|
|
||||||
from MoinMoin.action import AttachFile
|
|
||||||
from MoinMoin.parser.text_moin_wiki import Parser as WikiParser
|
|
||||||
|
|
||||||
#####################################################################
|
|
||||||
# Parser : classe principale, c'est elle qui fait tout
|
|
||||||
#######
|
|
||||||
class Parser:
|
|
||||||
def __init__(self, raw, request, **kw):
|
|
||||||
self.request = request
|
|
||||||
self.form = request.form
|
|
||||||
self.raw = raw
|
|
||||||
|
|
||||||
def format(self, formatter):
|
|
||||||
# on divise le textes en lignes (1 ligne = une entree dans le portail)
|
|
||||||
quotes = self.raw.split('\n')
|
|
||||||
|
|
||||||
# on récupere le chemin des fichiers attaches pour les images
|
|
||||||
current_pagename=formatter.page.page_name
|
|
||||||
attachment_path = AttachFile.getAttachDir(self.request, current_pagename, create=1)
|
|
||||||
# on traite les ligne une à une
|
|
||||||
entries = []
|
|
||||||
for line in quotes:
|
|
||||||
line=line.strip()
|
|
||||||
items=line.split('@@',2)
|
|
||||||
if len(items)<3:
|
|
||||||
# Voir ce qu'on fait
|
|
||||||
## self.request.write('<!-- error, wrong number of parameters -->')
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# On récupère le nom de l'image
|
|
||||||
pic = items[0].strip()
|
|
||||||
|
|
||||||
# On va formatter le titre et la légende
|
|
||||||
tit_buf = StringIO.StringIO()
|
|
||||||
bod_buf = StringIO.StringIO()
|
|
||||||
|
|
||||||
self.request.redirect(tit_buf)
|
|
||||||
WikiParser(items[1], self.request).format(formatter)
|
|
||||||
title = tit_buf.getvalue()
|
|
||||||
self.request.redirect()
|
|
||||||
|
|
||||||
self.request.redirect(bod_buf)
|
|
||||||
WikiParser(items[2], self.request).format(formatter)
|
|
||||||
body = bod_buf.getvalue()
|
|
||||||
self.request.redirect()
|
|
||||||
|
|
||||||
# Qu'on rajoute à la liste des entrées
|
|
||||||
entries += [ (( pic, title, body )) ]
|
|
||||||
|
|
||||||
self.request.write(formatter.crans_portal(entries))
|
|
5
wiki-lenny/local/parser/__init__.py
Normal file
5
wiki-lenny/local/parser/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# -*- coding: iso-8859-1 -*-
|
||||||
|
|
||||||
|
from MoinMoin.util import pysupport
|
||||||
|
|
||||||
|
modules = pysupport.getPackageModules(__file__)
|
|
@ -1,540 +0,0 @@
|
||||||
# -*- 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 <jim AT clarkster DOT co DOT uk>
|
|
||||||
@license: GNU GPL, see COPYING for details.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from MoinMoin.theme import ThemeBase
|
|
||||||
from MoinMoin import wikiutil, i18n
|
|
||||||
from MoinMoin.Page import Page
|
|
||||||
from crans import ThemeCrans
|
|
||||||
|
|
||||||
class Theme(ThemeBase):
|
|
||||||
icons = ThemeCrans.icons
|
|
||||||
|
|
||||||
|
|
||||||
name = "crans-www"
|
|
||||||
|
|
||||||
# Liste des feuilles de style
|
|
||||||
stylesheets = (
|
|
||||||
# media basename
|
|
||||||
('all', 'common'),
|
|
||||||
('screen', 'layout'),
|
|
||||||
('screen', 'screen'),
|
|
||||||
('print', 'print'),
|
|
||||||
# ('projection', 'projection'),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# liste des liens du menu
|
|
||||||
menu_links = [
|
|
||||||
# tire #lien
|
|
||||||
|
|
||||||
(u"Accueil", u"http://www.crans.org/"),
|
|
||||||
(u"Webmail", u"https://webmail.crans.org/"),
|
|
||||||
(u"Accès SSH", u"http://www.crans.org/VieCrans/OpenSsh"),
|
|
||||||
(u"Accès Intranet",u"https://intranet.crans.org/"),
|
|
||||||
(u"Pages persos", u"http://www.crans.org/PagesPerso"),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Chemin des badges
|
|
||||||
badgesPath = u'/wiki/common/badges/'
|
|
||||||
|
|
||||||
|
|
||||||
# liste des badges
|
|
||||||
support_badges = [
|
|
||||||
# page, # image # alt text
|
|
||||||
(u'http://www.mozilla-europe.org/fr/products/firefox/', u'badges_80x15_firefox.png', u'Get firefox'),
|
|
||||||
(u'http://www.debian.org/', u'badges_80x15_debian.png', u'Debian powered'),
|
|
||||||
(u'http://www.apache.org/', u'badges_80x15_apache.png', u'Apache powered'),
|
|
||||||
(u'http://www.python.org/', u'badges_80x15_python.png', u'Python powered'),
|
|
||||||
(u'http://www.federez.org/', u'badges_80x15_federez.png', u'Membre du réseau federeez'),
|
|
||||||
(u'http://moinmoin.wikiwikiweb.de/', u'badges_80x15_moinmoin.png', u'Moinmoin powered'),
|
|
||||||
(u'http://jigsaw.w3.org/css-validator/check?uri=referer&profile=css3&warning=no', u'valid_css_80x15.png', u'Valid css3'),
|
|
||||||
# (u'http://validator.w3.org/check?uri=referer', u'valid_html401_80x15.png', u'Valid html 4.01'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# 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.
|
|
||||||
"""
|
|
||||||
parent = d['page'].getParentPage()
|
|
||||||
title = [
|
|
||||||
'<div id="maintitle">',
|
|
||||||
self.title(d),
|
|
||||||
parent and wikiutil.link_tag(self.request,
|
|
||||||
parent.page_name,
|
|
||||||
u'<img src="/wiki/crans-www/img/go-up.png" alt="Haut">') or u'',
|
|
||||||
'</div>'
|
|
||||||
]
|
|
||||||
html = [
|
|
||||||
u'<div id="globalWrapper">',
|
|
||||||
self.logo(),
|
|
||||||
u'<div id="column-content">',
|
|
||||||
self.startPage(),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if d['page'].page_name != 'VieCrans' :
|
|
||||||
html += title
|
|
||||||
html += [self.msg(d)]
|
|
||||||
return u'\n'.join(html)
|
|
||||||
|
|
||||||
def footer(self, d, **keywords):
|
|
||||||
""" Assemble wiki footer
|
|
||||||
"""
|
|
||||||
html = [
|
|
||||||
# End of page
|
|
||||||
u'<div class="visualClear"></div>',
|
|
||||||
self.endPage(),
|
|
||||||
u'<div class="visualclear"></div>',
|
|
||||||
u'</div>',
|
|
||||||
self.menu(d),
|
|
||||||
u'</div>',
|
|
||||||
self.username(d),
|
|
||||||
self.badges(d),
|
|
||||||
u'<script src="/wiki/common/js/say.no.to.ie.6.js"></script>', # Campagne "Save A Developer. Upgrade Your Browser."
|
|
||||||
]
|
|
||||||
return u'\n'.join(html)
|
|
||||||
|
|
||||||
def menu(self, d):
|
|
||||||
""" assemble all the navigation aids for the page
|
|
||||||
"""
|
|
||||||
liens = []
|
|
||||||
for titre, lien in self.menu_links:
|
|
||||||
liens.append(u'<li><a href="%s">%s</a></li>' % (lien, titre))
|
|
||||||
html = [
|
|
||||||
u'<div class="portlet" id="MenuNavigation">',
|
|
||||||
u'<ul>',
|
|
||||||
u'\n'.join(liens),
|
|
||||||
u'<li>%s</li>' % self.searchform(d),
|
|
||||||
u'</ul>',
|
|
||||||
u'</div>',
|
|
||||||
]
|
|
||||||
return u''.join(html)
|
|
||||||
|
|
||||||
|
|
||||||
def badges(self,d ):
|
|
||||||
badges_html = []
|
|
||||||
for page, image, alt_text in self.support_badges:
|
|
||||||
badges_html.append(u'<li><a href="%(href)s" title="%(alt)s"><img src="%(path)s%(image)s" alt="%(alt)s"></a></li>' % {'href':page, 'path':self.badgesPath, 'image':image, 'alt':alt_text})
|
|
||||||
html = [
|
|
||||||
u'<ul class="supportBadges">',
|
|
||||||
u'\n'.join(badges_html),
|
|
||||||
u'</ul>\n\n',
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
return u''.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'''
|
|
||||||
<form id="searchform" method="get" action="">
|
|
||||||
<h5><label for="searchInput">%(search_label)s</label></h5>
|
|
||||||
<div>
|
|
||||||
<input type="hidden" name="action" value="fullsearch">
|
|
||||||
<input type="hidden" name="context" value="180">
|
|
||||||
<input id="searchInput" name="value" type="text" accesskey="f"
|
|
||||||
value="%(search_value)s"><br />
|
|
||||||
<input id="titlesearch" name="titlesearch" type="submit" class="searchButton"
|
|
||||||
value="%(search_title_label)s" alt="Search Titles">
|
|
||||||
<input id="fullsearch" name="fullsearch" type="submit" class="searchButton"
|
|
||||||
value="%(search_full_label)s" alt="Search Full Text">
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
''' % d
|
|
||||||
return html
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def columnone(self, d):
|
|
||||||
""" assemble all the navigation aids for the page
|
|
||||||
"""
|
|
||||||
page = d['page']
|
|
||||||
html = [
|
|
||||||
u'<div id="column-one">',
|
|
||||||
self.editbar(d),
|
|
||||||
self.username(d),
|
|
||||||
u'<div class="portlet" id="p-logo">',
|
|
||||||
self.logo(),
|
|
||||||
u'</div>',
|
|
||||||
self.navibar(d),
|
|
||||||
self.searchform(d),
|
|
||||||
self.actionmenu(d),
|
|
||||||
u'<div class="visualClear"></div>',
|
|
||||||
u'<div id="footer">',
|
|
||||||
self.pageinfo(page),
|
|
||||||
self.credits(d),
|
|
||||||
u'</div>',
|
|
||||||
u'</div>'
|
|
||||||
]
|
|
||||||
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 = [('show', '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'),
|
|
||||||
('subscribe', 'Subscribe', 'Subscribe to updates to this page', 'w')]
|
|
||||||
|
|
||||||
items = []
|
|
||||||
current = self.request.form.get('action', ['show'])[0]
|
|
||||||
for action, title, description, accesskey in tabs:
|
|
||||||
if action == current:
|
|
||||||
cls = 'selected'
|
|
||||||
else:
|
|
||||||
cls = 'none'
|
|
||||||
|
|
||||||
if action == 'edit':
|
|
||||||
if page.isWritable() and request.user.may.write(page.page_name):
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
action = 'raw'
|
|
||||||
title = 'View Source'
|
|
||||||
description = 'This page is protected. You can view its source'
|
|
||||||
|
|
||||||
if action == 'subscribe':
|
|
||||||
user = self.request.user
|
|
||||||
if not self.cfg.mail_smarthost or not user.valid:
|
|
||||||
break
|
|
||||||
# Email enabled and user valid, get current page status
|
|
||||||
if user.isSubscribedTo([page.page_name]):
|
|
||||||
title = 'Unsubscribe'
|
|
||||||
description = 'Unsubscribe from updates to this page'
|
|
||||||
|
|
||||||
|
|
||||||
if action == 'show':
|
|
||||||
url = quotedname
|
|
||||||
else:
|
|
||||||
url = quotedname + '?action=' + action
|
|
||||||
|
|
||||||
|
|
||||||
attrs = self.extendedAttrs(_(description), accesskey)
|
|
||||||
link = wikiutil.link_tag(self.request, url, _(title), attrs=attrs)
|
|
||||||
items.append(u'<li class="%s">%s</li>' % (cls, link))
|
|
||||||
|
|
||||||
html = [
|
|
||||||
u'<div id="p-cactions" class="portlet">',
|
|
||||||
u'<ul class="editbar">',
|
|
||||||
''.join(items),
|
|
||||||
u'</ul>',
|
|
||||||
u'</div>'
|
|
||||||
]
|
|
||||||
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',
|
|
||||||
'refresh',
|
|
||||||
'AttachFile',
|
|
||||||
'SpellCheck',
|
|
||||||
'LikePages',
|
|
||||||
'LocalSiteMap',
|
|
||||||
'RenamePage',
|
|
||||||
'DeletePage',
|
|
||||||
]
|
|
||||||
|
|
||||||
titles = {
|
|
||||||
'raw': _('Show Raw Text', formatted=False),
|
|
||||||
'print': _('Show Print View', 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'<div class="portlet" id="p-tb">',
|
|
||||||
u'<h5>Toolbox</h5>',
|
|
||||||
u'<div class="pBody">',
|
|
||||||
u'<ul>',
|
|
||||||
u'<li>%s</li></ul>' % '</li>\n<li>'.join(links),
|
|
||||||
u'</ul>',
|
|
||||||
u'</div>',
|
|
||||||
u'</div>',
|
|
||||||
]
|
|
||||||
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.getLocalizedPage(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))
|
|
||||||
url = u'http://wiki.crans.org/%s' % d['page'].page_name
|
|
||||||
link = u'<a href="%s">%s</a>' % ( url, 'Version Wiki')
|
|
||||||
userlinks.append(link)
|
|
||||||
|
|
||||||
|
|
||||||
html = [
|
|
||||||
u'<div class="portlet" id="p-personal">',
|
|
||||||
u'<ul id="username">',
|
|
||||||
u'<li class="pt-userpage">%s</li>' % '</li>\n<li>'.join(userlinks),
|
|
||||||
u'</ul>',
|
|
||||||
u'</div>'
|
|
||||||
]
|
|
||||||
return ''.join(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)
|
|
||||||
"""
|
|
||||||
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'<div class="portlet" id="MenuNavigation">',
|
|
||||||
u'<ul>',
|
|
||||||
u'<li>%s</li></ul>' % '</li>\n<li>'.join(links),
|
|
||||||
u'</ul>',
|
|
||||||
u'</div>',
|
|
||||||
]
|
|
||||||
return ''.join(html)
|
|
||||||
|
|
||||||
def pageinfo(self, page):
|
|
||||||
""" Simple override from base class.
|
|
||||||
Remove <p> 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 = ('<link rel="stylesheet" type="text/css" charset="%s"'
|
|
||||||
' media="%s" href="%s">')
|
|
||||||
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>.:: CRANS : Cachan / Réseau @ Normale Sup' ::.</title>",
|
|
||||||
self.headscript(d), # Should move to separate .js file
|
|
||||||
self.html_stylesheets(d),
|
|
||||||
self.rtl_stylesheet(d),
|
|
||||||
self.rsslink(d),
|
|
||||||
]
|
|
||||||
return '\n'.join(html)
|
|
||||||
|
|
||||||
|
|
||||||
def execute(request):
|
|
||||||
"""
|
|
||||||
Generate and return a theme object
|
|
||||||
|
|
||||||
|
|
||||||
@param request: the request object
|
|
||||||
@rtype: MoinTheme
|
|
||||||
@return: Theme object
|
|
||||||
"""
|
|
||||||
return Theme(request)
|
|
|
@ -1,189 +0,0 @@
|
||||||
# -*- 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 <jim AT clarkster DOT co DOT uk>
|
|
||||||
Adapted for CR@NS by Nicolas Salles <salles AT crans DOT org>
|
|
||||||
@license: GNU GPL, see COPYING for details.
|
|
||||||
"""
|
|
||||||
import datetime
|
|
||||||
from MoinMoin.theme import ThemeBase
|
|
||||||
from MoinMoin import wikiutil, i18n
|
|
||||||
from MoinMoin.Page import Page
|
|
||||||
|
|
||||||
class ThemeCrans(ThemeBase):
|
|
||||||
|
|
||||||
name = "crans"
|
|
||||||
|
|
||||||
# Standard set of style sheets
|
|
||||||
stylesheets = (
|
|
||||||
# media basename
|
|
||||||
('all', 'common'),
|
|
||||||
('screen', 'crans'),
|
|
||||||
('print', 'print'),
|
|
||||||
('projection', 'projection'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Standard set of scripts
|
|
||||||
scripts = (
|
|
||||||
'crans',
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# 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.
|
|
||||||
"""
|
|
||||||
if datetime.date.today().month == 10:
|
|
||||||
extra_style = " class=\"halloween\""
|
|
||||||
elif (datetime.date.today().month == 12) and (datetime.date.today().day <= 24):
|
|
||||||
extra_style = " class=\"noel\""
|
|
||||||
else:
|
|
||||||
extra_style = ""
|
|
||||||
parent = d['page'].getParentPage()
|
|
||||||
html = [
|
|
||||||
u'<div id="globalWrapper"%s>' % extra_style,
|
|
||||||
u'<div id="main-content">',
|
|
||||||
u'<div id="titleBarre">',
|
|
||||||
'<h1 id="title">',
|
|
||||||
self.title(d),
|
|
||||||
u'</h1>',
|
|
||||||
u'</div>',
|
|
||||||
self.msg(d),
|
|
||||||
self.startPage(),
|
|
||||||
]
|
|
||||||
return u'\n'.join(html)
|
|
||||||
|
|
||||||
editorheader = header
|
|
||||||
def footer(self, d, **keywords):
|
|
||||||
""" Assemble wiki footer
|
|
||||||
"""
|
|
||||||
html = [
|
|
||||||
# End of page
|
|
||||||
self.pageinfo(d['page']),
|
|
||||||
self.endPage(),
|
|
||||||
u'</div>', # fin du div main-content
|
|
||||||
self.rightcolumn(d),
|
|
||||||
u'</div>', # fin du div globalWrapper
|
|
||||||
u'<script src="/wiki/common/js/say.no.to.ie.6.js"></script>', # Campagne "Save A Developer. Upgrade Your Browser."
|
|
||||||
]
|
|
||||||
return u'\n'.join(html)
|
|
||||||
|
|
||||||
def rightcolumn(self, d):
|
|
||||||
""" assemble all the navigation aids for the page
|
|
||||||
"""
|
|
||||||
_ = self.request.getText
|
|
||||||
page = d['page']
|
|
||||||
html = [
|
|
||||||
u'<div id="column-one">',
|
|
||||||
u"<h5>Personnel</h5>",
|
|
||||||
self.username(d),
|
|
||||||
u"<h5>Navigation</h5>",
|
|
||||||
self.navibar(d),
|
|
||||||
# hack : c1 and V1 or v2 c'est comme le code C : c1? v1 : V2
|
|
||||||
# (si c1 est vrai alors prends la valeur V1 sinon prend la valeur c2
|
|
||||||
self.shouldShowEditbar(d['page']) and u"<h5>%s</h5>" % _("Page") or u" ",
|
|
||||||
self.editbar(d),
|
|
||||||
u"<h5>%s</h5>" % _('Search'),
|
|
||||||
self.searchform(d),
|
|
||||||
#self.actionmenu(d),
|
|
||||||
#self.pageinfo(page),
|
|
||||||
self.credits(d),
|
|
||||||
]
|
|
||||||
return u'\n'.join(html)
|
|
||||||
|
|
||||||
def html_head(self, d):
|
|
||||||
""" add opensearch description to html head
|
|
||||||
"""
|
|
||||||
# common prefix for static content
|
|
||||||
prefix = self.cfg.url_prefix
|
|
||||||
open_search_desc = '\n<link rel="search" type="application/opensearchdescription+xml" href="%(page)s?action=opensearch&searchtype=Titres" title="%(sitename)s, Rechercher dans les titres" />\n<link rel="search" type="application/opensearchdescription+xml" href="%(page)s?action=opensearch&searchtype=Texte" title="%(sitename)s, Rechercher dans le texte" />' % {'page':d['page'].request.script_name, 'sitename':d['sitename']}
|
|
||||||
if (d['page'].isWritable() and
|
|
||||||
self.request.user.may.write(d['page'].page_name)):
|
|
||||||
edit_link = "/" + wikiutil.quoteWikinameURL(d['page'].page_name) + '?action=edit&editor=text'
|
|
||||||
wiki_rel = '<link rel="alternate" \
|
|
||||||
type="application/x-wiki" title="Modifier" \
|
|
||||||
href="%s" />\n' % edit_link
|
|
||||||
else:
|
|
||||||
wiki_rel = ""
|
|
||||||
|
|
||||||
classic_head = ThemeBase.html_head(self, d)
|
|
||||||
|
|
||||||
return classic_head + open_search_desc + wiki_rel
|
|
||||||
|
|
||||||
def headscript(self, d):
|
|
||||||
html = []
|
|
||||||
# Check mode
|
|
||||||
if d.get('print_mode'):
|
|
||||||
link = ""
|
|
||||||
else:
|
|
||||||
# Create stylesheets links
|
|
||||||
link = '<script type="text/javascript" src="%s"></script>'
|
|
||||||
prefix = self.cfg.url_prefix
|
|
||||||
csshref = '%s/%s/js' % (prefix, self.name)
|
|
||||||
html = []
|
|
||||||
for basename in self.scripts:
|
|
||||||
href = '%s/%s.js' % (csshref, basename)
|
|
||||||
html.append(link % href )
|
|
||||||
|
|
||||||
if not self.request.query_string:
|
|
||||||
html.append('''
|
|
||||||
<script language="JavaScript">
|
|
||||||
function keyHandler(e)
|
|
||||||
{
|
|
||||||
e = e || window.event;
|
|
||||||
kCode = e.keyCode || e.which; // gets the keycode in ie or ns
|
|
||||||
if ( e.ctrlKey && kCode == 117) // ctrl+u
|
|
||||||
{
|
|
||||||
document.location.href = document.location.href+'?action=raw';
|
|
||||||
return false; // make it so the browser ignores key combo
|
|
||||||
}
|
|
||||||
if ( e.ctrlKey && kCode == 104) // ctrl+h
|
|
||||||
{
|
|
||||||
document.location.href = document.location.href+'?action=info';
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if ( e.ctrlKey && kCode == 101) // ctrl+e
|
|
||||||
{
|
|
||||||
document.location.href = document.location.href+'?action=edit';
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
document.onkeypress = keyHandler;
|
|
||||||
</script>
|
|
||||||
''')
|
|
||||||
|
|
||||||
return ThemeBase.headscript(self, d) + u"\n".join(html)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Theme(ThemeCrans):
|
|
||||||
|
|
||||||
name = "crans"
|
|
||||||
|
|
||||||
# Standard set of style sheets
|
|
||||||
stylesheets = (
|
|
||||||
# media basename
|
|
||||||
('all', 'common'),
|
|
||||||
('screen', 'layout'),
|
|
||||||
('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)
|
|
Loading…
Add table
Add a link
Reference in a new issue