mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			193 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#! /usr/local/bin/python
 | 
						|
 | 
						|
# Convert the Python FAQ to HTML
 | 
						|
 | 
						|
import string
 | 
						|
import regex
 | 
						|
import regsub
 | 
						|
import sys
 | 
						|
import os
 | 
						|
 | 
						|
FAQ = 'FAQ'
 | 
						|
 | 
						|
chapterprog = regex.compile('^\([1-9][0-9]*\)\. ')
 | 
						|
questionprog = regex.compile('^\([1-9][0-9]*\)\.\([1-9][0-9]*\)\. ')
 | 
						|
newquestionprog = regex.compile('^Q\. ')
 | 
						|
blankprog = regex.compile('^[ \t]*$')
 | 
						|
indentedorblankprog = regex.compile('^\([ \t]+\|[ \t]*$\)')
 | 
						|
underlineprog = regex.compile('^==*$')
 | 
						|
eightblanksprog = regex.compile('^\(        \| *\t\)')
 | 
						|
mailheaderprog = regex.compile('^\(Subject\|Newsgroups\|Followup-To\|From\|Reply-To\|Approved\|Archive-name\|Version\|Last-modified\): +')
 | 
						|
urlprog = regex.compile('<URL:\([^>]*\)>')
 | 
						|
ampprog = regex.compile('&')
 | 
						|
aprog = regex.compile('^A\. +')
 | 
						|
qprog = regex.compile('>Q\. +')
 | 
						|
qrefprog = regex.compile('question +\([0-9]\.[0-9]+\)')
 | 
						|
versionprog = regex.compile('^Version: ')
 | 
						|
emailprog = regex.compile('<\([^>@:]+@[^>@:]+\)>')
 | 
						|
 | 
						|
def main():
 | 
						|
    print 'Reading lines...'
 | 
						|
    lines = open(FAQ, 'r').readlines()
 | 
						|
    print 'Renumbering in memory...'
 | 
						|
    oldlines = lines[:]
 | 
						|
    after_blank = 1
 | 
						|
    chapter = 0
 | 
						|
    question = 0
 | 
						|
    chapters = ['<OL>']
 | 
						|
    questions = ['<OL>']
 | 
						|
    for i in range(len(lines)):
 | 
						|
	line = lines[i]
 | 
						|
	if after_blank:
 | 
						|
	    n = chapterprog.match(line)
 | 
						|
	    if n >= 0:
 | 
						|
		chapter = chapter + 1
 | 
						|
		if chapter != 1:
 | 
						|
		    questions.append('</UL>\n')
 | 
						|
		question = 0
 | 
						|
		lines[i] = '<H2>' + line[n:-1] + '</H2>\n'
 | 
						|
		chapters.append('<LI> ' + line[n:])
 | 
						|
		questions.append('<LI> ' + line[n:])
 | 
						|
		questions.append('<UL>\n')
 | 
						|
		afterblank = 0
 | 
						|
		continue
 | 
						|
	    n = underlineprog.match(line)
 | 
						|
	    if n >= 0:
 | 
						|
		lines[i] = ''
 | 
						|
		continue
 | 
						|
	    n = questionprog.match(line)
 | 
						|
	    if n < 0: n = newquestionprog.match(line) - 3
 | 
						|
	    if n >= 0:
 | 
						|
		question = question + 1
 | 
						|
		number = '%d.%d'%(chapter, question)
 | 
						|
		lines[i] = '<A NAME="' + number + '"><H3>' + line[n:]
 | 
						|
		questions.append('<LI><A HREF="#' + \
 | 
						|
				 number + '">' + line[n:])
 | 
						|
		# Add up to 4 continuations of the question
 | 
						|
		n = len(number)
 | 
						|
		for j in range(i+1, i+5):
 | 
						|
		    if blankprog.match(lines[j]) >= 0:
 | 
						|
			lines[j-1] = lines[j-1] + '</H3></A>'
 | 
						|
			questions[-1] = \
 | 
						|
			      questions[-1][:-1] + '</A>\n'
 | 
						|
			break
 | 
						|
		    questions.append(' '*(n+2) + lines[j])
 | 
						|
		afterblank = 0
 | 
						|
		continue
 | 
						|
	afterblank = (blankprog.match(line) >= 0)
 | 
						|
    print 'Inserting list of chapters...'
 | 
						|
    chapters.append('</OL>\n')
 | 
						|
    for i in range(len(lines)):
 | 
						|
	line = lines[i]
 | 
						|
	if regex.match(
 | 
						|
		  '^This FAQ is divided in the following chapters',
 | 
						|
		  line) >= 0:
 | 
						|
	    i = i+1
 | 
						|
	    while 1:
 | 
						|
		line = lines[i]
 | 
						|
		if indentedorblankprog.match(line) < 0:
 | 
						|
		    break
 | 
						|
		del lines[i]
 | 
						|
	    lines[i:i] = chapters
 | 
						|
	    break
 | 
						|
    else:
 | 
						|
	print '*** Can\'t find header for list of chapters'
 | 
						|
	print '*** Chapters found:'
 | 
						|
	for line in chapters: print line,
 | 
						|
    print 'Inserting list of questions...'
 | 
						|
    questions.append('</UL></OL>\n')
 | 
						|
    for i in range(len(lines)):
 | 
						|
	line = lines[i]
 | 
						|
	if regex.match('^Here.s an overview of the questions',
 | 
						|
		  line) >= 0:
 | 
						|
	    i = i+1
 | 
						|
	    while 1:
 | 
						|
		line = lines[i]
 | 
						|
		if indentedorblankprog.match(line) < 0:
 | 
						|
		    break
 | 
						|
		del lines[i]
 | 
						|
	    lines[i:i] = questions
 | 
						|
	    break
 | 
						|
    else:
 | 
						|
	print '*** Can\'t find header for list of questions'
 | 
						|
	print '*** Questions found:'
 | 
						|
	for line in questions: print line,
 | 
						|
    # final cleanup
 | 
						|
    print "Final cleanup..."
 | 
						|
    doingpre = 0
 | 
						|
    for i in range(len(lines)):
 | 
						|
	# set lines indented by >= 8 spaces using PRE
 | 
						|
	# blank lines either terminate PRE or separate paragraphs
 | 
						|
	n = eightblanksprog.match(lines[i])
 | 
						|
	if n < 0: n = mailheaderprog.match(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    if versionprog.match(lines[i]) > 0:
 | 
						|
		version = string.split(lines[i])[1]
 | 
						|
	    if doingpre == 0:
 | 
						|
		lines[i] = '<PRE>\n' + lines[i]
 | 
						|
		doingpre = 1
 | 
						|
		continue
 | 
						|
	n = blankprog.match(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    # print '*** ', lines[i-1], doingpre
 | 
						|
	    if doingpre == 1:
 | 
						|
		lines[i] = '</PRE><P>\n'
 | 
						|
		doingpre = 0
 | 
						|
	    else:
 | 
						|
		lines[i] = '<P>\n'
 | 
						|
	    continue
 | 
						|
 | 
						|
	# & -> &
 | 
						|
	n = ampprog.search(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    lines[i] = regsub.gsub(ampprog, '&', lines[i])
 | 
						|
	    # no continue - there might be other changes to the line...
 | 
						|
 | 
						|
	# zap all the 'Q.' and 'A.' leaders - what happened to the
 | 
						|
	# last couple?
 | 
						|
	n = qprog.search(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    lines[i] = regsub.sub(qprog, '>', lines[i])
 | 
						|
	    # no continue - there might be other changes to the line...
 | 
						|
 | 
						|
	n = aprog.search(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    lines[i] = regsub.sub(aprog, '', lines[i])
 | 
						|
	    # no continue - there might be other changes to the line...
 | 
						|
 | 
						|
	# patch up hard refs to questions
 | 
						|
	n = qrefprog.search(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    lines[i] = regsub.sub(qrefprog,
 | 
						|
				  '<A HREF="#\\1">question \\1</A>', lines[i])
 | 
						|
	    # no continue - there might be other changes to the line...
 | 
						|
 | 
						|
	# make <URL:...> into actual links
 | 
						|
	n = urlprog.search(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    lines[i] = regsub.gsub(urlprog, '<A HREF="\\1">\\1</A>', lines[i])
 | 
						|
	    # no continue - there might be other changes to the line...
 | 
						|
 | 
						|
	# make <user@host.domain> into <mailto:...> links
 | 
						|
	n = emailprog.search(lines[i])
 | 
						|
	if n >= 0:
 | 
						|
	    lines[i] = regsub.gsub(emailprog,
 | 
						|
				   '<A HREF="mailto:\\1">\\1</A>', lines[i])
 | 
						|
	    # no continue - there might be other changes to the line...
 | 
						|
 | 
						|
    lines[0:0] = ['<HTML><HEAD><TITLE>Python Frequently Asked Questions v',
 | 
						|
		  version,
 | 
						|
		  '</TITLE>\n',
 | 
						|
		  '</HEAD><body>\n',
 | 
						|
		  '(This file was generated using\n',
 | 
						|
		  '<A HREF="faq2html.py">faq2html.py</A>.)<P>\n']
 | 
						|
    lines.append('<P></BODY></HTML>\n')
 | 
						|
 | 
						|
    print 'Writing html file...'
 | 
						|
    f = open(FAQ + '.html', 'w')
 | 
						|
    for line in lines:
 | 
						|
	f.write(line)
 | 
						|
    f.close()
 | 
						|
    print 'Done.'
 | 
						|
 | 
						|
main()
 |