X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=3b66445ab80b4665304db00481b344b31b4376e1;hb=ec3e42d01c1a77dff06032e35983b0e9933302c8;hp=eef3d6c6736ff76f06e0b44f428f359a7eeab9ac;hpb=8219f46aeb18e422f05e561493f3dad023ce2585;p=geekigeeki.git diff --git a/geekigeeki.py b/geekigeeki.py index eef3d6c..3b66445 100755 --- a/geekigeeki.py +++ b/geekigeeki.py @@ -70,8 +70,10 @@ def relative_url(pathname, privileged=False): pathname = url + '/' + pathname return pathname -# Formatting stuff -------------------------------------------------- +def permalink(s): + return re.sub(' ', '-', re.sub('[^a-z0-9_ ]', '', s.lower()).strip()) +# Formatting stuff -------------------------------------------------- def emit_header(mime_type="text/html"): print "Content-type: " + mime_type + "; charset=utf-8\n" @@ -137,11 +139,10 @@ def send_title(name, text="Limbo", msg_text=None, msg_type='error'): # Navbar print '' -# ---------------------------------------------------------- -# Macros +# Macros ------------------------------------------------------------ def _macro_TitleSearch(*vargs): return _macro_search("titlesearch") @@ -325,8 +325,6 @@ def _macro_TitleIndex(*vargs): s += Page(name).link_to() return s - -# ---------------------------------------------------------- class PageFormatter: """Object that turns Wiki markup into HTML. @@ -336,10 +334,10 @@ class PageFormatter: def __init__(self, raw): self.raw = raw self.h_level = 0 - self.in_pre = self.in_table = False + self.in_pre = self.in_table = self.in_li = False self.in_header = True self.list_indents = [] - self.tr_cnt = self.h_cnt = 0 + self.tr_cnt = 0 self.styles = { #wiki html enabled? "//": ["em", False], @@ -360,13 +358,12 @@ class PageFormatter: def _tit_repl(self, word): if self.h_level: - result = '' % self.h_level + result = '

\n' % self.h_level self.h_level = 0 else: self.h_level = len(word) - 1 - self.h_cnt += 1 - #abridged = re.sub('[^a-z_]', '', word.lower().replace(' ', '_')) - result = '¶ ' % (self.h_level, self.h_cnt, self.h_cnt) + link = permalink(self.line) + result = '\n

¶ ' % (self.h_level, link, link) return result def _br_repl(self, word): @@ -395,7 +392,7 @@ class PageFormatter: macro = globals().get('_macro_' + name) if macro: - return apply(macro, (name, descr)) + return macro(name, descr) elif img_re.match(name): name = relative_url(name) # The "extthumb" nonsense works around a limitation of the HTML block model @@ -418,7 +415,11 @@ class PageFormatter: '>': '>'}[s] def _li_repl(self, match): - return '
  • ' + if self.in_li: + return '
  • ' + else: + self.in_li = True + return '
  • ' def _pre_repl(self, word): if word == '{{{' and not self.in_pre: @@ -461,6 +462,9 @@ class PageFormatter: s = '

    ' while self._indent_level() > new_level: del(self.list_indents[-1]) + if self.in_li: + s += '
  • ' + self.in_li = False # FIXME s += '\n' while self._indent_level() < new_level: self.list_indents.append(new_level) @@ -478,7 +482,7 @@ class PageFormatter: def replace(self, match): for type, hit in match.groupdict().items(): if hit: - return apply(getattr(self, '_' + type + '_repl'), (hit,)) + return getattr(self, '_' + type + '_repl')(hit) else: raise "Can't handle match " + `match` @@ -524,33 +528,32 @@ class PageFormatter: indent_re = re.compile(r"^\s*") tr_re = re.compile(r"^\s*\|\|") eol_re = re.compile(r"\r?\n") - for line in eol_re.split(self.raw.expandtabs()): + for self.line in eol_re.split(self.raw.expandtabs()): # Skip ACLs if self.in_header: - if line.startswith('#'): + if self.line.startswith('#'): continue self.in_header = False if self.in_pre: - print re.sub(pre_re, self.replace, line) + print re.sub(pre_re, self.replace, self.line) else: - if self.in_table and not tr_re.match(line): + if self.in_table and not tr_re.match(self.line): self.in_table = False print '

    ' - if blank_re.match(line): + if blank_re.match(self.line): print '

    ' else: - indent = indent_re.match(line) + indent = indent_re.match(self.line) print self._indent_to(len(indent.group(0))) - print re.sub(scan_re, self.replace, line) + print re.sub(scan_re, self.replace, self.line) if self.in_pre: print '' if self.in_table: print '

    ' print self._undent() print '

    ' -# ---------------------------------------------------------- class Page: def __init__(self, page_name): self.page_name = page_name @@ -615,6 +618,7 @@ class Page: return self.get_attrs().get(name, default) def can(self, action, default=True): + acl = None try: #acl SomeUser:read,write All:read acl = self.get_attr("acl", None) @@ -744,16 +748,11 @@ class Page: try: execfile("geekigeeki.conf.py") form = cgi.FieldStorage() - handlers = { - 'fullsearch': do_fullsearch, - 'titlesearch': do_titlesearch, - 'edit': do_edit, - 'raw': do_raw, - } - - for cmd in handlers.keys(): - if cmd in form: - apply(handlers[cmd], (form[cmd].value,)) + + for cmd in form: + handler = globals().get('handle_' + cmd) + if handler: + handler(form[cmd].value) break else: path_info = environ.get('PATH_INFO', '') @@ -773,6 +772,7 @@ try: else: print "Status: 404 Not Found" send_title(None, msg_text='Can\'t work out query: ' + query) + send_footer(None) except Exception: import traceback msg_text = traceback.format_exc()