mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	Initial revision
This commit is contained in:
		
							parent
							
								
									49bff65deb
								
							
						
					
					
						commit
						adb3a9db57
					
				
					 1 changed files with 255 additions and 0 deletions
				
			
		
							
								
								
									
										255
									
								
								Tools/faqwiz/faqmain.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								Tools/faqwiz/faqmain.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,255 @@
 | 
			
		|||
#! /depot/sundry/plat/bin/python1.4
 | 
			
		||||
 | 
			
		||||
"""Interactive FAQ project."""
 | 
			
		||||
 | 
			
		||||
import cgi, string, os
 | 
			
		||||
 | 
			
		||||
NAMEPAT = "faq??.???.htp"
 | 
			
		||||
 | 
			
		||||
class FAQServer:
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
	pass
 | 
			
		||||
 | 
			
		||||
    def main(self):
 | 
			
		||||
	self.form = cgi.FieldStorage()
 | 
			
		||||
	req = self.req or 'frontpage'
 | 
			
		||||
	try:
 | 
			
		||||
	    method = getattr(self, 'do_%s' % req)
 | 
			
		||||
	except AttributeError:
 | 
			
		||||
	    print "Unrecognized request type", req
 | 
			
		||||
	else:
 | 
			
		||||
	    method()
 | 
			
		||||
 | 
			
		||||
    KEYS = ['req', 'query', 'name', 'text', 'commit', 'title']
 | 
			
		||||
 | 
			
		||||
    def __getattr__(self, key):
 | 
			
		||||
	if key not in self.KEYS:
 | 
			
		||||
	    raise AttributeError
 | 
			
		||||
	if self.form.has_key(key):
 | 
			
		||||
	    item = self.form[key]
 | 
			
		||||
	    return item.value
 | 
			
		||||
	return ''
 | 
			
		||||
 | 
			
		||||
    def do_frontpage(self):
 | 
			
		||||
	print """
 | 
			
		||||
	<TITLE>Python FAQ (alpha 1)</TITLE>
 | 
			
		||||
	<H1>Python FAQ Front Page</H1>
 | 
			
		||||
	<UL>
 | 
			
		||||
	<LI><A HREF="faq.py?req=search">Search the FAQ</A>
 | 
			
		||||
	<LI><A HREF="faq.py?req=browse">Browse the FAQ</A>
 | 
			
		||||
	<LI><A HREF="faq.py?req=submit">Submit a new FAQ entry</A>
 | 
			
		||||
	<LI><A HREF="faq.py?req=roulette">Random FAQ entry</A>
 | 
			
		||||
	</UL>
 | 
			
		||||
 | 
			
		||||
	<FORM ACTION="faq.py?req=query">
 | 
			
		||||
	<INPUT TYPE=text NAME=query>
 | 
			
		||||
	<INPUT TYPE=submit VALUE="Search">
 | 
			
		||||
	<INPUT TYPE=hidden NAME=req VALUE=query>
 | 
			
		||||
	</FORM>
 | 
			
		||||
 | 
			
		||||
	Disclaimer: these pages are intended to be edited by anyone.
 | 
			
		||||
	Please exercise discretion when editing, don't be rude, etc.
 | 
			
		||||
	"""
 | 
			
		||||
 | 
			
		||||
    def do_browse(self):
 | 
			
		||||
	print """
 | 
			
		||||
	<TITLE>Python FAQ</TITLE>
 | 
			
		||||
	<H1>Python FAQ</H1>
 | 
			
		||||
	<HR>
 | 
			
		||||
	"""
 | 
			
		||||
	names = os.listdir(os.curdir)
 | 
			
		||||
	names.sort()
 | 
			
		||||
	n = 0
 | 
			
		||||
	for name in names:
 | 
			
		||||
	    headers, body = self.read(name)
 | 
			
		||||
	    if headers:
 | 
			
		||||
		self.show(name, headers, body, 1)
 | 
			
		||||
		n = n+1
 | 
			
		||||
	if not n:
 | 
			
		||||
	    print "No FAQ entries?!?!"
 | 
			
		||||
 | 
			
		||||
    def do_roulette(self):
 | 
			
		||||
	import whrandom
 | 
			
		||||
	print """
 | 
			
		||||
	<TITLE>Python FAQ Roulette</TITLE>
 | 
			
		||||
	<H1>Python FAQ Roulette</H1>
 | 
			
		||||
	Please check the correctness of the entry below.
 | 
			
		||||
	If you find any problems, please edit the entry.
 | 
			
		||||
	<P>
 | 
			
		||||
	<HR>
 | 
			
		||||
	"""
 | 
			
		||||
	names = os.listdir(os.curdir)
 | 
			
		||||
	while names:
 | 
			
		||||
	    name = whrandom.choice(names)
 | 
			
		||||
	    headers, body = self.read(name)
 | 
			
		||||
	    if headers:
 | 
			
		||||
		self.show(name, headers, body, 1)
 | 
			
		||||
		print '<P><A HREF="faq.py?req=roulette">Show another one</A>'
 | 
			
		||||
		break
 | 
			
		||||
	    else:
 | 
			
		||||
		names.remove(name)
 | 
			
		||||
	else:
 | 
			
		||||
	    print "No FAQ entries?!?!"
 | 
			
		||||
 | 
			
		||||
    def do_search(self):
 | 
			
		||||
	print """
 | 
			
		||||
	<TITLE>Search the Python FAQ</TITLE>
 | 
			
		||||
	<H1>Search the Python FAQ</H1>
 | 
			
		||||
 | 
			
		||||
	<FORM ACTION="faq.py?req=query">
 | 
			
		||||
	<INPUT TYPE=text NAME=query>
 | 
			
		||||
	<INPUT TYPE=submit VALUE="Search">
 | 
			
		||||
	<INPUT TYPE=hidden NAME=req VALUE=query>
 | 
			
		||||
	</FORM>
 | 
			
		||||
	"""
 | 
			
		||||
 | 
			
		||||
    def do_query(self):
 | 
			
		||||
	import regex
 | 
			
		||||
	print "<TITLE>Python FAQ Query Results</TITLE>"
 | 
			
		||||
	print "<H1>Python FAQ Query Results</H1>"
 | 
			
		||||
	query = self.query
 | 
			
		||||
	if not query:
 | 
			
		||||
	    print "No query string"
 | 
			
		||||
	    return
 | 
			
		||||
	p = regex.compile(query, regex.casefold)
 | 
			
		||||
	names = os.listdir(os.curdir)
 | 
			
		||||
	names.sort()
 | 
			
		||||
	print "<HR>"
 | 
			
		||||
	n = 0
 | 
			
		||||
	for name in names:
 | 
			
		||||
	    headers, body = self.read(name)
 | 
			
		||||
	    if headers:
 | 
			
		||||
		title = headers['title']
 | 
			
		||||
		if p.search(title) >= 0 or p.search(body) >= 0:
 | 
			
		||||
		    self.show(name, headers, body, 1)
 | 
			
		||||
		    n = n+1
 | 
			
		||||
	if not n:
 | 
			
		||||
	    print "No hits."
 | 
			
		||||
 | 
			
		||||
    def do_edit(self):
 | 
			
		||||
	name = self.name
 | 
			
		||||
	headers, body = self.read(name)
 | 
			
		||||
	if not headers:
 | 
			
		||||
	    print "Invalid file name", name
 | 
			
		||||
	    return
 | 
			
		||||
	print """
 | 
			
		||||
	<TITLE>Python FAQ Edit Form</TITLE>
 | 
			
		||||
	<H1>Python FAQ Edit Form</H1>
 | 
			
		||||
	"""
 | 
			
		||||
	self.showheaders(headers)
 | 
			
		||||
	title = headers['title']
 | 
			
		||||
	print """
 | 
			
		||||
	<FORM METHOD=POST ACTION=faq.py>
 | 
			
		||||
	<INPUT TYPE=text SIZE=80 NAME=title VALUE="%s"<BR>
 | 
			
		||||
	<TEXTAREA COLS=80 ROWS=20 NAME=text>""" % title
 | 
			
		||||
	print cgi.escape(string.strip(body))
 | 
			
		||||
	print """</TEXTAREA>
 | 
			
		||||
	<BR>
 | 
			
		||||
	<INPUT TYPE=submit VALUE="Review Edit">
 | 
			
		||||
	<INPUT TYPE=hidden NAME=req VALUE=review>
 | 
			
		||||
	<INPUT TYPE=hidden NAME=name VALUE=%s>
 | 
			
		||||
	</FORM>
 | 
			
		||||
	<HR>
 | 
			
		||||
	""" % name
 | 
			
		||||
	self.show(name, headers, body)
 | 
			
		||||
 | 
			
		||||
    def do_review(self):
 | 
			
		||||
	name = self.name
 | 
			
		||||
	text = self.text
 | 
			
		||||
	commit = self.commit
 | 
			
		||||
	title = self.title
 | 
			
		||||
	if commit:
 | 
			
		||||
	    self.precheckin(name, text, title)
 | 
			
		||||
	    return
 | 
			
		||||
	headers, body = self.read(name)
 | 
			
		||||
	if not headers:
 | 
			
		||||
	    print "Invalid file name", name
 | 
			
		||||
	    return
 | 
			
		||||
	print """
 | 
			
		||||
	<TITLE>Python FAQ Review Form</TITLE>
 | 
			
		||||
	<H1>Python FAQ Review Form</H1>
 | 
			
		||||
	"""
 | 
			
		||||
	self.show(name, {'title': title}, text)
 | 
			
		||||
	print """
 | 
			
		||||
	<FORM METHOD=POST ACTION=faq.py>
 | 
			
		||||
	<INPUT TYPE=submit NAME=commit VALUE="Commit">
 | 
			
		||||
	<P>
 | 
			
		||||
	<HR>
 | 
			
		||||
	"""
 | 
			
		||||
	self.showheaders(headers)
 | 
			
		||||
	print """
 | 
			
		||||
	<INPUT TYPE=text SIZE=80 NAME=title VALUE="%s"<BR>
 | 
			
		||||
	<TEXTAREA COLS=80 ROWS=20 NAME=text>""" % title
 | 
			
		||||
	print cgi.escape(string.strip(text))
 | 
			
		||||
	print """</TEXTAREA>
 | 
			
		||||
	<BR>
 | 
			
		||||
	<INPUT TYPE=submit VALUE="Review Edit">
 | 
			
		||||
	<INPUT TYPE=hidden NAME=req VALUE=review>
 | 
			
		||||
	<INPUT TYPE=hidden NAME=name VALUE=%s>
 | 
			
		||||
	</FORM>
 | 
			
		||||
	<HR>
 | 
			
		||||
	""" % name
 | 
			
		||||
 | 
			
		||||
    def precheckin(self, name, text, title):
 | 
			
		||||
	pass
 | 
			
		||||
 | 
			
		||||
    def showheaders(self, headers):
 | 
			
		||||
	print "<UL>"
 | 
			
		||||
	keys = map(string.lower, headers.keys())
 | 
			
		||||
	keys.sort()
 | 
			
		||||
	for key in keys:
 | 
			
		||||
	    print "<LI><B>%s:</B> %s" % (string.capwords(key, '-'),
 | 
			
		||||
					 headers[key] or '')
 | 
			
		||||
	print "</UL>"
 | 
			
		||||
 | 
			
		||||
    def read(self, name):
 | 
			
		||||
	import fnmatch, rfc822
 | 
			
		||||
	if not fnmatch.fnmatch(name, NAMEPAT):
 | 
			
		||||
	    return None, None
 | 
			
		||||
	f = open(name)
 | 
			
		||||
	headers = rfc822.Message(f)
 | 
			
		||||
	body = f.read()
 | 
			
		||||
	f.close()
 | 
			
		||||
	return headers, body
 | 
			
		||||
 | 
			
		||||
    def show(self, name, headers, body, edit=0):
 | 
			
		||||
	# XXX Should put <A> tags around recognizable URLs
 | 
			
		||||
	# XXX Should also turn "see section N" into hyperlinks
 | 
			
		||||
	title = headers['title']
 | 
			
		||||
	print "<H2>%s</H2>" % title
 | 
			
		||||
	pre = 0
 | 
			
		||||
	for line in string.split(body, '\n'):
 | 
			
		||||
	    if not string.strip(line):
 | 
			
		||||
		if pre:
 | 
			
		||||
		    print '</PRE>'
 | 
			
		||||
		    pre = 0
 | 
			
		||||
		else:
 | 
			
		||||
		    print '<P>'
 | 
			
		||||
	    else:
 | 
			
		||||
		if line == string.lstrip(line):
 | 
			
		||||
		    if pre:
 | 
			
		||||
			print '</PRE>'
 | 
			
		||||
			pre = 0
 | 
			
		||||
		else:
 | 
			
		||||
		    if not pre:
 | 
			
		||||
			print '<PRE>'
 | 
			
		||||
			pre = 1
 | 
			
		||||
		print line
 | 
			
		||||
	if pre:
 | 
			
		||||
	    print '</PRE>'
 | 
			
		||||
	    pre = 0
 | 
			
		||||
	print '<P>'
 | 
			
		||||
	if edit:
 | 
			
		||||
	    print '<A HREF="faq.py?req=edit&name=%s">Edit this entry</A>' %name
 | 
			
		||||
	    print '<P>'
 | 
			
		||||
	print "<HR>"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
print "Content-type: text/html\n"
 | 
			
		||||
try:
 | 
			
		||||
    x = FAQServer()
 | 
			
		||||
    x.main()
 | 
			
		||||
except:
 | 
			
		||||
    print "<HR>Sorry, an error occurred"
 | 
			
		||||
    cgi.print_exception()
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue