import regex
import regsub
import string
import sys
from types import StringType


AS_IS = None


class NullFormatter:

    def __init__(self, writer=None):
	if not writer:
	    writer = NullWriter()
	self.writer = writer
    def end_paragraph(self, blankline): pass
    def add_line_break(self): pass
    def add_hor_rule(self, *args, **kw): pass
    def add_label_data(self, format, counter, blankline=None): pass
    def add_flowing_data(self, data): pass
    def add_literal_data(self, data): pass
    def flush_softspace(self): pass
    def push_alignment(self, align): pass
    def pop_alignment(self): pass
    def push_font(self, x): pass
    def pop_font(self): pass
    def push_margin(self, margin): pass
    def pop_margin(self): pass
    def set_spacing(self, spacing): pass
    def push_style(self, *styles): pass
    def pop_style(self, n=1): pass
    def assert_line_data(self, flag=1): pass


class AbstractFormatter:

    #  Space handling policy:  blank spaces at the boundary between elements
    #  are handled by the outermost context.  "Literal" data is not checked
    #  to determine context, so spaces in literal data are handled directly
    #  in all circumstances.

    def __init__(self, writer):
	self.writer = writer		# Output device
	self.align = None		# Current alignment
	self.align_stack = []		# Alignment stack
	self.font_stack = []		# Font state
	self.margin_stack = []		# Margin state
	self.spacing = None		# Vertical spacing state
	self.style_stack = []		# Other state, e.g. color
	self.nospace = 1		# Should leading space be suppressed
	self.softspace = 0		# Should a space be inserted
	self.para_end = 1		# Just ended a paragraph
	self.parskip = 0		# Skipped space between paragraphs?
	self.hard_break = 1		# Have a hard break
	self.have_label = 0

    def end_paragraph(self, blankline):
	if not self.hard_break:
	    self.writer.send_line_break()
	    self.have_label = 0
	if self.parskip < blankline and not self.have_label:
	    self.writer.send_paragraph(blankline - self.parskip)
	    self.parskip = blankline
	    self.have_label = 0
	self.hard_break = self.nospace = self.para_end = 1
	self.softspace = 0

    def add_line_break(self):
	if not (self.hard_break or self.para_end):
	    self.writer.send_line_break()
	    self.have_label = self.parskip = 0
	self.hard_break = self.nospace = 1
	self.softspace = 0

    def add_hor_rule(self, *args, **kw):
	if not self.hard_break:
	    self.writer.send_line_break()
	apply(self.writer.send_hor_rule, args, kw)
	self.hard_break = self.nospace = 1
	self.have_label = self.para_end = self.softspace = self.parskip = 0

    def add_label_data(self, format, counter, blankline = None):
	if self.have_label or not self.hard_break:
	    self.writer.send_line_break()
	if not self.para_end:
	    self.writer.send_paragraph((blankline and 1) or 0)
	if type(format) is StringType:
	    self.writer.send_label_data(self.format_counter(format, counter))
	else:
	    self.writer.send_label_data(format)
	self.nospace = self.have_label = self.hard_break = self.para_end = 1
	self.softspace = self.parskip = 0

    def format_counter(self, format, counter):
        label = ''
        for c in format:
            try:
                if c == '1':
		    label = label + ('%d' % counter)
                elif c in 'aA':
		    if counter > 0:
			label = label + self.format_letter(c, counter)
                elif c in 'iI':
		    if counter > 0:
			label = label + self.format_roman(c, counter)
		else:
		    label = label + c
            except:
                label = label + c
        return label

    def format_letter(self, case, counter):
	label = ''
	while counter > 0:
	    counter, x = divmod(counter-1, 26)
	    s = chr(ord(case) + x)
	    label = s + label
	return label

    def format_roman(self, case, counter):
        ones = ['i', 'x', 'c', 'm']
        fives = ['v', 'l', 'd']
        label, index = '', 0
	# This will die of IndexError when counter is too big
        while counter > 0:
            counter, x = divmod(counter, 10)
            if x == 9:
                label = ones[index] + ones[index+1] + label
            elif x == 4:
                label = ones[index] + fives[index] + label
            else:
                if x >= 5:
                    s = fives[index]
                    x = x-5
                else:
                    s = ''
                s = s + ones[index]*x
		label = s + label
            index = index + 1
        if case == 'I':
	    return string.upper(label)
        return label

    def add_flowing_data(self, data,
			 # These are only here to load them into locals:
			 whitespace = string.whitespace,
			 join = string.join, split = string.split):
	if not data: return
	# The following looks a bit convoluted but is a great improvement over
	# data = regsub.gsub('[' + string.whitespace + ']+', ' ', data)
	prespace = data[:1] in whitespace
	postspace = data[-1:] in whitespace
	data = join(split(data))
	if self.nospace and not data:
	    return
	elif prespace or self.softspace:
	    if not data:
		if not self.nospace:
		    self.softspace = 1
		    self.parskip = 0
		return
	    if not self.nospace:
		data = ' ' + data
	self.hard_break = self.nospace = self.para_end = \
			  self.parskip = self.have_label = 0
	self.softspace = postspace
	self.writer.send_flowing_data(data)

    def add_literal_data(self, data):
	if not data: return
	if self.softspace:
	    self.writer.send_flowing_data(" ")
	self.hard_break = data[-1:] == '\n'
	self.nospace = self.para_end = self.softspace = \
		       self.parskip = self.have_label = 0
	self.writer.send_literal_data(data)

    def flush_softspace(self):
	if self.softspace:
	    self.hard_break = self.para_end = self.parskip = \
			      self.have_label = self.softspace = 0
	    self.nospace = 1
	    self.writer.send_flowing_data(' ')

    def push_alignment(self, align):
	if align and align != self.align:
	    self.writer.new_alignment(align)
	    self.align = align
	    self.align_stack.append(align)
	else:
	    self.align_stack.append(self.align)

    def pop_alignment(self):
	if self.align_stack:
	    del self.align_stack[-1]
	if self.align_stack:
	    self.align = align = self.align_stack[-1]
	    self.writer.new_alignment(align)
	else:
	    self.align = None
	    self.writer.new_alignment(None)

    def push_font(self, (size, i, b, tt)):
	if self.softspace:
	    self.hard_break = self.para_end = self.softspace = 0
	    self.nospace = 1
	    self.writer.send_flowing_data(' ')
	if self.font_stack:
	    csize, ci, cb, ctt = self.font_stack[-1]
	    if size is AS_IS: size = csize
	    if i is AS_IS: i = ci
	    if b is AS_IS: b = cb
	    if tt is AS_IS: tt = ctt
	font = (size, i, b, tt)
	self.font_stack.append(font)
	self.writer.new_font(font)

    def pop_font(self):
	if self.font_stack:
	    del self.font_stack[-1]
	if self.font_stack:
	    font = self.font_stack[-1]
	else:
	    font = None
	self.writer.new_font(font)

    def push_margin(self, margin):
	self.margin_stack.append(margin)
	fstack = filter(None, self.margin_stack)
	if not margin and fstack:
	    margin = fstack[-1]
	self.writer.new_margin(margin, len(fstack))

    def pop_margin(self):
	if self.margin_stack:
	    del self.margin_stack[-1]
	fstack = filter(None, self.margin_stack)
	if fstack:
	    margin = fstack[-1]
	else:
	    margin = None
	self.writer.new_margin(margin, len(fstack))

    def set_spacing(self, spacing):
	self.spacing = spacing
	self.writer.new_spacing(spacing)

    def push_style(self, *styles):
	if self.softspace:
	    self.hard_break = self.para_end = self.softspace = 0
	    self.nospace = 1
	    self.writer.send_flowing_data(' ')
	for style in styles:
	    self.style_stack.append(style)
	self.writer.new_styles(tuple(self.style_stack))

    def pop_style(self, n=1):
	del self.style_stack[-n:]
	self.writer.new_styles(tuple(self.style_stack))

    def assert_line_data(self, flag=1):
	self.nospace = self.hard_break = not flag
	self.para_end = self.parskip = self.have_label = 0


class NullWriter:
    """Minimal writer interface to use in testing.
    """
    def __init__(self): pass
    def new_alignment(self, align): pass
    def new_font(self, font): pass
    def new_margin(self, margin, level): pass
    def new_spacing(self, spacing): pass
    def new_styles(self, styles): pass
    def send_paragraph(self, blankline): pass
    def send_line_break(self): pass
    def send_hor_rule(self, *args, **kw): pass
    def send_label_data(self, data): pass
    def send_flowing_data(self, data): pass
    def send_literal_data(self, data): pass


class AbstractWriter(NullWriter):

    def __init__(self):
	pass

    def new_alignment(self, align):
	print "new_alignment(%s)" % `align`

    def new_font(self, font):
	print "new_font(%s)" % `font`

    def new_margin(self, margin, level):
	print "new_margin(%s, %d)" % (`margin`, level)

    def new_spacing(self, spacing):
	print "new_spacing(%s)" % `spacing`

    def new_styles(self, styles):
	print "new_styles(%s)" % `styles`

    def send_paragraph(self, blankline):
	print "send_paragraph(%s)" % `blankline`

    def send_line_break(self):
	print "send_line_break()"

    def send_hor_rule(self, *args, **kw):
	print "send_hor_rule()"

    def send_label_data(self, data):
	print "send_label_data(%s)" % `data`

    def send_flowing_data(self, data):
	print "send_flowing_data(%s)" % `data`

    def send_literal_data(self, data):
	print "send_literal_data(%s)" % `data`


class DumbWriter(NullWriter):

    def __init__(self, file=None, maxcol=72):
	self.file = file or sys.stdout
	self.maxcol = maxcol
	NullWriter.__init__(self)
	self.reset()

    def reset(self):
	self.col = 0
	self.atbreak = 0

    def send_paragraph(self, blankline):
	self.file.write('\n' + '\n'*blankline)
	self.col = 0
	self.atbreak = 0

    def send_line_break(self):
	self.file.write('\n')
	self.col = 0
	self.atbreak = 0

    def send_hor_rule(self, *args, **kw):
	self.file.write('\n')
	self.file.write('-'*self.maxcol)
	self.file.write('\n')
	self.col = 0
	self.atbreak = 0

    def send_literal_data(self, data):
	self.file.write(data)
	i = string.rfind(data, '\n')
	if i >= 0:
	    self.col = 0
	    data = data[i+1:]
	data = string.expandtabs(data)
	self.col = self.col + len(data)
	self.atbreak = 0

    def send_flowing_data(self, data):
	if not data: return
	atbreak = self.atbreak or data[0] in string.whitespace
	col = self.col
	maxcol = self.maxcol
	write = self.file.write
	for word in string.split(data):
	    if atbreak:
		if col + len(word) >= maxcol:
		    write('\n')
		    col = 0
		else:
		    write(' ')
		    col = col + 1
	    write(word)
	    col = col + len(word)
	    atbreak = 1
	self.col = col
	self.atbreak = data[-1] in string.whitespace


def test(file = None):
    w = DumbWriter()
    f = AbstractFormatter(w)
    if file:
	fp = open(file)
    elif sys.argv[1:]:
	fp = open(sys.argv[1])
    else:
	fp = sys.stdin
    while 1:
	line = fp.readline()
	if not line:
	    break
	if line == '\n':
	    f.end_paragraph(1)
	else:
	    f.add_flowing_data(line)
    f.end_paragraph(0)


if __name__ == '__main__':
    test()
