X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=eb51489cddb74e6bf2185f6a0e05ac62ebfb6685;hb=ce5a4dbd3de540928b7019a716859a551961105c;hp=71920f370b9dd74f6c0df8b057bf308a404fa9f0;hpb=093f6c0344c19dcdf8d3bb7e437dd9c45a5982f9;p=geekigeeki.git diff --git a/geekigeeki.py b/geekigeeki.py index 71920f3..eb51489 100755 --- a/geekigeeki.py +++ b/geekigeeki.py @@ -83,18 +83,18 @@ def permalink(s): def humanlink(s): return re.sub(r'(?:.*[/:]|)([^:/\.]+)(?:\.[^/:]+|)$', r'\1', s.replace('_', ' ')) -# Split arg lists like "blah| blah blah| width=100 | align = center", +# Split arg lists like "blah|blah blah| width=100 | align = center", # return a list containing anonymous arguments and a map containing the named arguments def parse_args(s): args = [] - kwargs = {} + kvargs = {} for arg in s.strip('<[{}]>').split('|'): m = re.match('\s*(\w+)\s*=\s*(.+)\s*', arg) if m is not None: - kwargs[m.group(1)] = m.group(2) + kvargs[m.group(1)] = m.group(2) else: args.append(arg.strip()) - return (args, kwargs) + return (args, kvargs) def url_args(kvargs): argv = [] @@ -227,7 +227,7 @@ def link_inline(name, descr=None, kvargs={}): elif image_re.match(name): return '%s' % (url, url + url_args(kvargs), descr) elif file_re.match(name) and not ext_re.search(name): # FIXME: this guesses a wiki page - return Page(name).send_naked() + return Page(name).send_naked(kvargs) else: return '' \ % (url, url, name) @@ -337,16 +337,14 @@ def send_footer(mod_string=None): cgi.print_arguments() cgi.print_form(form) cgi.print_environ() - print(''' -') + link_inline("sys/footer", kvargs= { 'LAST_MODIFIED': mod_string }) + print("") + +def _macro_ELAPSED_TIME(*args, **kvargs): + return "%03f" % (clock() - start_time) + +def _macro_VERSION(*args, **kvargs): + return __version__ class WikiFormatter: """Object that turns Wiki markup into HTML. @@ -354,8 +352,9 @@ class WikiFormatter: All formatting commands can be parsed one line at a time, though some state is carried over between lines. """ - def __init__(self, raw): + def __init__(self, raw, kvargs=None): self.raw = raw + self.kvargs = kvargs or {} self.h_level = 0 self.in_pre = self.in_html = self.in_table = self.in_li = False self.in_header = True @@ -367,6 +366,7 @@ class WikiFormatter: "**": ["b", False], "##": ["tt", False], "__": ["u", False], + "--": ["del", False], "^^": ["sup", False], ",,": ["sub", False], "''": ["em", False], # LEGACY @@ -379,6 +379,9 @@ class WikiFormatter: style[1] = not style[1] return ['' + def _glyph_repl(self, word): + return '—' + def _tit_repl(self, word): if self.h_level: result = '

\n' % self.h_level @@ -397,14 +400,16 @@ class WikiFormatter: def _macro_repl(self, word): try: - args, kwargs = parse_args(word) + args, kvargs = parse_args(word) + if args[0] in self.kvargs: + return self.kvargs[args[0]] macro = globals().get('_macro_' + args[0]) if not macro: - exec(open("macros/" + name + ".py").read(), globals()) - macro = globals().get('_macro_' + name) - return macro(*args, **kwargs) - except Exception: - msg = cgi.escape(word) + exec(open("macros/" + args[0] + ".py").read(), globals()) + macro = globals().get('_macro_' + args[0]) + return macro(*args, **kvargs) + except Exception, e: + msg = cgi.escape(word) + ": " + cgi.escape(e.message) if not self.in_html: msg = '' + msg + '' return msg @@ -534,19 +539,20 @@ class WikiFormatter: print('

') scan_re = re.compile(r"""(?: - # Styles and formatting - (?P \*\*|'''|//|''|\#\#|``|__|\^\^|,,) + # Styles and formatting ("--" must cling to a word to disambiguate it from the dash) + (?P \*\* | // | \#\# | __ | --\b | \b-- | \^\^ | ,, | ''' | '' | `` ) | (?P \={2,6}) | (?P
\\\\) | (?P ^-{3,}) | (?P \b( FIXME | TODO | DONE )\b ) + | (?P --) # Links | (?P \<\<([^\s\|\>]+)(?:\s*\|\s*([^\>]+)|)\>\>) | (?P \[\[([^\s\|]+)(?:\s*\|\s*([^\]]+)|)\]\]) # Inline HTML - | (?P <(br|hr|div|span|form|iframe|input|textarea|a|img|h[1-5])\b ) + | (?P <(br|hr|div|span|form|iframe|input|textarea|a|img|h[1-5])\b ) | (?P ( /\s*> | ) ) | (?P [<>&] ) @@ -556,7 +562,7 @@ class WikiFormatter: | (?P (http|https|ftp|mailto)\:[^\s'\"]+\S) | (?P [-\w._+]+\@[\w.-]+) - # Lists, divs, spans + # Lists, divs, spans and inline objects | (?P

  • ^\s+[\*\#]\s+) | (?P
       \{\{\{|\s*\}\}\})
                 | (?P   \{\{([^\s\|]+)(?:\s*\|\s*([^\]]+)|)\}\})
    @@ -645,7 +651,7 @@ class Page:
         def format_dir(self):
             out = '== '
             pathname = ''
    -        for dirname in self.page_name.split('/'):
    +        for dirname in self.page_name.strip('/').split('/'):
                 pathname = (pathname + '/' + dirname) if pathname else dirname
                 out += '[[' + pathname + '|' + dirname + ']]/'
             out += ' ==\n'
    @@ -700,9 +706,9 @@ class Page:
         def can_read(self):
             return self.can("read", True)
     
    -    def send_naked(self):
    +    def send_naked(self, kvargs=None):
             if self.can_read():
    -            WikiFormatter(self.get_raw_body()).print_html()
    +            WikiFormatter(self.get_raw_body(), kvargs).print_html()
             else:
                 send_guru("Read access denied by ACLs", "notice")
     
    @@ -795,6 +801,9 @@ class Page:
                     os.remove(name)
                 except OSError, err:
                     if err.errno != errno.ENOENT: raise err
    +        path = os.path.split(name)[0]
    +        if not os.path.exists(path):
    +            os.makedirs(path)
             os.rename(tmp_filename, name)
     
         def save(self, newdata, changelog):