123 lines · 3.9 KB · Python
RawDownload
"""Wiki main program.  Imported and run by cgi3.py.""" import os, re, cgi, sys, tempfileescape = cgi.escape def main():    form = cgi.FieldStorage()    print "Content-type: text/html"    print    cmd = form.getvalue("cmd", "view")    page = form.getvalue("page", "FrontPage")    wiki = WikiPage(page)    method = getattr(wiki, 'cmd_' + cmd, None) or wiki.cmd_view    method(form) class WikiPage:     homedir = tempfile.gettempdir()    scripturl = os.path.basename(sys.argv[0])     def __init__(self, name):        if not self.iswikiword(name):            raise ValueError, "page name is not a wiki word"        self.name = name        self.load()     def cmd_view(self, form):        print "<h1>", escape(self.splitwikiword(self.name)), "</h1>"        print "<p>"        for line in self.data.splitlines():            line = line.rstrip()            if not line:                print "<p>"            else:                print self.formatline(line)        print "<hr>"        print "<p>", self.mklink("edit", self.name, "Edit this page") + ";"        print self.mklink("view", "FrontPage", "go to front page") + "."     def formatline(self, line):        words = []        for word in re.split('(\W+)', line):            if self.iswikiword(word):                if os.path.isfile(self.mkfile(word)):                    word = self.mklink("view", word, word)                else:                    word = self.mklink("new", word, word + "*")            else:                word = escape(word)            words.append(word)        return "".join(words)     def cmd_edit(self, form, label="Change"):        print "<h1>", label, self.name, "</h1>"        print '<form method="POST" action="%s">' % self.scripturl        s = '<textarea cols="70" rows="20" name="text">%s</textarea>'        print s % self.data        print '<input type="hidden" name="cmd" value="create">'        print '<input type="hidden" name="page" value="%s">' % self.name        print '<br>'        print '<input type="submit" value="%s Page">' % label        print "</form>"     def cmd_create(self, form):        self.data = form.getvalue("text", "").strip()        error = self.store()        if error:            print "<h1>I'm sorry.  That didn't work</h1>"            print "<p>An error occurred while attempting to write the file:"            print "<p>", escape(error)        else:            # Use a redirect directive, to avoid "reload page" problems            print "<head>"            s = '<meta http-equiv="refresh" content="1; URL=%s">'            print s % (self.scripturl + "?cmd=view&page=" + self.name)            print "<head>"            print "<h1>OK</h1>"            print "<p>If nothing happens, please click here:",            print self.mklink("view", self.name, self.name)     def cmd_new(self, form):        self.cmd_edit(form, label="Create")     def iswikiword(self, word):        return re.match("[A-Z][a-z]+([A-Z][a-z]*)+", word)     def splitwikiword(self, word):        chars = []        for c in word:            if chars and c.isupper():                chars.append(' ')            chars.append(c)        return "".join(chars)     def mkfile(self, name=None):        if name is None:            name = self.name        return os.path.join(self.homedir, name + ".txt")     def mklink(self, cmd, page, text):        link = self.scripturl + "?cmd=" + cmd + "&page=" + page        return '<a href="%s">%s</a>' % (link, text)     def load(self):        try:            f = open(self.mkfile())            data = f.read().strip()            f.close()        except IOError:            data = ""        self.data = data     def store(self):        data = self.data        try:            f = open(self.mkfile(), "w")            f.write(data)            if data and not data.endswith('\n'):                f.write('\n')            f.close()            return ""        except IOError, err:            return "IOError: %s" % str(err)