Support subdirectories (FooBar/FortyTwo)
authorBernardo Innocenti <bernie@codewiz.org>
Sat, 5 Jan 2008 20:22:11 +0000 (21:22 +0100)
committerBernardo Innocenti <bernie@codewiz.org>
Sat, 5 Jan 2008 20:22:11 +0000 (21:22 +0100)
geekigeeki.py

index cd92c54edffbd737d1d6affdbe7e94f83faf3a2b..9c9efc16a65e61ce1dc9199df4cec036a141ae7e 100755 (executable)
@@ -3,7 +3,7 @@
 #
 # Copyright 1999, 2000 Martin Pool <mbp@humbug.org.au>
 # Copyright 2002 Gerardo Poggiali
-# Copyright 2007 Bernardo Innocenti <bernie@codewiz.org>
+# Copyright 2007, 2008 Bernardo Innocenti <bernie@codewiz.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,8 +28,8 @@ from os import path, environ
 
 # Regular expression defining a WikiWord
 # (but this definition is also assumed in other places)
-file_re = re.compile(r"^\b([A-Za-z0-9_\.\-]+)\b$")
-word_re = re.compile(r"^\b([A-Z][a-z]+){2,}\b$")
+file_re = re.compile(r"^\b([A-Za-z0-9_\.\-/]+)\b$")
+word_re = re.compile(r"^\b((([A-Z][a-z]+){2,}/)*([A-Z][a-z]+){2,})\b$")
 img_re = re.compile(r"^.*\.(png|gif|jpg|jpeg)$", re.IGNORECASE)
 url_re = re.compile(r"^[a-z]{3,8}://[^\s'\"]+\S$")
 
@@ -60,6 +60,15 @@ def get_hostname(addr):
     except:
         return addr
 
+def relative_url(path, privileged=False):
+    if not (url_re.match(path) or path.startswith('/')):
+        if privileged:
+            url = privileged_path()
+        else:
+            url = script_name()
+        path = url + '/' + path
+    return path
+
 # Formatting stuff --------------------------------------------------
 
 def emit_header(type="text/html"):
@@ -114,7 +123,7 @@ def send_title(name, text="Limbo", msg=None, msg_type='error'):
     if not name:
         print ' <meta name="robots" content="noindex,nofollow" />'
     for css in css_url:
-        print ' <link rel="stylesheet" type="text/css" href="%s" />' % css
+        print ' <link rel="stylesheet" type="text/css" href="%s" />' % relative_url(css)
     print '</head>'
 
     # Body
@@ -143,7 +152,7 @@ def send_title(name, text="Limbo", msg=None, msg_type='error'):
     if name:
         print ' | ' + link_tag('?raw=' + name, 'Raw Text', 'navlink')
         if privileged_url is not None:
-            print ' | ' + link_tag('?edit=' + name, 'Edit Page', 'navlink', authentication=True)
+            print ' | ' + link_tag('?edit=' + name, 'Edit Page', 'navlink', privileged=True)
     else:
         print ' | <i>Immutable Page</i>'
 
@@ -153,7 +162,7 @@ def send_title(name, text="Limbo", msg=None, msg_type='error'):
 
     print '<hr /></div>'
 
-def link_tag(params, text=None, ss_class=None, authentication=False):
+def link_tag(params, text=None, ss_class=None, privileged=False):
     if text is None:
         text = params # default
     classattr = ''
@@ -162,11 +171,7 @@ def link_tag(params, text=None, ss_class=None, authentication=False):
         # Prevent crawlers from following links potentially added by spammers or to generated pages
         if ss_class == 'external' or ss_class == 'navlink':
             classattr += 'rel="nofollow" '
-    if authentication:
-        path = privileged_path()
-    else:
-        path = script_name()
-    return '<a %shref="%s/%s">%s</a>' % (classattr, path, params, text)
+    return '<a %shref="%s">%s</a>' % (classattr, relative_url(params, privileged=privileged), text)
 
 # Search ---------------------------------------------------
 
@@ -379,7 +384,7 @@ class PageFormatter:
         return Page(word).link_to()
 
     def _img_repl(self, word):
-        path = script_name() + '/' + word;
+        path = relative_url(word)
         return '<a href="%s"><img border="0" src="%s" /></a>' % (path, path)
 
     def _url_repl(self, word):
@@ -397,7 +402,8 @@ class PageFormatter:
         if macro:
             return apply(macro, (name, descr))
         elif img_re.match(name):
-            return '<div class="thumb"><a href="%s"><img border="0" src="%s" alt="%s" /></a><div class="caption">%s</div></div>' % (name, name, descr, descr)
+            # The "extthumb" nonsense works around a limitation of the HTML block model
+            return '<div class="extthumb"><div class="thumb"><a href="%s"><img border="0" src="%s" alt="%s" /></a><div class="caption">%s</div></div></div>' % (name, name, descr, descr)
         else:
             if img_re.match(descr):
                 descr = '<img border="0" src="' + descr + '" />'
@@ -685,7 +691,7 @@ class Page:
             + ' for ' + cgi.escape(remote_user())
             + ' from ' + cgi.escape(get_hostname(remote_host()))
             + '</b></p>')
-        print '<div class="editor"><form method="post" action="%s/%s">' % (script_name(), self.page_name)
+        print '<div class="editor"><form method="post" action="%s">' % relative_url(self.page_name)
         print '<input type="hidden" name="savepage" value="%s">' % (self.page_name)
         print """<textarea wrap="off" spellcheck="true" id="editor" name="savetext" rows="17" cols="100">%s</textarea>""" % (preview or self.get_raw_body())
         print """