X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=f6ba26c967419f5c219d98d313bdc19932630883;hb=4e1ebf231d757ce8887705fe2a271c68a2eed1e4;hp=f3ce1dcb3268d452e29c997c5a698040a15b58cf;hpb=b36435d29f2dcaf6d3a2d19d21ca8b3c2c62c44d;p=geekigeeki.git
diff --git a/geekigeeki.py b/geekigeeki.py
index f3ce1dc..f6ba26c 100755
--- a/geekigeeki.py
+++ b/geekigeeki.py
@@ -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
@@ -77,7 +78,7 @@ def relative_url(pathname, privileged=False):
else:
url = script_name()
pathname = url + '/' + pathname
- return pathname
+ return cgi.escape(pathname, quote=True)
def permalink(s):
return re.sub(' ', '-', re.sub('[^a-z0-9_ ]', '', s.lower()).strip())
@@ -86,13 +87,6 @@ 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 '
'
- print link_tag('FrontPage', relative_url(site_icon or 'Home'), 'navlink')
+ print link_tag('FrontPage', site_icon or 'Home', 'navlink')
if name:
print '
' + link_tag('?fullsearch=' + name, text, 'navlink') + ' '
else:
@@ -188,7 +180,7 @@ def link_tag(params, text=None, link_class=None, privileged=False):
if text is None:
text = params # default
elif img_re.match(text):
- text = '
'
+ text = '
'
if not link_class:
if is_external_url(params):
@@ -208,10 +200,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 '
' % name
+ return '
' % url
+ elif img_re.match(name):
+ return '
' % (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 '
' % (name, name + args, descr)
+ return '
' \
+ % (url, url, name)
# Search ---------------------------------------------------
@@ -289,9 +287,10 @@ def handle_edit(pagename):
text = form['savetext'].value
pg.send_editor(text)
+# Used by macros/WordIndex and macros/TitleIndex
def make_index_key():
links = map(lambda ch: '
%s' % (ch, ch), 'abcdefghijklmnopqrstuvwxyz')
- return '
'+ ' | '.join(links) + ''
+ return '
'+ ' | '.join(links) + '
'
def page_list(dirname = None, re = word_re):
return sorted(filter(re.match, os.listdir(dirname or data_dir)))
@@ -387,9 +386,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('|')
@@ -406,11 +403,13 @@ class WikiFormatter:
return link_inline(name, name)
def _html_repl(self, word):
+ if not self.in_html and word.startswith('
'
return word; # Pass through
def _ent_repl(self, s):
@@ -606,12 +605,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 +720,8 @@ class Page:
print '
"
send_footer()
- def send_raw(self, mimetype='text/plain'):
- if self.can_read():
- body = self.get_raw_body()
- emit_header(mimetype)
- print body
- else:
+ def send_raw(self, mimetype='text/plain', args=[]):
+ if not self.can_read():
send_title(None, msg_text='Read access denied by ACLs', msg_type='notice')
+ return
- def send_image(self, mimetype, args=[]):
if 'maxwidth' in args:
import subprocess
emit_header(mimetype)
@@ -758,7 +756,9 @@ class Page:
subprocess.check_call(['gm', 'convert', self._filename(),
'-scale', args['maxwidth'].value + ' >', '-'])
else:
- self.send_raw(mimetype)
+ body = self.get_raw_body()
+ emit_header(mimetype)
+ print body
def _write_file(self, data):
tmp_filename = self._tmp_filename()
@@ -781,19 +781,13 @@ class Page:
self._write_file(newdata)
rc = 0
if post_edit_hook:
- # FIXME: what's the std way to perform shell quoting in python?
- cmd = ( post_edit_hook
- + " '" + data_dir + '/' + self.page_name
- + "' '" + remote_user()
- + "' '" + remote_host()
- + "' '" + changelog + "'"
- )
- out = os.popen(cmd)
- output = out.read()
- rc = out.close()
+ import subprocess
+ cmd = [ post_edit_hook, data_dir + '/' + self.page_name, remote_user(), remote_host(), changelog]
+ child = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True)
+ output = child.stdout.read()
+ rc = child.wait()
if rc:
- self.msg_text += "Post-editing hook returned %d.\n" % rc
- self.msg_text += 'Command was: ' + cmd + '\n'
+ self.msg_text += "Post-editing hook returned %d. Command was:\n'%s'\n" % (rc, "' '".join(cmd))
if output:
self.msg_text += 'Output follows:\n' + output
else:
@@ -809,18 +803,13 @@ def main():
else:
query = query_string()
if file_re.match(query):
- if word_re.match(query):
- Page(query).format()
+ # FIMXE: this is all bullshit, MimeTypes bases its guess on the extension!
+ from mimetypes import MimeTypes
+ mimetype, encoding = MimeTypes().guess_type(query)
+ if mimetype:
+ Page(query).send_raw(mimetype=mimetype, args=form)
else:
- from mimetypes import MimeTypes
- mimetype, encoding = MimeTypes().guess_type(query)
- if mimetype:
- if mimetype.startswith('image/'):
- Page(query).send_image(mimetype=mimetype, args=form)
- else:
- Page(query).send_raw(mimetype=mimetype)
- else:
- Page(query).format()
+ Page(query).format()
else:
send_httperror("403 Forbidden", query)