X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=84f1db5f3a0305e5f9ef8a39ca101335b75356f6;hb=cb4160fc9e77f9fe29bca28ed504ca38dac94089;hp=ad4fc5dd0683fd99b62fd6a5df85903cb4fa1da9;hpb=9ba86215f478f6ec624522d42e9aeb9f1eb9eb30;p=geekigeeki.git
diff --git a/geekigeeki.py b/geekigeeki.py
index ad4fc5d..84f1db5 100755
--- a/geekigeeki.py
+++ b/geekigeeki.py
@@ -1,8 +1,9 @@
-#! /usr/bin/env python
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
#
# Copyright 1999, 2000 Martin Pool ' + Page(page_name).link_to()
print ' . . . . ' + `count`
- print ['match', 'matches'][count <> 1]
+ print ['match', 'matches'][count != 1]
print ' %d hits out of %d pages searched.%s
' % (letter, letter)
last_letter = letter
@@ -312,7 +324,7 @@ def _macro_TitleIndex(*vargs):
current_letter = None
for name in pages:
letter = string.lower(name[0])
- if letter <> current_letter:
+ if letter != current_letter:
s = s + '%s
' % (letter, letter)
current_letter = letter
else:
@@ -330,23 +342,28 @@ class PageFormatter:
"""
def __init__(self, raw):
self.raw = raw
- self.is_em = self.is_b = 0
self.h_level = 0
- self.h_count = 0
- self.list_indents = []
- self.in_pre = False
- self.in_table = False
- self.tr_cnt = 0
- self.in_var = False
+ self.in_pre = self.in_table = False
self.in_header = True
+ self.list_indents = []
+ self.tr_cnt = self.h_cnt = 0
+ self.styles = {
+ #wiki html enabled?
+ "//": ["em", False],
+ "''": ["em", False],
+ "**": ["b", False],
+ "'''": ["b", False],
+ "##": ["tt", False],
+ "``": ["tt", False],
+ "__": ["u", False],
+ "^^": ["sup", False],
+ ",,": ["sub", False]
+ }
- def _emph_repl(self, word):
- if len(word) == 3:
- self.is_b = not self.is_b
- return ['', ''][self.is_b]
- else:
- self.is_em = not self.is_em
- return ['', ''][self.is_em]
+ def _b_repl(self, word):
+ style = self.styles[word]
+ style[1] = not style[1]
+ return ['','<'][style[1]] + style[0] + '>'
def _tit_repl(self, word):
if self.h_level:
@@ -354,10 +371,14 @@ class PageFormatter:
self.h_level = 0
else:
self.h_level = len(word) - 1
- self.h_count += 1
- result = '
'
+
def _rule_repl(self, word):
return self._undent() + '\n
\n' % (len(word) - 2)
@@ -365,7 +386,7 @@ class PageFormatter:
return Page(word).link_to()
def _img_repl(self, word):
- path = script_name() + '/' + word;
+ path = relative_url(word)
return '' % (path, path)
def _url_repl(self, word):
@@ -375,21 +396,22 @@ class PageFormatter:
return '%s' % (word, word)
def _hurl_repl(self, word):
- m = re.compile("\[\[(\S+)([^\]]*)\]\]").match(word)
+ m = re.compile("\[\[([^ \t\n\r\f\v\|]+)(?:\s*\|\s*([^\]]+)|)\]\]").match(word)
name = m.group(1)
- descr = m.group(2).strip() or name
+ descr = m.group(2) or name
macro = globals().get('_macro_' + name)
if macro:
return apply(macro, (name, descr))
elif img_re.match(name):
- return '
' % (name, name, descr)
- elif url_re.match(name):
- return '%s' % (name, descr)
- elif name.startswith('/'):
- return '%s' % (name, descr)
+ name = relative_url(name)
+ # The "extthumb" nonsense works around a limitation of the HTML block model
+ return '' % (name, name, descr, descr)
else:
- return link_tag(name, descr)
+ if img_re.match(descr):
+ descr = '
'
+
+ return link_tag(name, descr, 'wikilink')
def _email_repl(self, word):
return '%s' % (word, word)
@@ -423,15 +445,6 @@ class PageFormatter:
cl = 'notice'
return '' + word + ''
- def _var_repl(self, word):
- if word == '{{' and not self.in_var:
- self.in_var = True
- return '
'
- elif self.in_var:
- self.in_var = False
- return '
'
- return ''
-
def _tr_repl(self, word):
out = ''
if not self.in_table:
@@ -439,16 +452,17 @@ class PageFormatter:
self.tr_cnt = 0
out = '
' + out = out + ' | |
', ' | '][word.strip() == '||='] - def _tre_repl(self, word): + def _td_repl(self, word): if self.in_table: - return ' | ', ' | '][word.strip() == '||='] return '' - def _td_repl(self, word): + def _tre_repl(self, word): if self.in_table: - return ' | ' + return [' | ', ''][word.strip() == '||='] return '' def _indent_level(self): @@ -490,8 +504,9 @@ class PageFormatter: scan_re = re.compile( r"(?:" # Formatting - + r"(?P
---|---|
\s*\|\|\s*)" + + r"|(?P | |
\s*\|\|(=|)\s*)" + r")") pre_re = re.compile( r"(?:" @@ -555,7 +569,6 @@ class Page: self.page_name = page_name self.msg = '' self.msg_type = 'error' - self.attrs = {} def split_title(self): # look for the end of words and the start of a new word, @@ -563,18 +576,18 @@ class Page: return re.sub('([a-z])([A-Z])', r'\1 \2', self.page_name) def _text_filename(self): - return path.join(text_dir, self.page_name) + return path.join(data_dir, self.page_name) def _tmp_filename(self): - return path.join(text_dir, ('#' + self.page_name + '.' + `os.getpid()` + '#')) + return path.join(data_dir, ('#' + self.page_name + '.' + `os.getpid()` + '#')) def exists(self): try: os.stat(self._text_filename()) - return 1 + return True except OSError, er: if er.errno == errno.ENOENT: - return 0 + return False else: raise er @@ -590,14 +603,13 @@ class Page: return open(self._text_filename(), 'rt').read() except IOError, er: if er.errno == errno.ENOENT: - # just doesn't exist, use default - return 'Describe %s here.' % self.page_name - else: - raise er + return '' # just doesn't exist, use default + raise er def get_attrs(self): - if self.attrs: + if self.__dict__.has_key('attrs'): return self.attrs + self.attrs = {} try: file = open(self._text_filename(), 'rt') attr_re = re.compile(r"^#(\S*)(.*)$") @@ -612,11 +624,16 @@ class Page: raise er return self.attrs + def get_attr(self, name, default): + if self.get_attrs().has_key(name): + return self.get_attrs()[name] + else: + return default + def can(self, action, default=True): - attrs = self.get_attrs() try: - # SomeUser:read,write All:read - acl = attrs["acl"] + #acl SomeUser:read,write All:read + acl = self.get_attr("acl", None) for rule in acl.split(): (user,perms) = rule.split(':') if user == remote_user() or user == "All": @@ -639,6 +656,12 @@ class Page: page_name = None if self.can_write(): page_name = self.page_name + + #FIXME: are there security implications? + #css foo.css bar.css + global css_url + css_url = css_url + self.get_attr("css", "").split() + send_title(page_name, self.split_title(), msg=self.msg, msg_type=self.msg_type) if self.can_read(): PageFormatter(self.get_raw_body()).print_html() @@ -647,10 +670,13 @@ class Page: send_footer(page_name, self._last_modified()) def _last_modified(self): - if not self.exists(): + try: + from time import localtime, strftime + modtime = localtime(os.stat(self._text_filename())[stat.ST_MTIME]) + except OSError, er: + if er.errno != errno.ENOENT: + raise er return None - from time import localtime, strftime - modtime = localtime(os.stat(self._text_filename())[stat.ST_MTIME]) return strftime(datetime_fmt, modtime) def send_editor(self, preview=None): @@ -663,9 +689,9 @@ class Page: + ' for ' + cgi.escape(remote_user()) + ' from ' + cgi.escape(get_hostname(remote_host())) + '') - print ' |