X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=788006001301cb9071f6322abb8807787de3f8f2;hb=bcff3d51e279853e511d71bc2459cfae50f34615;hp=b3eed3c52d509732419e6ed9546be3aebe3353b6;hpb=465199e5822dfa85ca4fddb8bf0ae79641e0aa4e;p=geekigeeki.git
diff --git a/geekigeeki.py b/geekigeeki.py
index b3eed3c..7880060 100755
--- a/geekigeeki.py
+++ b/geekigeeki.py
@@ -3,7 +3,7 @@
#
# Copyright (C) 1999, 2000 Martin Pool
# Copyright (C) 2002 Gerardo Poggiali
-# Copyright (C) 2007, 2008, 2009 Bernie Innocenti
+# Copyright (C) 2007, 2008, 2009, 2010 Bernie Innocenti
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -29,7 +29,6 @@ file_re = re.compile(r"([A-Za-z0-9_\-][A-Za-z0-9_\.\-/ ]*)$")
url_re = re.compile(r"[a-z]{3,8}://[^\s'\"]+\S$")
ext_re = re.compile(r"\.([^\./]+)$")
-# CGI stuff ---------------------------------------------------------
def config_get(key, default=None):
return globals().get(key, default)
@@ -106,11 +105,14 @@ def url_args(kvargs):
return '?' + '&'.join(argv)
return ''
-# Formatting stuff --------------------------------------------------
def emit_header(mtime=None, mime_type="text/html"):
if mtime:
+ # Prevent caching when the wiki engine gets updated
+ mtime = max(mtime, os.stat(__file__).st_mtime)
print("Last-Modified: " + strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime(mtime)))
- print("Content-type: " + mime_type + "; charset=utf-8\n")
+ if mime_type:
+ print("Content-type: " + mime_type + "; charset=utf-8")
+ print('')
def send_guru(msg_text, msg_type):
if not msg_text: return
@@ -123,10 +125,14 @@ def send_guru(msg_text, msg_type):
print('' \
% relative_url('sys/GuruMeditation.js'))
-def send_httperror(status="403 Not Found", query=""):
+def send_httperror(status="403 Not Found", query="", trace=False):
print("Status: %s" % status)
+ msg_text = "%s: on query '%s'" % (status, query)
+ if trace:
+ import traceback
+ msg_text += '\n\n' + traceback.format_exc()
page = Page()
- page.send_title(msg_text=("%s: on query '%s'" % (status, query)))
+ page.send_title(msg_text=msg_text)
page.send_footer()
def link_tag(dest, text=None, privileged=False, **kvargs):
@@ -169,16 +175,14 @@ def link_inline(name, descr=None, kvargs={}):
def link_inline_glob(pattern, descr=None, kvargs={}):
if not url_re.match(pattern) and bool(set(pattern) & set('?*[')):
s = ''
- for name in glob.glob(pattern):
+ for name in sorted(glob.glob(pattern), reverse=bool(int(kvargs.get('reverse', '0'))) ):
s += link_inline(name, descr, kvargs)
return s
else:
return link_inline(pattern, descr, kvargs)
-# Search ---------------------------------------------------
-
def search_stats(hits, searched):
- return("%d hits out of %d pages searched.\n" % (hits, searched))
+ return "%d hits out of %d pages searched.\n" % (hits, searched)
def handle_fullsearch(query, form):
needle = form['q'].value
@@ -220,28 +224,23 @@ def handle_titlesearch(query, form):
WikiFormatter(out).print_html()
def handle_raw(pagename, form):
- if not file_re.match(pagename):
- send_httperror("403 Forbidden", pagename)
- return
-
Page(pagename).send_raw()
-def handle_edit(pagename, form):
- if not file_re.match(pagename):
- send_httperror("403 Forbidden", pagename)
- return
+def handle_atom(pagename, form):
+ Page(pagename).send_atom()
+def handle_edit(pagename, form):
pg = Page(form['q'].value)
if 'save' in form:
if form['file'].value:
pg.save(form['file'].file.read(), form['changelog'].value)
else:
pg.save(form['savetext'].value.replace('\r\n', '\n'), form['changelog'].value)
- pg.format()
+ pg.send()
elif 'cancel' in form:
pg.msg_text = 'Editing canceled'
pg.msg_type = 'notice'
- pg.format()
+ pg.send()
else: # preview or edit
text = None
if 'preview' in form:
@@ -249,16 +248,13 @@ def handle_edit(pagename, form):
pg.send_editor(text)
def handle_get(pagename, form):
- if file_re.match(pagename):
- # FIMXE: this is all bullshit, MimeTypes bases its guess on the extension!
- from mimetypes import MimeTypes
- mimetype, encoding = MimeTypes().guess_type(pagename)
- if mimetype:
- Page(pagename).send_raw(mimetype=mimetype, args=form)
- else:
- Page(pagename).format()
- else:
- send_httperror("403 Forbidden", pagename)
+ if not ext_re.search(pagename): # FIXME: no extension guesses a wiki page
+ Page(pagename).send()
+ else:
+ # FIMXE: this is all bullshit, MimeTypes bases its guess on the extension!
+ from mimetypes import MimeTypes
+ mimetype, encoding = MimeTypes().guess_type(pagename)
+ Page(pagename).send_raw(mimetype=mimetype, args=form)
# Used by sys/macros/WordIndex and sys/macros/TitleIndex
def make_index_key():
@@ -326,14 +322,19 @@ class WikiFormatter:
def _macro_repl(self, word):
try:
- args, kvargs = parse_args(word)
+ args, macro_kvargs = parse_args(word)
+ # Is this a parameter given to the current page?
if args[0] in self.kvargs:
return self.kvargs[args[0]]
+ # Is this an internal macro?
macro = globals().get('_macro_' + args[0])
if not macro:
+ # Can we load (and cache) an external macro?
exec(open("sys/macros/" + args[0] + ".py").read(), globals())
macro = globals().get('_macro_' + args[0])
- return macro(*args, **kvargs)
+ # Invoke macro passing both macro args augmented by page args
+ macro_kvargs.update(self.kvargs)
+ return macro(*args, **macro_kvargs)
except Exception, e:
msg = cgi.escape(word) + ": " + cgi.escape(str(e))
if not self.in_html:
@@ -532,11 +533,18 @@ class WikiFormatter:
print(self._indent_to(0))
print('
')
+class HttpException(Exception):
+ def __init__(self, error, query):
+ self.error = error
+ self.query = query
+
class Page:
def __init__(self, page_name="Limbo"):
self.page_name = page_name.rstrip('/');
self.msg_text = ''
self.msg_type = 'error'
+ if not file_re.match(self.page_name):
+ raise HttpException("403 Forbidden", self.page_name)
def split_title(self):
# look for the end of words and the start of a new word and insert a space there
@@ -697,16 +705,12 @@ class Page:
else:
print(' | ' + link_tag(name, 'Login', cssclass='navlink', privileged=True))
- else:
- print(' | Immutable Page')
-
user = remote_user()
if user != 'AnonymousCoward':
print(' | ' + link_tag('User/' + user, user) + '')
print('
')
-
def send_footer(self):
if config_get('debug_cgi', False):
cgi.print_arguments()
@@ -715,7 +719,7 @@ class Page:
footer = self.pragma("footer", "sys/footer")
if footer != "off":
link_inline(footer, kvargs = {
- 'LAST_MODIFIED': strftime(config_get('datetime_fmt', '%a %d %b %Y %I:%M %p'), localtime(self._mtime()))
+ 'LAST_MODIFIED': strftime(config_get('datetime_fmt', '%Y-%m-%dT%I:%M:%S%p'), localtime(self._mtime()))
})
print("