Add support for including wiki pages inline through {{...}}
authorBernie Innocenti <bernie@codewiz.org>
Wed, 8 Apr 2009 22:56:25 +0000 (00:56 +0200)
committerBernie Innocenti <bernie@codewiz.org>
Wed, 8 Apr 2009 22:56:25 +0000 (00:56 +0200)
geekigeeki.py

index 4fb96cb8daff079dc820e7a9f7daf75f5bad8a7e..5bae68b43b78e972a0b1e987ee29a214130df87a 100755 (executable)
@@ -33,7 +33,8 @@ 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|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*([^\]]+)|)(?:\]\]|}})")
+link_re = re.compile(r"(?:\[\[|{{)([^\s\|]+)(?:\s*\|\s*([^\]]+)|)(?:\]\]|}})")
+ext_re = re.compile(r"\.([^\./]+)$")
 
 title_done = False
 
@@ -208,10 +209,16 @@ def link_tag(params, text=None, link_class=None, privileged=False):
 
 def link_inline(name, descr=None, args=''):
     if not descr: descr = name
+    url = relative_url(name)
     if video_re.match(name):
-        return '<video src="%s">Your browser does not support the HTML5 video tag</video>' % name
+        return '<video 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 + args, descr)
+    elif file_re.match(name) and not ext_re.search(name): # FIXME: this guesses a wiki page
+        return Page(name).send_naked()
     else:
-        return '<a href="%s"><img border="0" src="%s" alt="%s" /></a>' % (name, name + args, descr)
+        return '<iframe width="100%%" scrolling="auto" frameborder="0" src="%s"><a href="%s">%s</a></iframe>' \
+            % (url, url, name)
 
 # Search ---------------------------------------------------
 
@@ -387,9 +394,7 @@ class WikiFormatter:
         return link_tag(m.group(1), m.group(2))
 
     def _inl_repl(self, word):
-        m = link_re.match(word)
-        name = relative_url(m.group(1))
-        descr = m.group(2)
+        (name, descr) = link_re.match(word).groups()
 
         if descr:
             argv = descr.split('|')
@@ -606,12 +611,14 @@ class Page:
                 return False
             raise err
 
-    def get_raw_body(self):
+    def get_raw_body(self, default=None):
         try:
             return open(self._filename(), 'rb').read()
         except IOError, err:
             if err.errno == errno.ENOENT:
-                return '' # just doesn't exist, use default
+                if default is None:
+                    default = '//[[?edit=%s|Describe %s]]//' % (self.page_name, self.page_name)
+                return default
             if err.errno == errno.EISDIR:
                 return self.format_dir()
             raise err
@@ -719,7 +726,8 @@ class Page:
         print '<div class="editor"><form name="editform" method="post" enctype="multipart/form-data" action="%s">' % relative_url(self.page_name)
         print '<input type="hidden" name="edit" value="%s">' % (self.page_name)
         print '<input type="input" id="editor" name="changelog" value="Edit page %s" accesskey="c" /><br />' % (self.page_name)
-        print '<textarea wrap="off" spellcheck="true" id="editor" name="savetext" rows="17" cols="100" accesskey="e">%s</textarea>' % cgi.escape(preview or self.get_raw_body())
+        print '<textarea wrap="off" spellcheck="true" id="editor" name="savetext" rows="17" cols="100" accesskey="e">%s</textarea>' \
+            % cgi.escape(preview or self.get_raw_body(default=''))
         print '<label for="file" accesskey="u">Or Upload a file:</label> <input type="file" name="file" value="%s" />' % filename
         print """
             <br />