[Python-checkins] python/dist/src/Demo/cgi wiki.py,NONE,1.1 cgi3.py,1.3,1.4

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Thu, 17 Oct 2002 08:53:04 -0700


Update of /cvsroot/python/python/dist/src/Demo/cgi
In directory usw-pr-cvs1:/tmp/cvs-serv16897

Modified Files:
	cgi3.py 
Added Files:
	wiki.py 
Log Message:
Restructure: move all wiki code into a separate module.

--- NEW FILE: wiki.py ---
"""Wiki main program.  Imported and run by cgi3.py."""

import os, re, cgi, sys
escape = 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)
    wiki.load()
    method = getattr(wiki, 'cmd_' + cmd, None) or wiki.cmd_view
    method(form)

class WikiPage:

    homedir = "/tmp"
    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>"
                continue
            words = re.split('(\W+)', line)
            for i in range(len(words)):
                word = words[i]
                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[i] = word
            print "".join(words)
        print "<hr>"
        print "<p>", self.mklink("edit", self.name, "Edit this page") + ";"
        print self.mklink("view", "FrontPage", "go to front page") + "."

    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:
            self.cmd_view(form)

    def cmd_new(self, form):
        self.cmd_edit(form, label="Create Page")

    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)

Index: cgi3.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Demo/cgi/cgi3.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** cgi3.py	17 Oct 2002 13:34:01 -0000	1.3
--- cgi3.py	17 Oct 2002 15:53:02 -0000	1.4
***************
*** 5,121 ****
  import cgitb; cgitb.enable()
  
! import os, re, cgi, sys
! escape = 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)
!     wiki.load()
!     method = getattr(wiki, 'cmd_' + cmd, None) or wiki.cmd_view
!     method(form)
! 
! class WikiPage:
! 
!     homedir = "/tmp"
!     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>"
!                 continue
!             words = re.split('(\W+)', line)
!             for i in range(len(words)):
!                 word = words[i]
!                 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[i] = word
!             print "".join(words)
!         print "<hr>"
!         print "<p>", self.mklink("edit", self.name, "Edit this page") + ";"
!         print self.mklink("view", "FrontPage", "go to front page") + "."
! 
!     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:
!             self.cmd_view(form)
! 
!     def cmd_new(self, form):
!         self.cmd_edit(form, label="Create Page")
! 
!     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)
! 
!     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)
  
  if __name__ == "__main__":
--- 5,9 ----
  import cgitb; cgitb.enable()
  
! from wiki import main
  
  if __name__ == "__main__":