Make macros non executable
[geekigeeki.git] / geekigeeki.py
index b8aeee89402cddc8bfe65b947e63c12d550cad27..678754e3a9633d29fc779eeed48eeddb8fa9fa87 100755 (executable)
@@ -79,7 +79,7 @@ def permalink(s):
     return re.sub(' ', '-', re.sub('[^a-z0-9_ ]', '', s.lower()).strip())
 
 def humanlink(s):
-    return re.search('([^:/\.]+)(?:\.[^/:]+|)$', s).group(1).replace('_', ' ')
+    return re.sub(r'([^:/\.]+)(?:\.[^/:]+|)$', r'\1', s.replace('_', ' '))
 
 # Split arg lists like "blah| blah blah| width=100 | align = center",
 # return a list containing anonymous arguments and a map containing the named arguments
@@ -87,10 +87,10 @@ def parse_args(s):
     args = []
     kwargs = {} 
     for arg in s.strip('<[{}]>').split('|'):
-        try:
-            key, val = arg.split('=', 1)
-            kwargs[key.strip()] = val.strip()
-        except ValueError:
+        m = re.match('\s*(\w+)\s*=\s*(.+)\s*', arg)
+        if m is not None:
+            kwargs[m.group(1)] = m.group(2)
+        else:
             args.append(arg.strip())
     return (args, kwargs)
 
@@ -161,24 +161,24 @@ def send_title(name, text="Limbo", msg_text=None, msg_type='error', writable=Fal
 
     # Navbar
     print('<div class="nav">')
-    print link_tag('FrontPage', site_icon or 'Home', 'navlink')
+    print link_tag('FrontPage', site_icon or 'Home', cssclass='navlink')
     if name:
-        print('  <b>' + link_tag('?fullsearch=' + name, text, 'navlink') + '</b> ')
+        print('  <b>' + link_tag('?fullsearch=' + name, text, cssclass='navlink') + '</b> ')
     else:
         print('  <b>' + text + '</b> ')
-    print(' | ' + link_tag('FindPage', 'Find Page', 'navlink'))
+    print(' | ' + link_tag('FindPage', 'Find Page', cssclass='navlink'))
     if 'history_url' in globals():
         print(' | <a href="' + relative_url(history_url) + '" class="navlink">Recent Changes</a>')
         if name:
             print(' | <a href="' + relative_url(history_url + '?a=history;f=' + name) + '" class="navlink">Page History</a>')
 
     if name:
-        print(' | ' + link_tag('?raw=' + name, 'Raw Text', 'navlink'))
+        print(' | ' + link_tag(name + '?a=raw', 'Raw Text', cssclass='navlink'))
         if privileged_url is not None:
             if writable:
-                print(' | ' + link_tag('?a=edit&q=' + name, 'Edit', 'navlink', privileged=True))
+                print(' | ' + link_tag('?a=edit&q=' + name, 'Edit', cssclass='navlink', privileged=True))
             else:
-                print(' | ' + link_tag(name, 'Login', 'navlink', privileged=True))
+                print(' | ' + link_tag(name, 'Login', cssclass='navlink', privileged=True))
 
     else:
         print(' | <i>Immutable Page</i>')
@@ -194,33 +194,34 @@ def send_httperror(status="403 Not Found", query=""):
     send_title(None, msg_text=("%s: on query '%s'" % (status, query)))
     send_footer()
 
-def link_tag(params, text=None, link_class=None, privileged=False, **kvargs):
+def link_tag(dest, text=None, privileged=False, **kvargs):
     if text is None:
-        text = humanlink(params)
+        text = humanlink(dest)
     elif img_re.match(text):
         text = '<img border="0" src="' + relative_url(text) + '" alt="' + text + '" />'
 
+    link_class = kvargs.get('class', kvargs.get('cssclass', None))
     if not link_class:
-        if is_external_url(params):
+        if is_external_url(dest):
             link_class = 'external'
-        elif file_re.match(params) and Page(params).exists():
+        elif file_re.match(dest) and Page(dest).exists():
             link_class = 'wikilink'
         else:
-            params = nonexist_pfx + params
+            text = nonexist_pfx + text
             link_class = 'nonexistent'
 
-    classattr = 'class="%s" ' % link_class
     # Prevent crawlers from following links potentially added by spammers or to generated pages
+    nofollow = ''
     if link_class == 'external' or link_class == 'navlink':
-        classattr += 'rel="nofollow"'
+        nofollow = 'rel="nofollow" '
 
-    return '<a %shref="%s">%s</a>' % (classattr, relative_url(params, privileged=privileged), text)
+    return '<a class="%s" %shref="%s">%s</a>' % (link_class, nofollow, relative_url(dest, privileged=privileged), text)
 
 def link_inline(name, descr=None, kvargs={}):
     if not descr: descr = humanlink(name)
     url = relative_url(name)
     if video_re.match(name):
-        return '<video src="%s">Your browser does not support the HTML5 video tag</video>' % url
+        return '<video controls="1" src="%s">Your browser does not support the HTML5 video tag</video>' % url
     elif img_re.match(name):
         return '<a href="%s"><img border="0" src="%s" alt="%s" /></a>' % (url, url + url_args(kvargs), descr)
     elif file_re.match(name) and not ext_re.search(name): # FIXME: this guesses a wiki page