#! /usr/local/bin/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()