From: Guido van Rossum Date: Tue, 10 Sep 1996 17:59:15 +0000 (+0000) Subject: Rewritten by Ka-Ping Yee. X-Git-Tag: v1.4~240 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=694f7010ed135a3c935f5b72d4c030d880ec71e4;p=python Rewritten by Ka-Ping Yee. --- diff --git a/Misc/faq2html.py b/Misc/faq2html.py index 2ea3810ae4..84346b49d6 100755 --- a/Misc/faq2html.py +++ b/Misc/faq2html.py @@ -1,193 +1,167 @@ -#! /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(']*\)>') -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 = ['
    '] - questions = ['
      '] - 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('\n') - question = 0 - lines[i] = '

      ' + line[n:-1] + '

      \n' - chapters.append('
    1. ' + line[n:]) - questions.append('
    2. ' + line[n:]) - questions.append('
    \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('
\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] = '
\n' + lines[i]
-		doingpre = 1
-		continue
-	n = blankprog.match(lines[i])
-	if n >= 0:
-	    # print '*** ', lines[i-1], doingpre
-	    if doingpre == 1:
-		lines[i] = '

\n' - doingpre = 0 - else: - lines[i] = '

\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, - 'question \\1', lines[i]) - # no continue - there might be other changes to the line... - - # make into actual links - n = urlprog.search(lines[i]) - if n >= 0: - lines[i] = regsub.gsub(urlprog, '\\1', lines[i]) - # no continue - there might be other changes to the line... - - # make into links - n = emailprog.search(lines[i]) - if n >= 0: - lines[i] = regsub.gsub(emailprog, - '\\1', lines[i]) - # no continue - there might be other changes to the line... - - lines[0:0] = ['Python Frequently Asked Questions v', - version, - '\n', - '\n', - '(This file was generated using\n', - 'faq2html.py.)

\n'] - lines.append('

\n') - - print 'Writing html file...' - f = open(FAQ + '.html', 'w') - for line in lines: - f.write(line) - f.close() - print 'Done.' - -main() +#!/usr/local/bin/python + +# A somewhat-generalized FAQ-to-HTML converter (by Ka-Ping Yee, 10 Sept 96) + +# Reads a text file given on standard input or named as first argument, and +# generates HTML 2.0 on standard output. Recognizes these constructions: +# +# HTML element pattern at the beginning of a line +# +# section heading ()+ +# numbered list element <1-2 spaces>()+ +# unnumbered list element <0-2 spaces> +# preformatted section +# +# Heading level is determined by the number of () segments. +# Blank lines force a separation of elements; if none of the above four +# types is indicated, a new paragraph begins. A line beginning with many +# spaces is interpreted as a continuation (instead of preformatted) after +# a list element. Headings are anchored; paragraphs starting with "Q." are +# emphasized, and those marked with "A." get their first sentence emphasized. +# +# Hyperlinks are created from references to: +# URLs, explicitly marked using +# other questions, of the form "question ()*" +# sections, of the form "section ". + +import sys, string, regex, regsub, regex_syntax +regex.set_syntax(regex_syntax.RE_SYNTAX_AWK) + +# --------------------------------------------------------- regular expressions +orditemprog = regex.compile(' ?([1-9][0-9]*\.)+ +') +itemprog = regex.compile(' ? ?[-*] +') +headingprog = regex.compile('([1-9][0-9]*\.)+ +') +prefmtprog = regex.compile(' ') +blankprog = regex.compile('^[ \t\r\n]$') +questionprog = regex.compile(' *Q\. +') +answerprog = regex.compile(' *A\. +') +sentprog = regex.compile('(([^.:;?!(]|[.:;?!][^ \t\r\n])+[.:;?!]?)') + +mailhdrprog = regex.compile('^(Subject|Newsgroups|Followup-To|From|Reply-To' + '|Approved|Archive-Name|Version|Last-Modified): +', regex.casefold) +urlprog = regex.compile('<URL:([^&]+)>') +addrprog = regex.compile('<([^>@:]+@[^&@:]+)>') +qrefprog = regex.compile('question +([1-9](\.[0-9]+)*)') +srefprog = regex.compile('section +([1-9][0-9]*)') +entityprog = regex.compile('[&<>]') + +# ------------------------------------------------------------ global variables +body = [] +ollev = ullev = 0 +element = content = secnum = version = '' + +# ----------------------------------------------------- for making nested lists +def dnol(): + global body, ollev + ollev = ollev + 1 + if body[-1] == '': del body[-1] + body.append('

    ') + +def upol(): + global body, ollev + ollev = ollev - 1 + body.append(ollev and '
' or '') + +# --------------------------------- output one element and convert its contents +def spew(clearol=0, clearul=0): + global content, body, ollev, ullev + + if content: + if entityprog.search(content) > -1: + content = regsub.gsub('&', '&', content) + content = regsub.gsub('<', '<', content) + content = regsub.gsub('>', '>', content) + + n = questionprog.match(content) + if n > 0: + content = '' + content[n:] + '' + if ollev: # question reference in index + fragid = regsub.gsub('^ +|\.? +$', '', secnum) + content = '%s' % (fragid, content) + + if element[0] == 'h': # heading in the main text + fragid = regsub.gsub('^ +|\.? +$', '', secnum) + content = secnum + '%s' % (fragid, content) + + n = answerprog.match(content) + if n > 0: # answer paragraph + content = regsub.sub(sentprog, '\\1', content[n:]) + + body.append('<' + element + '>' + content) + body.append('') + content = '' + + while clearol and ollev: upol() + if clearul and ullev: body.append(''); ullev = 0 + +# ---------------------------------------------------------------- main program +faq = len(sys.argv)>1 and sys.argv[1] and open(sys.argv[1]) or sys.stdin +lines = faq.readlines() + +for line in lines: + if line[2:9] == '=======': #
will appear *before* + body.append('
') # the underlined heading + continue + + n = orditemprog.match(line) + if n > 0: # make ordered list item + spew(0, 'clear ul') + secnum = line[:n] + level = string.count(secnum, '.') + while level > ollev: dnol() + while level < ollev: upol() + element, content = 'li', line[n:] + continue + + n = itemprog.match(line) + if n > 0: # make unordered list item + spew('clear ol', 0) + if ullev == 0: body.append('