cpython-withatomic / Misc / renumber.py

The branch 'legacy-trunk' does not exist.
#! /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()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.