| #! /usr/bin/env python |
| |
| # Renumber the Python FAQ |
| |
| import string |
| import regex |
| 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]*$\)') |
| |
| def main(): |
| print 'Reading lines...' |
| lines = open(FAQ, 'r').readlines() |
| print 'Renumbering in memory...' |
| oldlines = lines[:] |
| after_blank = 1 |
| chapter = 0 |
| question = 0 |
| chapters = ['\n'] |
| questions = [] |
| for i in range(len(lines)): |
| line = lines[i] |
| if after_blank: |
| n = chapterprog.match(line) |
| if n >= 0: |
| chapter = chapter + 1 |
| question = 0 |
| line = `chapter` + '. ' + line[n:] |
| lines[i] = line |
| chapters.append(' ' + line) |
| questions.append('\n') |
| questions.append(' ' + line) |
| afterblank = 0 |
| continue |
| n = questionprog.match(line) |
| if n < 0: n = newquestionprog.match(line) - 3 |
| if n >= 0: |
| question = question + 1 |
| number = '%d.%d. '%(chapter, question) |
| line = number + line[n:] |
| lines[i] = line |
| questions.append(' ' + line) |
| # 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: |
| break |
| questions.append(' '*(n+2) + lines[j]) |
| afterblank = 0 |
| continue |
| afterblank = (blankprog.match(line) >= 0) |
| print 'Inserting list of chapters...' |
| chapters.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, |
| if lines == oldlines: |
| print 'No changes.' |
| return |
| print 'Writing new file...' |
| f = open(FAQ + '.new', 'w') |
| for line in lines: |
| f.write(line) |
| f.close() |
| print 'Making backup...' |
| os.rename(FAQ, FAQ + '~') |
| print 'Moving new file...' |
| os.rename(FAQ + '.new', FAQ) |
| print 'Done.' |
| |
| main() |