Consolidate legacy syntax rules
[geekigeeki.git] / geekigeeki.py
index 774225ba4ae53f125fb5ff0bc39f9a36766eba97..651d98db20e984506af833ebf7c810e20a8ae635 100755 (executable)
@@ -30,7 +30,7 @@ import cgi, sys, os, re, errno, stat
 word_re = re.compile(r"^\b((([A-Z][a-z0-9]+){2,}/)*([A-Z][a-z0-9]+){2,})\b$")
 # FIXME: we accept stuff like foo/../bar and we shouldn't
 file_re = re.compile(r"^\b([A-Za-z0-9_\-][A-Za-z0-9_\.\-/]*)\b$")
-img_re = re.compile(r"^.*\.(png|gif|jpg|jpeg|bmp|ico)$", re.IGNORECASE)
+img_re = re.compile(r"^.*\.(png|gif|jpg|jpeg|bmp|ico|ogm|ogg|mkv|mpg|mpeg|mp4|avi|asf|flv|wmv|qt)$", re.IGNORECASE)
 video_re = re.compile(r"^.*\.(ogm|ogg|mkv|mpg|mpeg|mp4|avi|asf|flv|wmv|qt)$", re.IGNORECASE)
 url_re = re.compile(r"^[a-z]{3,8}://[^\s'\"]+\S$")
 link_re = re.compile("(?:\[\[|{{)([^\s\|]+)(?:\s*\|\s*([^\]]+)|)(?:\]\]|}})")
@@ -81,6 +81,13 @@ def permalink(s):
 def emit_header(mime_type="text/html"):
     print "Content-type: " + mime_type + "; charset=utf-8\n"
 
+def sendfile(dest_file, src_file):
+    """Efficiently copy file data between file descriptors"""
+    while 1:
+        data = src_file.read(65536)
+        if not data: break
+        dest_file.write(data)
+
 def send_guru(msg_text, msg_type):
     if not msg_text: return
     print '<pre id="guru" onclick="this.style.display = \'none\'" class="' + msg_type + '">'
@@ -90,28 +97,10 @@ def send_guru(msg_text, msg_type):
     if msg_type == 'error':
         print '\n      Guru Meditation #DEADBEEF.ABADC0DE'
     print '</pre>'
-    # FIXME: This little JS snippet is harder to pass than ACID 3.0 
-    print """
-    <script language="JavaScript" type="text/javascript">
-        var guru = document.getElementById('guru');
-        // Firefox 2.0 doesn't take border-color, but returns border-top-color fine
-        var color = document.defaultView.getComputedStyle(guru,null).getPropertyValue('border-top-color');
-
-        function guruOn() {
-            guru.style.setProperty('border-color', color, '');
-            setTimeout('guruOff()', 1000);
-        }
-        function guruOff() {
-            guru.style.setProperty('border-color', '#000000', '');
-            setTimeout('guruOn()', 1000);
-        }
-        // Safari 2.0 returns this rgba crap
-        // Konqueror 3.5.6 doesn't seem to support computed properties
-        if (color && color != 'rgba(0, 0, 0, 0)') {
-            //window.alert("enabled! color='" + color + "'");
-            guruOn();
-        }
-    </script>"""
+    try:
+        sendfile(sys.stdout, open('gurumeditation.js', 'rb'))
+    except IOError, err:
+        pass
 
 def send_title(name, text="Limbo", msg_text=None, msg_type='error', writable=False):
     global title_done
@@ -193,6 +182,8 @@ def send_httperror(status="403 Not Found", query=""):
 def link_tag(params, text=None, link_class=None, privileged=False):
     if text is None:
         text = params # default
+    elif img_re.match(text):
+        text = '<img border="0" src="' + text + '" />'
 
     if not link_class:
         if is_external_url(params):
@@ -356,19 +347,6 @@ class WikiFormatter:
     def _rule_repl(self, word):
         return self._undent() + '\n<hr size="%d" noshade="noshade" />\n' % (len(word) - 2)
 
-    def _word_repl(self, word):
-        return link_tag(word)
-
-    def _img_repl(self, word):
-        pathname = relative_url(word)
-        return '<a href="%s"><img border="0" src="%s" /></a>' % (pathname, pathname)
-
-    def _url_repl(self, word):
-        if img_re.match(word):
-            return '<a href="%s"><img border="0" src="%s" /></a>' % (word, word)
-        else:
-            return '<a href="%s" rel="nofollow" class="external">%s</a>' % (word, word)
-
     def _macro_repl(self, word):
         m = re.compile("\<\<([^\s\|\>]+)(?:\s*\|\s*([^\>]+)|)\>\>").match(word)
         name = m.group(1)
@@ -391,14 +369,13 @@ class WikiFormatter:
 
     def _hurl_repl(self, word):
         m = link_re.match(word)
-        name = m.group(1)
-        descr = m.group(2)
-        if descr is None:
-            descr = name
-        elif img_re.match(m.group(2)):
-            descr = '<img border="0" src="' + descr + '" />'
+        return link_tag(m.group(1), m.group(2))
 
-        return link_tag(name, descr)
+    def _url_repl(self, word):
+        return link_tag(word)
+
+    def _word_repl(self, word):
+        return link_tag(word)
 
     def _inl_repl(self, word):
         m = link_re.match(word)
@@ -420,6 +397,9 @@ class WikiFormatter:
         else:
             return '<a href="%s"><img border="0" src="%s" /></a>' % (name, name)
 
+    def _img_repl(self, word):
+        return self._inl_repl('{{' + word + '}}')
+
     def _email_repl(self, word):
         return '<a href="mailto:%s">%s</a>' % (word, word)
 
@@ -531,7 +511,7 @@ class WikiFormatter:
             + r"|(?P<ent>[<>&])"
 
             # Auto links (LEGACY)
-            + r"|(?P<img>\b[a-zA-Z0-9_/-]+\.(png|gif|jpg|jpeg|bmp|ico))"
+            + r"|(?P<img>\b[a-zA-Z0-9_/-]+\.(png|gif|jpg|jpeg|bmp|ico|ogm|ogg|mkv|mpg|mpeg|mp4|avi|asf|flv|wmv|qt))"
             + r"|(?P<word>\b(?:[A-Z][a-z]+){2,}\b)"
             + r"|(?P<url>(http|https|ftp|mailto)\:[^\s'\"]+\S)"
             + r"|(?P<email>[-\w._+]+\@[\w.-]+)"