scripts/wiki/dump-wiki.py
Grgoire Dtrez 093e9eec6c enttes html
darcs-hash:20080123113644-69ccb-524bfc561fd3f63d80eb320d197f5fbe716b862a.gz
2008-01-23 12:36:44 +01:00

189 lines
7.1 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
#
# Dumpe une partie du Wiki dans le répertoire donné pour créer
# une copie "statique".
#
# Exemple : python dump-wiki.py --regex WiFi/AvoirLeWifi".*" ~/macopie
# Les pages correspondant à la regex donnée seront placées dans
# le répertoire ~/macopie/wiki. Les attachements seront dans
# ~/macopie/attach.
#
# Actuellement, j'utilise :
# sudo python /usr/scripts/dump-wiki.py --regex 'WiFi(/PositionnementDesBornes|/AvoirLeWifi.*)?' ~/mointest
#!/usr/bin/python2.3
# -*- coding: iso-8859-1 -*-
"""
MoinMoin - Dump a MoinMoin wiki to static pages
@copyright: 2002-2004 by Jürgen Hermann <jh@web.de>
@license: GNU GPL, see COPYING for details.
"""
__version__ = "20040329"
# use this if your moin installation is not in sys.path:
import sys
sys.path.insert(0, '../..') # path to MoinMoin
sys.path.insert(0, '/etc/moin')
url_prefix = "."
HTML_SUFFIX = ".html"
page_template = u'''
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
<meta http-equiv="content-type" content="text/html; charset=%(charset)s">
<title>%(pagename)s</title>
<link rel="stylesheet" type="text/css" href="../wiki.css">
</head>
<body>
<p class="avertissement">
Ce site est une copie statique et partielle de ce que l'on peut trouver sur le
<a href="http://wiki.crans.org">wiki</a> de l'association. Si vous êtes ici, alors
que vous avez demandé un autre site, c'est sans doute que vous êtes connecté
au réseau wifi de l'association mais que vous n'avez pas encore complété toutes
les étapes nécessaires pour avoir une connexion pleinement fonctionnelle. Ce site
contient donc les infos pour configurer correctement votre connexion.
</p>
<div id="title"><h1>%(pagenamewithlinks)s</h1></div>
%(pagehtml)s
<p class="creation">
Cette page a été extraite du wiki le %(timestamp)s. Vous pouvez l'<a href="%(wikilink)s?action=edit">éditer</a> ou <a href="%(wikilink)s">voir</a> la page originale.
</p>
</body>
</html>
'''
#'
import os, time, StringIO, codecs, shutil, re
from MoinMoin import config, wikiutil, Page
from MoinMoin.script import _util
from MoinMoin.request import RequestCLI
from MoinMoin.action import AttachFile
class MoinDump(_util.Script):
def __init__(self):
_util.Script.__init__(self, __name__, "[options] <target-directory>")
# --regex=REGEX
self.parser.add_option(
"--regex", metavar="REGEX", dest="regex",
help="Ne copie que les pages correspondant à cette regex"
)
def mainloop(self):
""" moin-dump's main code. """
if len(sys.argv) == 1:
self.parser.print_help()
sys.exit(1)
# Prepare output directory
outputdir = self.args[0]
outputdir = os.path.abspath(outputdir)
if not os.path.isdir(outputdir):
try:
os.mkdir(outputdir)
_util.log("Created output directory '%s'!" % outputdir)
except OSError:
_util.fatal("Cannot create output directory '%s'!" % outputdir)
AttachFile.getAttachUrl = lambda pagename, filename, request, addts=0, escaped=0: (get_attachment(request, pagename, filename, outputdir))
# Dump the wiki
request = RequestCLI(u"wiki.crans.org/")
request.form = request.args = request.setup_args()
# fix url_prefix so we get relative paths in output html
request.cfg.url_prefix = url_prefix
# Get all existing pages in the wiki
pages = list(request.rootpage.getPageList(user=''))
if self.options.regex:
pages = list(filter(lambda x: re.match(self.options.regex, x), pages))
pages.sort()
quoteWikinameOriUrl = wikiutil.quoteWikinameURL
wikiutil.quoteWikinameURL = lambda pagename, qfn=wikiutil.quoteWikinameFS: (qfn(pagename) + HTML_SUFFIX)
errfile = os.path.join(outputdir, 'error.log')
errlog = open(errfile, 'w')
errcnt = 0
for pagename in pages:
file = wikiutil.quoteWikinameURL(pagename) # we have the same name in URL and FS
# On construit le nom de la page avec les liens (peut sans doute mieux faire)
originalpagename = pagename
pagename = pagename.replace("/PagesStatiques", "")
pagenamewithlinks = [u'']
for composant in pagename.split("/"):
pagenamewithlinks.append(pagenamewithlinks[-1]+'/'+composant)
pagenamewithlinks = u" / ".join(map(lambda x: u'<a href="/wiki/%s">%s</a>' % (
wikiutil.quoteWikinameURL(x[1:]), x[1:].split("/")[-1]), pagenamewithlinks[1:]))
_util.log('Writing "%s"...' % file)
try:
pagehtml = ''
page = Page.Page(request, originalpagename)
try:
request.reset()
out = StringIO.StringIO()
request.redirect(out)
request.page = page
request.remote_addr = '138.231.136.7'
page.send_page(request, count_hit=0, content_only=1)
pagehtml = out.getvalue()
request.redirect()
except:
errcnt = errcnt + 1
print >>sys.stderr, "*** Caught exception while writing page!"
print >>errlog, "~" * 78
print >>errlog, file # page filename
import traceback
traceback.print_exc(None, errlog)
finally:
timestamp = time.strftime("%Y-%m-%d %H:%M")
filepath = os.path.join(outputdir, 'wiki', file)
fileout = codecs.open(filepath, 'w', config.charset)
fileout.write((page_template % {
'charset': config.charset,
'pagename': pagename,
'pagenamewithlinks': pagenamewithlinks,
'pagehtml': pagehtml,
'timestamp': timestamp,
'wikilink': u"http://wiki.crans.org/%s" % quoteWikinameOriUrl(originalpagename).encode("UTF-8"),
'theme': request.cfg.theme_default,
}).replace("./monobook", ".."))
fileout.close()
errlog.close()
if errcnt:
print >>sys.stderr, "*** %d error(s) occurred, see '%s'!" % (errcnt, errfile)
def run():
MoinDump().run()
def get_attachment(request, pagename, filename, outputdir):
"""Traitement des attachements"""
source_dir = AttachFile.getAttachDir(request, pagename)
source_file = os.path.join(source_dir, filename)
if not os.path.isfile(source_file):
print "%s n'existe pas !" % source_file
return
dest_file = os.path.join(outputdir, "attach",
"%s_%s" % (wikiutil.quoteWikinameFS(pagename), filename))
shutil.copyfile(source_file, dest_file)
return os.path.join("..", "attach",
"%s_%s" % (wikiutil.quoteWikinameFS(pagename), filename))
if __name__ == "__main__":
run()