#! /usr/local/bin/python

# Convert GNU texinfo files into HTML, one file per node.
# Based on Texinfo 2.14.
# Usage: texi2html [-d] [-d] [-c] inputfile outputdirectory
# The input file must be a complete texinfo file, e.g. emacs.texi.
# This creates many files (one per info node) in the output directory,
# overwriting existing files of the same name.  All files created have
# ".html" as their extension.


# XXX To do:
# - handle @comment*** correctly
# - handle @xref {some words} correctly
# - handle @ftable correctly (items aren't indexed?)
# - handle @itemx properly
# - handle @exdent properly
# - add links directly to the proper line from indices
# - check against the definitive list of @-cmds; we still miss (among others):
# - @defindex (hard)
# - @c(omment) in the middle of a line (rarely used)
# - @this* (not really needed, only used in headers anyway)
# - @today{} (ever used outside title page?)

# More consistent handling of chapters/sections/etc.
# Lots of documentation
# Many more options:
#	-top	designate top node
#	-links	customize which types of links are included
#	-split  split at chapters or sections instead of nodes
#	-name	Allow different types of filename handling. Non unix systems
#		will have problems with long node names
#	...
# Support the most recent texinfo version and take a good look at HTML 3.0
# More debugging output (customizable) and more fexible error handling
# How about icons ?

import os
import regex
import regsub
import string

MAGIC = '\\input texinfo'

cmprog = regex.compile('^@\([a-z]+\)\([ \t]\|$\)') # Command (line-oriented)
blprog = regex.compile('^[ \t]*$') # Blank line
kwprog = regex.compile('@[a-z]+') # Keyword (embedded, usually with {} args)
spprog = regex.compile('[\n@{}&<>]') # Special characters in running text
miprog = regex.compile( \
	'^\* \([^:]*\):\(:\|[ \t]*\([^\t,\n.]+\)\([^ \t\n]*\)\)[ \t\n]*')
					# menu item (Yuck!)


class Node:
    __doc__ = """
    Some of the parser's functionality is separated into this class.

    A Node accumulates its contents, takes care of links to other Nodes
    and saves itself when it is finished and all links are resolved. """
    
    def __init__ (self, dir, name, topname, title, next, prev, up):
	self.dirname = dir
	self.name = name
	if topname:
	    self.topname = topname
	else:
	    self.topname = name
	self.title = title
	self.next = next
	self.prev = prev
	self.up = up
	self.lines = []
	self.type = 0
	self.cont = ''
	
    def write (self, *lines):
	map(self.lines.append, lines)

    def flush (self):
	fp = open (self.dirname + '/' + makefile(self.name), 'w')
	fp.write (self.prologue)
	fp.write (self.text)
	fp.write (self.epilogue)
	fp.close ()

    
    def link(self, label, nodename):
	if nodename:
	    if string.lower(nodename) == '(dir)':
		addr = '../dir.html'
	    else:
		addr = makefile(nodename)
	    self.write(label, ': <A HREF="', addr, '" TYPE="', \
		       label, '">', nodename, '</A>  \n')

    
    def finalize(self):
	length = len (self.lines)
	self.text = string.joinfields (self.lines, '')
	self.lines = []
	self.write ('<HR>\n')
	if self.cont != self.next:
	    self.link('Cont', self.cont)
	self.link('Next', self.next)
	self.link('Prev', self.prev)
	self.link('Up', self.up)
	if self.name <> self.topname:
	    self.link('Top', self.topname)
	self.write ('<HR>\n')
	links = string.joinfields(self.lines, '')
	self.lines = []
	
	self.prologue = ('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n'
			 '<!-- Converted with texi2html and Python -->\n'
			 '<HEAD>\n'
			 '  <TITLE>' + self.title + '</TITLE>\n'
			 '</HEAD><BODY>\n' + \
			 links)
	
	if length > 20:
	    self.epilogue = '<P>\n%s</BODY>\n' % links
	else:
	    self.epilogue = '</BODY>\n'
	    

class TexinfoParser:

	# Initialize an instance
	def __init__(self):
		self.unknown = {}	# statistics about unknown @-commands
		self.filenames = {}	# Check for identical filenames
		self.debugging = 0	# larger values produce more output
		self.nodefp = None	# open file we're writing to
		self.nodelineno = 0	# Linenumber relative to node
		self.links = None	# Links from current node
		self.savetext = None	# If not None, save text head instead
		self.savestack = []	# If not None, save text head instead
		self.dirname = 'tmp'	# directory where files are created
		self.includedir = '.'	# directory to search @include files
		self.nodename = ''	# name of current node
		self.topname = ''	# name of top node (first node seen)
		self.title = ''		# title of this whole Texinfo tree
		self.resetindex()	# Reset all indices
		self.contents = []	# Reset table of contents
		self.numbering = []	# Reset section numbering counters
		self.nofill = 0		# Normal operation: fill paragraphs
		self.values={'html': 1} # Names that should be parsed in ifset
		self.stackinfo={}	# Keep track of state in the stack
		# XXX The following should be reset per node?!
		self.footnotes = []	# Reset list of footnotes
		self.itemarg = None	# Reset command used by @item
		self.itemnumber = None	# Reset number for @item in @enumerate
		self.itemindex = None	# Reset item index name
		self.node = None
		self.nodestack = []
		self.cont = 0
		self.includedepth = 0
	# Set (output) directory name
	def setdirname(self, dirname):
		self.dirname = dirname

	# Set include directory name
	def setincludedir(self, includedir):
		self.includedir = includedir

	# Parse the contents of an entire file
	def parse(self, fp):
		line = fp.readline()
		lineno = 1
		while line and (line[0] == '%' or blprog.match(line) >= 0):
			line = fp.readline()
			lineno = lineno + 1
		if line[:len(MAGIC)] <> MAGIC:
			raise SyntaxError, 'file does not begin with '+`MAGIC`
		self.parserest(fp, lineno)

	# Parse the contents of a file, not expecting a MAGIC header
	def parserest(self, fp, initial_lineno):
		lineno = initial_lineno
		self.done = 0
		self.skip = 0
		self.stack = []
		accu = []
		while not self.done:
			line = fp.readline()
			self.nodelineno = self.nodelineno + 1
			if not line:
				if accu:
					if not self.skip: self.process(accu)
					accu = []
				if initial_lineno > 0:
					print '*** EOF before @bye'
				break
			lineno = lineno + 1
			if cmprog.match(line) >= 0:
				a, b = cmprog.regs[1]
				cmd = line[a:b]
				if cmd in ('noindent', 'refill'):
					accu.append(line)
				else:
					if accu:
						if not self.skip:
							self.process(accu)
						accu = []
					self.command(line)
			elif blprog.match(line) >= 0 and \
			     'format' not in self.stack and \
			     'example' not in self.stack:
				if accu:
					if not self.skip:
						self.process(accu)
						self.write('<P>\n')
						accu = []
			else:
				# Append the line including trailing \n!
				accu.append(line)
		#
		if self.skip:
			print '*** Still skipping at the end'
		if self.stack:
			print '*** Stack not empty at the end'
			print '***', self.stack
		if self.includedepth == 0:
		    while self.nodestack:
			self.nodestack[-1].finalize ()
			self.nodestack[-1].flush ()
			del self.nodestack [-1]

	# Start saving text in a buffer instead of writing it to a file
	def startsaving(self):
		if self.savetext <> None:
			self.savestack.append (self.savetext)
			# print '*** Recursively saving text, expect trouble'
		self.savetext = ''

	# Return the text saved so far and start writing to file again
	def collectsavings(self):
		savetext = self.savetext
		if len (self.savestack) > 0:
			self.savetext = self.savestack[-1]
			del self.savestack[-1]
		else:
			self.savetext = None
		return savetext or ''

	# Write text to file, or save it in a buffer, or ignore it
	def write(self, *args):
		try:
			text = string.joinfields(args, '')
		except:
			print args
			raise TypeError
		if self.savetext <> None:
			self.savetext = self.savetext + text
		elif self.nodefp:
			self.nodefp.write(text)
		elif self.node:
		        self.node.write (text)
	# Complete the current node -- write footnotes and close file
	def endnode(self):
		if self.savetext <> None:
			print '*** Still saving text at end of node'
			dummy = self.collectsavings()
		if self.footnotes:
			self.writefootnotes()
		if self.nodefp:
			if self.nodelineno > 20:
				self.write ('<HR>\n')
				[name, next, prev, up] = self.nodelinks[:4]
				self.link('Next', next)
				self.link('Prev', prev)
				self.link('Up', up)
				if self.nodename <> self.topname:
					self.link('Top', self.topname)
				self.write ('<HR>\n')
			self.write('</BODY>\n')
			self.nodefp.close()
			self.nodefp = None
		elif self.node:
		    if not self.cont and \
		       (not self.node.type or \
			(self.node.next and self.node.prev and self.node.up)):
			self.node.finalize ()
			self.node.flush ()
		    else:
			self.nodestack.append (self.node)
		    self.node = None
		self.nodename = ''

	# Process a list of lines, expanding embedded @-commands
	# This mostly distinguishes between menus and normal text
	def process(self, accu):
		if self.debugging > 1:
			print self.skip, self.stack,
			if accu: print accu[0][:30],
			if accu[0][30:] or accu[1:]: print '...',
			print
		if self.stack and self.stack[-1] == 'menu':
			# XXX should be done differently
			for line in accu:
				if miprog.match(line) < 0:
					line = string.strip(line) + '\n'
					self.expand(line)
					continue
				(bgn, end), (a, b), (c, d), (e, f), (g, h) = \
					miprog.regs[:5]
				label = line[a:b]
				nodename = line[c:d]
				if nodename[0] == ':': nodename = label
				else: nodename = line[e:f]
				punct = line[g:h]
				self.write('<LI><A HREF="',
					   makefile(nodename),
					   '">', nodename,
					   '</A>', punct, '\n')
				self.expand(line[end:])
		else:
			text = string.joinfields(accu, '')
			self.expand(text)

	# Write a string, expanding embedded @-commands
	def expand(self, text):
		stack = []
		i = 0
		n = len(text)
		while i < n:
			start = i
			i = spprog.search(text, i)
			if i < 0:
				self.write(text[start:])
				break
			self.write(text[start:i])
			c = text[i]
			i = i+1
			if c == '\n':
				if self.nofill > 0:
					self.write('<P>\n')
				else:
					self.write('\n')
				continue
			if c == '<':
				self.write('&lt;')
				continue
			if c == '>':
				self.write('&gt;')
				continue
			if c == '&':
				self.write('&amp;')
				continue
			if c == '{':
				stack.append('')
				continue
			if c == '}':
				if not stack:
					print '*** Unmatched }'
					self.write('}')
					continue
				cmd = stack[-1]
				del stack[-1]
				try:
					method = getattr(self, 'close_' + cmd)
				except AttributeError:
					self.unknown_close(cmd)
					continue
				method()
				continue
			if c <> '@':
				# Cannot happen unless spprog is changed
				raise RuntimeError, 'unexpected funny '+`c`
			start = i
			while i < n and text[i] in string.letters: i = i+1
			if i == start:
				# @ plus non-letter: literal next character
				i = i+1
				c = text[start:i]
				if c == ':':
					# `@:' means no extra space after
					# preceding `.', `?', `!' or `:'
					pass
				else:
					# `@.' means a sentence-ending period;
					# `@@', `@{', `@}' quote `@', `{', `}'
					self.write(c)
				continue
			cmd = text[start:i]
			if i < n and text[i] == '{':
				i = i+1
				stack.append(cmd)
				try:
					method = getattr(self, 'open_' + cmd)
				except AttributeError:
					self.unknown_open(cmd)
					continue
				method()
				continue
			try:
				method = getattr(self, 'handle_' + cmd)
			except AttributeError:
				self.unknown_handle(cmd)
				continue
			method()
		if stack:
			print '*** Stack not empty at para:', stack

	# --- Handle unknown embedded @-commands ---

	def unknown_open(self, cmd):
		print '*** No open func for @' + cmd + '{...}'
		cmd = cmd + '{'
		self.write('@', cmd)
		if not self.unknown.has_key(cmd):
			self.unknown[cmd] = 1
		else:
			self.unknown[cmd] = self.unknown[cmd] + 1

	def unknown_close(self, cmd):
		print '*** No close func for @' + cmd + '{...}'
		cmd = '}' + cmd
		self.write('}')
		if not self.unknown.has_key(cmd):
			self.unknown[cmd] = 1
		else:
			self.unknown[cmd] = self.unknown[cmd] + 1

	def unknown_handle(self, cmd):
		print '*** No handler for @' + cmd
		self.write('@', cmd)
		if not self.unknown.has_key(cmd):
			self.unknown[cmd] = 1
		else:
			self.unknown[cmd] = self.unknown[cmd] + 1

	# XXX The following sections should be ordered as the texinfo docs

	# --- Embedded @-commands without {} argument list --

	def handle_noindent(self): pass

	def handle_refill(self): pass

	# --- Include file handling ---

	def do_include(self, args):
		file = args
		file = os.path.join(self.includedir, file)
		try:
			fp = open(file, 'r')
		except IOError, msg:
			print '*** Can\'t open include file', `file`
			return
		if self.debugging:
			print '--> file', `file`
		save_done = self.done
		save_skip = self.skip
		save_stack = self.stack
		self.includedepth = self.includedepth + 1
		self.parserest(fp, 0)
		self.includedepth = self.includedepth - 1
		fp.close()
		self.done = save_done
		self.skip = save_skip
		self.stack = save_stack
		if self.debugging:
			print '<-- file', `file`

	# --- Special Insertions ---

	def open_dmn(self): pass
	def close_dmn(self): pass

	def open_dots(self): self.write('...')
	def close_dots(self): pass

	def open_bullet(self): pass
	def close_bullet(self): pass

	def open_TeX(self): self.write('TeX')
	def close_TeX(self): pass

	def handle_copyright(self): self.write('(C)')
	def open_copyright(self): self.write('(C)')
	def close_copyright(self): pass
		
	def open_minus(self): self.write('-')
	def close_minus(self): pass

	# --- Special Glyphs for Examples ---

	def open_result(self): self.write('=&gt;')
	def close_result(self): pass

	def open_expansion(self): self.write('==&gt;')
	def close_expansion(self): pass

	def open_print(self): self.write('-|')
	def close_print(self): pass

	def open_error(self): self.write('error--&gt;')
	def close_error(self): pass

	def open_equiv(self): self.write('==')
	def close_equiv(self): pass

	def open_point(self): self.write('-!-')
	def close_point(self): pass

	# --- Cross References ---

	def open_pxref(self):
		self.write('see ')
		self.startsaving()
	def close_pxref(self):
		self.makeref()

	def open_xref(self):
		self.write('See ')
		self.startsaving()
	def close_xref(self):
		self.makeref()

	def open_ref(self):
		self.startsaving()
	def close_ref(self):
		self.makeref()

	def open_inforef(self):
		self.write('See info file ')
		self.startsaving()
	def close_inforef(self):
		text = self.collectsavings()
		args = string.splitfields(text, ',')
		n = len(args)
		for i in range(n):
			args[i] = string.strip(args[i])
		while len(args) < 3: args.append('')
		node = args[0]
		file = args[2]
		self.write('`', file, '\', node `', node, '\'')

	def makeref(self):
		text = self.collectsavings()
		args = string.splitfields(text, ',')
		n = len(args)
		for i in range(n):
			args[i] = string.strip(args[i])
		while len(args) < 5: args.append('')
		nodename = label = args[0]
		if args[2]: label = args[2]
		file = args[3]
		title = args[4]
		href = makefile(nodename)
		if file:
			href = '../' + file + '/' + href
		self.write('<A HREF="', href, '">', label, '</A>')

	# --- Marking Words and Phrases ---

	# --- Other @xxx{...} commands ---

	def open_(self): pass # Used by {text enclosed in braces}
	def close_(self): pass

	open_asis = open_
	close_asis = close_

	def open_cite(self): self.write('<CITE>')
	def close_cite(self): self.write('</CITE>')

	def open_code(self): self.write('<CODE>')
	def close_code(self): self.write('</CODE>')

	open_t = open_code
	close_t = close_code

	def open_dfn(self): self.write('<DFN>')
	def close_dfn(self): self.write('</DFN>')

	def open_emph(self): self.write('<EM>')
	def close_emph(self): self.write('</EM>')

	open_i = open_emph
	close_i = close_emph

	def open_footnote(self):
		# if self.savetext <> None:
		# 	print '*** Recursive footnote -- expect weirdness'
		id = len(self.footnotes) + 1
		self.write('<A NAME="footnoteref', `id`, \
			'" HREF="#footnotetext', `id`, '">(', `id`, ')</A>')
		# self.savetext = ''
		self.startsaving ()

	def close_footnote(self):
		id = len(self.footnotes) + 1
		# self.footnotes.append(`id`, self.savetext)
		self.footnotes.append(`id`, self.collectsavings())
		# self.savetext = None

	def writefootnotes(self):
		self.write('\n<HR NOSHADE SIZE=1 WIDTH=200>\n'
			   '<STRONG><EM>Footnotes</EM></STRONG>\n<P>')
		for id, text in self.footnotes:
			self.write('<A NAME="footnotetext', id, \
				'" HREF="#footnoteref', id, '">(', \
				id, ')</A>\n', text, '<P>\n')
		self.footnotes = []

	def open_file(self): self.write('<CODE>')
	def close_file(self): self.write('</CODE>')

	def open_kbd(self): self.write('<KBD>')
	def close_kbd(self): self.write('</KBD>')

	def open_key(self): self.write('<KEY>')
	def close_key(self): self.write('</KEY>')

	def open_r(self): self.write('<R>')
	def close_r(self): self.write('</R>')

	def open_samp(self): self.write('`<SAMP>')
	def close_samp(self): self.write('</SAMP>\'')

	def open_sc(self): self.write('<SMALLCAPS>')
	def close_sc(self): self.write('</SMALLCAPS>')

	def open_strong(self): self.write('<B>')
	def close_strong(self): self.write('</B>')

	open_b = open_strong
	close_b = close_strong

	def open_var(self): self.write('<VAR>')
	def close_var(self): self.write('</VAR>')

	def open_w(self): self.write('<NOBREAK>')
	def close_w(self): self.write('</NOBREAK>')

	open_titlefont = open_
	close_titlefont = close_

	def open_small(self): pass
	def close_small(self): pass
	
	def command(self, line):
		a, b = cmprog.regs[1]
		cmd = line[a:b]
		args = string.strip(line[b:])
		if self.debugging > 1:
			print self.skip, self.stack, '@' + cmd, args
		try:
			func = getattr(self, 'do_' + cmd)
		except AttributeError:
			try:
				func = getattr(self, 'bgn_' + cmd)
			except AttributeError:
				# don't complain if we are skipping anyway
				if not self.skip:
					self.unknown_cmd(cmd, args)
				return
			self.stack.append(cmd)
			func(args)
			return
		if not self.skip or cmd == 'end':
			func(args)

	def unknown_cmd(self, cmd, args):
		print '*** unknown', '@' + cmd, args
		if not self.unknown.has_key(cmd):
			self.unknown[cmd] = 1
		else:
			self.unknown[cmd] = self.unknown[cmd] + 1

	def do_end(self, args):
		words = string.split(args)
		if not words:
			print '*** @end w/o args'
		else:
			cmd = words[0]
			if not self.stack or self.stack[-1] <> cmd:
				print '*** @end', cmd, 'unexpected'
			else:
				del self.stack[-1]
			try:
				func = getattr(self, 'end_' + cmd)
			except AttributeError:
				self.unknown_end(cmd)
				return
			func()

	def unknown_end(self, cmd):
		cmd = 'end ' + cmd
		print '*** unknown', '@' + cmd
		if not self.unknown.has_key(cmd):
			self.unknown[cmd] = 1
		else:
			self.unknown[cmd] = self.unknown[cmd] + 1

	# --- Comments ---

	def do_comment(self, args): pass
	do_c = do_comment

	# --- Conditional processing ---

	def bgn_ifinfo(self, args): pass
	def end_ifinfo(self): pass

	def bgn_iftex(self, args): self.skip = self.skip + 1
	def end_iftex(self): self.skip = self.skip - 1

	def bgn_ignore(self, args): self.skip = self.skip + 1
	def end_ignore(self): self.skip = self.skip - 1

	def bgn_tex(self, args): self.skip = self.skip + 1
	def end_tex(self): self.skip = self.skip - 1

	def do_set(self, args):
		fields = string.splitfields (args, ' ')
		key = fields[0]
		if len(fields) == 1:
			value = 1
		else:
			value = string.joinfields (fields[1:], ' ')
		self.values[key]=value
		print self.values
			
	def do_clear(self, args):
		self.values[args] = None
			
	def bgn_ifset(self, args):
		if args not in self.values.keys() \
		   or self.values[args] is None:
			self.skip = self.skip + 1
			self.stackinfo[len(self.stack)] = 1
		else:
			self.stackinfo[len(self.stack)] = 0
	def end_ifset(self):
		print self.stack
		print self.stackinfo
		if self.stackinfo[len(self.stack) + 1]:
			self.skip = self.skip - 1
		del self.stackinfo[len(self.stack) + 1]

	def bgn_ifclear(self, args):
		if args in self.values.keys() \
		   and self.values[args] is not None:
			self.skip = self.skip + 1
			self.stackinfo[len(self.stack)] = 1
		else:
			self.stackinfo[len(self.stack)] = 0
		
	end_ifclear = end_ifset

	def open_value(self):
		self.startsaving()

	def close_value(self):
		key = self.collectsavings ()
		if key in self.values.keys():
			self.write (self.values[key])
		else:
			print '*** Undefined value: ', key
		       
	# --- Beginning a file ---

	do_finalout = do_comment
	do_setchapternewpage = do_comment
	do_setfilename = do_comment

	def do_settitle(self, args):
		print args
		self.startsaving()
		self.expand (args)
		self.title = self.collectsavings ()
		print self.title
	def do_parskip(self, args): pass
	
	# --- Ending a file ---

	def do_bye(self, args):
		self.endnode ()
		self.done = 1

	# --- Title page ---

	def bgn_titlepage(self, args): self.skip = self.skip + 1
	def end_titlepage(self): self.skip = self.skip - 1
	def do_shorttitlepage(self, args): pass
	
	def do_center(self, args):
		# Actually not used outside title page...
		self.write('<H1>')
		self.expand (args)
		self.write ('</H1>\n')
	do_title = do_center
	do_subtitle = do_center
	do_author = do_center

	do_vskip = do_comment
	do_vfill = do_comment
	do_smallbook = do_comment

	do_paragraphindent = do_comment
	do_setchapternewpage = do_comment
	do_headings = do_comment
	do_footnotestyle = do_comment

	do_evenheading = do_comment
	do_evenfooting = do_comment
	do_oddheading = do_comment
	do_oddfooting = do_comment
	do_everyheading = do_comment
	do_everyfooting = do_comment

	# --- Nodes ---

	def do_node(self, args):
		self.endnode()
		self.nodelineno = 0
		parts = string.splitfields(args, ',')
		while len(parts) < 4: parts.append('')
		for i in range(4): parts[i] = string.strip(parts[i])
		self.nodelinks = parts
		[name, next, prev, up] = parts[:4]
		file = self.dirname + '/' + makefile(name)
		if self.filenames.has_key(file):
			print '*** Filename already in use: ', file
		else:
			if self.debugging: print '--- writing', file
		self.filenames[file] = 1
		# self.nodefp = open(file, 'w')
		self.nodename = name
		if self.cont and self.nodestack:
		    self.nodestack[-1].cont = self.nodename
		if not self.topname: self.topname = name
		title = name
		if self.title: title = title + ' -- ' + self.title
		self.node = Node (self.dirname, self.nodename, self.topname, \
				  title, next, prev, up)
		
	def link(self, label, nodename):
		if nodename:
			if string.lower(nodename) == '(dir)':
				addr = '../dir.html'
			else:
				addr = makefile(nodename)
			self.write(label, ': <A HREF="', addr, '" TYPE="', \
				label, '">', nodename, '</A>  \n')

	# --- Sectioning commands ---

	def popstack (self, type):
	    if (self.node):
		self.node.type = type
		while self.nodestack:
		    if self.nodestack[-1].type > type:
			self.nodestack[-1].finalize ()
			self.nodestack[-1].flush ()
			del self.nodestack [-1]
		    elif self.nodestack[-1].type == type:
			if not self.nodestack[-1].next:
			    self.nodestack[-1].next = self.node.name
			if not self.node.prev:
			    self.node.prev = self.nodestack[-1].name
			self.nodestack[-1].finalize ()
			self.nodestack[-1].flush ()
			del self.nodestack [-1]
		    else:
			if type > 1 and not self.node.up:
			    self.node.up = self.nodestack[-1].name
			break

	def do_chapter(self, args):
		self.heading('H1', args, 0)
		self.popstack (1)

	def do_unnumbered(self, args):
		self.heading('H1', args, -1)
		self.popstack (1)
	def do_appendix(self, args):
		self.heading('H1', args, -1)
		self.popstack (1)
	def do_top(self, args):
		self.heading('H1', args, -1)
	def do_chapheading(self, args):
		self.heading('H1', args, -1)
	def do_majorheading(self, args):
		self.heading('H1', args, -1)

	def do_section(self, args):
		self.heading('H1', args, 1)
		self.popstack (2)

	def do_unnumberedsec(self, args):
		self.heading('H1', args, -1)
		self.popstack (2)
	def do_appendixsec(self, args):
		self.heading('H1', args, -1)
		self.popstack (2)
	do_appendixsection = do_appendixsec
	def do_heading(self, args):
		self.heading('H1', args, -1)

	def do_subsection(self, args):
		self.heading('H2', args, 2)
		self.popstack (3)
	def do_unnumberedsubsec(self, args):
		self.heading('H2', args, -1)
		self.popstack (3)
	def do_appendixsubsec(self, args):
		self.heading('H2', args, -1)
		self.popstack (3)
	def do_subheading(self, args):
		self.heading('H2', args, -1)

	def do_subsubsection(self, args):
		self.heading('H3', args, 3)
		self.popstack (4)
	def do_unnumberedsubsubsec(self, args):
		self.heading('H3', args, -1)
		self.popstack (4)
	def do_appendixsubsubsec(self, args):
		self.heading('H3', args, -1)
		self.popstack (4)
	def do_subsubheading(self, args):
		self.heading('H3', args, -1)

	def heading(self, type, args, level):
		if level >= 0:
			while len(self.numbering) <= level:
				self.numbering.append(0)
			del self.numbering[level+1:]
			self.numbering[level] = self.numbering[level] + 1
			x = ''
			for i in self.numbering:
				x = x + `i` + '.'
			args = x + ' ' + args
			self.contents.append(level, args, self.nodename)
		self.write('<', type, '>')
		self.expand(args)
		self.write('</', type, '>\n')
		if self.debugging:
			print '---', args

	def do_contents(self, args):
	        # pass
		self.listcontents('Table of Contents', 999)

	def do_shortcontents(self, args):
		pass
		# self.listcontents('Short Contents', 0)
	do_summarycontents = do_shortcontents

	def listcontents(self, title, maxlevel):
		self.write('<H1>', title, '</H1>\n<UL COMPACT PLAIN>\n')
		prevlevels = [0]
		for level, title, node in self.contents:
			if level > maxlevel:
				continue
			if level > prevlevels[-1]:
				# can only advance one level at a time
				self.write('  '*prevlevels[-1], '<UL PLAIN>\n')
				prevlevels.append(level)
			elif level < prevlevels[-1]:
				# might drop back multiple levels
				while level < prevlevels[-1]:
					del prevlevels[-1]
					self.write('  '*prevlevels[-1],
						   '</UL>\n')
			self.write('  '*level, '<LI> <A HREF="',
				   makefile(node), '">')
			self.expand(title)
			self.write('</A>\n')
		self.write('</UL>\n' * len(prevlevels))

	# --- Page lay-out ---

	# These commands are only meaningful in printed text

	def do_page(self, args): pass

	def do_need(self, args): pass

	def bgn_group(self, args): pass
	def end_group(self): pass

	# --- Line lay-out ---

	def do_sp(self, args):
		# Insert <args> blank lines
		if args:
			try:
				n = string.atoi(args)
			except string.atoi_error:
				n = 1
		else:
			n = 1
		self.write('<P>\n'*max(n, 0))

	def do_hline(self, args):
		self.write ('<HR>')
	
	# --- Function and variable definitions ---

	def bgn_deffn(self, args):
		self.write('<DL>')
		self.do_deffnx (args)

	def end_deffn(self):
		self.write('</DL>\n')

	def do_deffnx(self, args):
		self.write('<DT>')
		words = splitwords(args, 2)
		[category, name], rest = words[:2], words[2:]
		self.expand('@b{' + name + '}')
		for word in rest: self.expand(' ' + makevar(word))
		self.expand(' -- ' + category)
		self.write('<DD>\n')
		self.index('fn', name)

	def bgn_defun(self, args): self.bgn_deffn('Function ' + args)
	end_defun = end_deffn
	def do_defunx(self, args): self.do_deffnx('Function ' + args)

	def bgn_defmac(self, args): self.bgn_deffn('Macro ' + args)
	end_defmac = end_deffn
	def do_defmacx(self, args): self.do_deffnx('Macro ' + args)

	def bgn_defspec(self, args): self.bgn_deffn('{Special Form} ' + args)
	end_defspec = end_deffn
	def do_defspecx(self, args): self.do_deffnx('{Special Form} ' + args)

	def bgn_defvr(self, args):
		self.write('<DL>')
		self.do_defvrx (args)

	end_defvr = end_deffn

	def do_defvrx(self, args):
		self.write('<DT>')
		words = splitwords(args, 2)
		[category, name], rest = words[:2], words[2:]
		self.expand('@code{' + name + '}')
		# If there are too many arguments, show them
		for word in rest: self.expand(' ' + word)
		self.expand(' -- ' + category)
		self.write('<DD>\n')
		self.index('vr', name)

	def bgn_defvar(self, args): self.bgn_defvr('Variable ' + args)
	end_defvar = end_defvr
	def do_defvarx(self, args): self.do_defvrx('Variable ' + args)

	def bgn_defopt(self, args): self.bgn_defvr('{User Option} ' + args)
	end_defopt = end_defvr
	def do_defoptx(self, args): self.do_defvrx('{User Option} ' + args)

	# --- Ditto for typed languages ---

	def bgn_deftypefn(self, args):
		self.write('<DL>')
		self.do_deftypefnx (args)
	
	end_deftypefn = end_deffn

	def do_deftypefnx(self, args):
		self.write('<DT>')
		words = splitwords(args, 3)
		[category, datatype, name], rest = words[:3], words[3:]
		self.expand('@code{' + datatype + '} @b{' + name + '}')
		for word in rest: self.expand(' ' + makevar(word))
		self.expand(' -- ' + category)
		self.write('<DD>\n')
		self.index('fn', name)


	def bgn_deftypefun(self, args): self.bgn_deftypefn('Function ' + args)
	end_deftypefun = end_deftypefn
	def do_deftypefunx(self, args): self.do_deftypefnx('Function ' + args)

	def bgn_deftypevr(self, args):
		self.write('<DL>')
		self.do_deftypevrx (args)
	
	end_deftypevr = end_deftypefn

	def do_deftypevrx(self, args):
		self.write('<DT>')
		words = splitwords(args, 3)
		[category, datatype, name], rest = words[:3], words[3:]
		self.expand('@code{' + datatype + '} @b{' + name + '}')
		# If there are too many arguments, show them
		for word in rest: self.expand(' ' + word)
		self.expand(' -- ' + category)
		self.write('<DD>\n')
		self.index('fn', name)

	def bgn_deftypevar(self, args):
		self.bgn_deftypevr('Variable ' + args)
	end_deftypevar = end_deftypevr
	def do_deftypevarx(self, args):
		self.do_deftypevrx('Variable ' + args)

	# --- Ditto for object-oriented languages ---

	def bgn_defcv(self, args):
		self.write('<DL>')
		self.do_defcvx(args)

	end_defcv = end_deftypevr

	def do_defcvx(self, args):
		self.write('<DT>')
		words = splitwords(args, 3)
		[category, classname, name], rest = words[:3], words[3:]
		self.expand('@b{' + name + '}')
		# If there are too many arguments, show them
		for word in rest: self.expand(' ' + word)
		self.expand(' -- ' + category + ' of ' + classname)
		self.write('<DD>\n')
		self.index('vr', name + ' @r{of ' + classname + '}')

	def bgn_defivar(self, args):
		self.bgn_defcv('{Instance Variable} ' + args)
	end_defivar = end_defcv
	def do_defivarx(self, args):
		self.do_defcvx('{Instance Variable} ' + args)

	def bgn_defop(self, args):
		self.write('<DL>')
		self.do_defopx (args)

	end_defop = end_defcv

	def do_defopx(self, args):
		self.write('<DT>')
		words = splitwords(args, 3)
		[category, classname, name], rest = words[:3], words[3:]
		self.expand('@b{' + name + '}')
		for word in rest: self.expand(' ' + makevar(word))
		self.expand(' -- ' + category + ' on ' + classname)
		self.write('<DD>\n')
		self.index('fn', name + ' @r{on ' + classname + '}')

	def bgn_defmethod(self, args):
		self.bgn_defop('Method ' + args)
	end_defmethod = end_defop
	def do_defmethodx(self, args):
		self.do_defopx('Method ' + args)

	# --- Ditto for data types ---

	def bgn_deftp(self, args):
		self.write('<DL>')
		self.do_deftpx(args)

	end_deftp = end_defcv

	def do_deftpx(self, args):
		self.write('<DT>')
		words = splitwords(args, 2)
		[category, name], rest = words[:2], words[2:]
		self.expand('@b{' + name + '}')
		for word in rest: self.expand(' ' + word)
		self.expand(' -- ' + category)
		self.write('<DD>\n')
		self.index('tp', name)

	# --- Making Lists and Tables

	def bgn_enumerate(self, args):
		if not args:
			self.write('<OL>\n')
			self.stackinfo[len(self.stack)] = '</OL>\n'
		else:
			self.itemnumber = args
			self.write('<UL>\n')
			self.stackinfo[len(self.stack)] = '</UL>\n'
	def end_enumerate(self):
		self.itemnumber = None
		self.write(self.stackinfo[len(self.stack) + 1])
		del self.stackinfo[len(self.stack) + 1]

	def bgn_itemize(self, args):
		self.itemarg = args
		self.write('<UL>\n')
	def end_itemize(self):
		self.itemarg = None
		self.write('</UL>\n')

	def bgn_table(self, args):
		self.itemarg = args
		self.write('<DL>\n')
	def end_table(self):
		self.itemarg = None
		self.write('</DL>\n')

	def bgn_ftable(self, args):
		self.itemindex = 'fn'
		self.bgn_table(args)
	def end_ftable(self):
		self.itemindex = None
		self.end_table()

	def do_item(self, args):
		if self.itemindex: self.index(self.itemindex, args)
		if self.itemarg:
			if self.itemarg[0] == '@' and self.itemarg[1:2] and \
					self.itemarg[1] in string.letters:
				args = self.itemarg + '{' + args + '}'
			else:
				# some other character, e.g. '-'
				args = self.itemarg + ' ' + args
		if self.itemnumber <> None:
			args = self.itemnumber + '. ' + args
			self.itemnumber = increment(self.itemnumber)
		if self.stack and self.stack[-1] == 'table':
			self.write('<DT>')
			self.expand(args)
			self.write('<DD>')
		else:
			self.write('<LI>')
			self.expand(args)
			self.write('  ')
	do_itemx = do_item # XXX Should suppress leading blank line

	# --- Enumerations, displays, quotations ---
	# XXX Most of these should increase the indentation somehow

	def bgn_quotation(self, args): self.write('<BLOCKQUOTE>')
	def end_quotation(self): self.write('</BLOCKQUOTE>\n')

	def bgn_example(self, args):
		self.nofill = self.nofill + 1
		self.write('<PRE>')
	def end_example(self):
		self.write('</PRE>')
		self.nofill = self.nofill - 1

	bgn_lisp = bgn_example # Synonym when contents are executable lisp code
	end_lisp = end_example

	bgn_smallexample = bgn_example # XXX Should use smaller font
	end_smallexample = end_example

	bgn_smalllisp = bgn_lisp # Ditto
	end_smalllisp = end_lisp

	bgn_display = bgn_example
	end_display = end_example

	bgn_format = bgn_display
	end_format = end_display

	def do_exdent(self, args): self.expand(args + '\n')
	# XXX Should really mess with indentation

	def bgn_flushleft(self, args):
		self.nofill = self.nofill + 1
		self.write('<PRE>\n')
	def end_flushleft(self):
		self.write('</PRE>\n')
		self.nofill = self.nofill - 1

	def bgn_flushright(self, args):
		self.nofill = self.nofill + 1
		self.write('<ADDRESS COMPACT>\n')
	def end_flushright(self):
		self.write('</ADDRESS>\n')
		self.nofill = self.nofill - 1

	def bgn_menu(self, args):
		self.write('<DIR>\n')
		self.write('  <STRONG><EM>Menu</EM></STRONG><P>\n')
	def end_menu(self): self.write('</DIR>\n')

	def bgn_cartouche(self, args): pass
	def end_cartouche(self): pass

	# --- Indices ---

	def resetindex(self):
		self.noncodeindices = ['cp']
		self.indextitle = {}
		self.indextitle['cp'] = 'Concept'
		self.indextitle['fn'] = 'Function'
		self.indextitle['ky'] = 'Keyword'
		self.indextitle['pg'] = 'Program'
		self.indextitle['tp'] = 'Type'
		self.indextitle['vr'] = 'Variable'
		#
		self.whichindex = {}
		for name in self.indextitle.keys():
			self.whichindex[name] = []

	def user_index(self, name, args):
		if self.whichindex.has_key(name):
			self.index(name, args)
		else:
			print '*** No index named', `name`

	def do_cindex(self, args): self.index('cp', args)
	def do_findex(self, args): self.index('fn', args)
	def do_kindex(self, args): self.index('ky', args)
	def do_pindex(self, args): self.index('pg', args)
	def do_tindex(self, args): self.index('tp', args)
	def do_vindex(self, args): self.index('vr', args)

	def index(self, name, args):
		self.whichindex[name].append(args, self.nodename)

	def do_synindex(self, args):
		words = string.split(args)
		if len(words) <> 2:
			print '*** bad @synindex', args
			return
		[old, new] = words
		if not self.whichindex.has_key(old) or \
			  not self.whichindex.has_key(new):
			print '*** bad key(s) in @synindex', args
			return
		if old <> new and \
			  self.whichindex[old] is not self.whichindex[new]:
			inew = self.whichindex[new]
			inew[len(inew):] = self.whichindex[old]
			self.whichindex[old] = inew
	do_syncodeindex = do_synindex # XXX Should use code font

	def do_printindex(self, args):
		words = string.split(args)
		for name in words:
			if self.whichindex.has_key(name):
				self.prindex(name)
			else:
				print '*** No index named', `name`

	def prindex(self, name):
		iscodeindex = (name not in self.noncodeindices)
		index = self.whichindex[name]
		if not index: return
		if self.debugging:
			print '--- Generating', self.indextitle[name], 'index'
		#  The node already provides a title
		index1 = []
		junkprog = regex.compile('^\(@[a-z]+\)?{')
		for key, node in index:
			sortkey = string.lower(key)
			# Remove leading `@cmd{' from sort key
			# -- don't bother about the matching `}'
			oldsortkey = sortkey
			while 1:
				i = junkprog.match(sortkey)
				if i < 0: break
				sortkey = sortkey[i:]
			index1.append(sortkey, key, node)
		del index[:]
		index1.sort()
		self.write('<DL COMPACT>\n')
		prevkey = prevnode = None
		for sortkey, key, node in index1:
			if (key, node) == (prevkey, prevnode):
				continue
			if self.debugging > 1: print key, ':', node
			self.write('<DT>')
			if iscodeindex: key = '@code{' + key + '}'
			if key != prevkey:
				self.expand(key)
			self.write('<DD><A HREF="', makefile(node), \
				   '">', node, '</A>\n')
			prevkey, prevnode = key, node
		self.write('</DL>\n')

	# --- Final error reports ---

	def report(self):
		if self.unknown:
			print '--- Unrecognized commands ---'
			cmds = self.unknown.keys()
			cmds.sort()
			for cmd in cmds:
				print string.ljust(cmd, 20), self.unknown[cmd]


# Put @var{} around alphabetic substrings
def makevar(str):
	return '@var{'+str+'}'


# Split a string in "words" according to findwordend
def splitwords(str, minlength):
	words = []
	i = 0
	n = len(str)
	while i < n:
		while i < n and str[i] in ' \t\n': i = i+1
		if i >= n: break
		start = i
		i = findwordend(str, i, n)
		words.append(str[start:i])
	while len(words) < minlength: words.append('')
	return words


# Find the end of a "word", matching braces and interpreting @@ @{ @}
fwprog = regex.compile('[@{} ]')
def findwordend(str, i, n):
	level = 0
	while i < n:
		i = fwprog.search(str, i)
		if i < 0: break
		c = str[i]; i = i+1
		if c == '@': i = i+1 # Next character is not special
		elif c == '{': level = level+1
		elif c == '}': level = level-1
		elif c == ' ' and level <= 0: return i-1
	return n


# Convert a node name into a file name
def makefile(nodename):
	return fixfunnychars(nodename) + '.html'


# Characters that are perfectly safe in filenames and hyperlinks
goodchars = string.letters + string.digits + '!@-=+.'

# Replace characters that aren't perfectly safe by dashes
# Underscores are bad since Cern HTTPD treats them as delimiters for
# encoding times, so you get mismatches if you compress your files:
# a.html.gz will map to a_b.html.gz
def fixfunnychars(addr):
	i = 0
	while i < len(addr):
		c = addr[i]
		if c not in goodchars:
			c = '-'
			addr = addr[:i] + c + addr[i+1:]
		i = i + len(c)
	return addr


# Increment a string used as an enumeration
def increment(s):
	if not s:
		return '1'
	for sequence in string.digits, string.lowercase, string.uppercase:
		lastc = s[-1]
		if lastc in sequence:
			i = string.index(sequence, lastc) + 1
			if i >= len(sequence):
				if len(s) == 1:
					s = sequence[0]*2
					if s == '00':
						s = '10'
				else:
					s = increment(s[:-1]) + sequence[0]
			else:
				s = s[:-1] + sequence[i]
			return s
	return s # Don't increment


def test():
	import sys
	parser = TexinfoParser()
	while sys.argv[1:2] == ['-d']:
		parser.debugging = parser.debugging + 1
		del sys.argv[1:2]
	if sys.argv[1] == '-c':
	    parser.cont = 1
	    del sys.argv[1]
	if len(sys.argv) <> 3:
		print 'usage: texi2html [-d] [-d] [-c] inputfile outputdirectory'
		sys.exit(2)
	file = sys.argv[1]
	parser.setdirname(sys.argv[2])
	if file == '-':
		fp = sys.stdin
	else:
		parser.setincludedir(os.path.dirname(file))
		try:
			fp = open(file, 'r')
		except IOError, msg:
			print file, ':', msg
			sys.exit(1)
	parser.parse(fp)
	fp.close()
	parser.report()


test()

# Emacs local variables
# 
# Local Variables:
# py-indent-offset: 8
# End:
