#!/bin/env python
import re

class TableWrite:
    """Write tables with correct header and footer"""
    
    def __init__(self,file):
        self.f = file
        self.columncount = 0
        self.tableopen= False
        self.tablebegin = r'\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}l@{\extracolsep{0.5cm}}l@{\extracolsep{\fill}}l@{\extracolsep{0.5cm}}l@{\extracolsep{\fill}}l@{\extracolsep{0.5cm}}l}'+'\n'
        self.tableend=r'\end{tabular*}'+'\n'

    def item(self,text):
        if not self.tableopen:
            self.f.write(self.tablebegin)
            self.tableopen=True
            self.columncount = 0
        self.f.write(text)
        if self.columncount<2:
            self.f.write(' & ')
            self.columncount+=1
        else:
            self.f.write(r' \\'+'\n')
            self.columncount=0

    def finish(self):
        if self.tableopen:
            if self.columncount>0:
                self.f.write(r' \\'+'\n')
            self.f.write(self.tableend+'\n')
            self.tableopen=False

    def header(self,text):
        self.finish()
        self.f.write(text+'\n')

fin = open('lhcb-symbols-def.tex')
outname = 'lhcb-symbols-list.tex'
fout = open(outname,'w')
print "All symbols are now available in the file %s." % outname

fout.write("""% This is an automatically generated appendix to template.tex. 
% When included it will show all the symbols defined in lhcb-symbols-def.tex.
%
% To regenerate with the latest definitions run the script ./listsymbols

\\section{List of all symbols}
\\label{sec:listofsymbols}
""")

psection = re.compile(r'(%+)\s*(.*)')
pdef = re.compile(r'^\\def(\\.+?)[\s{]+[^%]*(%\s.+)*')
pnew = re.compile(r'^\\newcommand\{(\\\w+?)\}(\[\d\])*[\s\{]+[^%]*(%\s.+)*')
parg = re.compile(r'.+(#\d)+.*')

writer=TableWrite(fout)

for l in fin.readlines():

    # Match on section headers
    m = psection.match(l)
    if m:
        length = len(m.group(1))
        if length<=2:
            if length==1:
                writer.header('\\subsection{%s}' % m.group(2))
            else:
                writer.header('\\subsubsection{%s}' % m.group(2))

    # Match on the \def lines
    m = pdef.match(l)
    if m:
        marg = parg.match(m.group(1))
        if not marg:
            writer.item('\\texttt{\\textbackslash %s} & %s' 
                        % (m.group(1)[1:],m.group(1)))
        else:
            if m.group(2):
                pat1 = re.compile(r'#')
                pat2 = re.compile(r'(#\d)+')
                generic = re.sub(pat1,r'\#',m.group(1))
                example = re.sub(pat2,m.group(2)[2:],m.group(1))
                writer.item('\\texttt{\\textbackslash %s ' % generic[1:] +
                            '\\textbackslash %s} & %s' 
                            % (example[1:],example))
            else:
                print 'Ignoring line: %s' % l[:-1]

    # Match on the \newcommand lines
    m = pnew.match(l)
    if m:
        if not m.group(2):
            writer.item('\\texttt{\\textbackslash %s} & %s' 
                        % (m.group(1)[1:],m.group(1)))
        elif m.group(3):
            generic = str(m.group(3)[2:]).replace('{',r'\{').replace('}',r'\}')
            writer.item('\\texttt{\\textbackslash %s%s ' % 
                       (m.group(1)[1:],m.group(2)) +
                        '\\textbackslash %s%s} & %s%s' 
                        % (m.group(1)[1:],generic,
                           m.group(1),m.group(3)[2:]))
        else:
            print 'Ignoring line: %s' % l[:-1]
            
writer.finish()

fin.close()
fout.close()
