summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-01-04 19:21:44 (GMT)
committerGuido van Rossum <guido@python.org>1995-01-04 19:21:44 (GMT)
commit03d4c260e30502d42e1827dea574dd221e83b05f (patch)
tree6c881def5f2dad355bbbfa9d1edbcb42880df6e2
parent227a0a1e2d05596d706c2840e6fb407472075e72 (diff)
downloadcpython-03d4c260e30502d42e1827dea574dd221e83b05f.zip
cpython-03d4c260e30502d42e1827dea574dd221e83b05f.tar.gz
cpython-03d4c260e30502d42e1827dea574dd221e83b05f.tar.bz2
New file -- creates FAQ.html.
-rwxr-xr-xMisc/faq2html.py193
1 files changed, 193 insertions, 0 deletions
diff --git a/Misc/faq2html.py b/Misc/faq2html.py
new file mode 100755
index 0000000..cdb49de
--- /dev/null
+++ b/Misc/faq2html.py
@@ -0,0 +1,193 @@
+#! /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
+
+ # & -> &amp;
+ n = ampprog.search(lines[i])
+ if n >= 0:
+ lines[i] = regsub.gsub(ampprog, '&amp;', 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',
+ '<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()