mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/local/bin/python
 | |
| 
 | |
| """CGI test 3 (persistent data)."""
 | |
| 
 | |
| 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") or "view"
 | |
|     page = form.getvalue("page") or "FrontPage"
 | |
|     wiki = WikiPage(page)
 | |
|     wiki.load()
 | |
|     method = getattr(wiki, 'cmd_' + cmd, None) or wiki.cmd_view
 | |
|     method(form)
 | |
| 
 | |
| class WikiPage:
 | |
| 
 | |
|     homedir = os.path.dirname(sys.argv[0])
 | |
|     scripturl = os.path.basename(sys.argv[0])
 | |
| 
 | |
|     def __init__(self, name):
 | |
|         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()
 | |
|         self.store()
 | |
|         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)
 | |
|             f.close()
 | |
|             return ""
 | |
|         except IOError, err:
 | |
|             return "IOError: %s" % str(err)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
