"""
Manuel Gutierrez Algaba 1999

You are free to use , modify, distribute and copy this piece of
python code, if you keep this free copyright notice in it.

boxerer Version 1.1

Constructor of boxes:

This code does a series of boxes, one inside another ,
so that the structure of a specific thing is clearly shown.

"""
import string

class included:
    def __init__(self, title_of_the_thing,  width = 350, decrement = 20, spaced = 'on' ):
	self.limit_of_generation=10000
	self.spaced= spaced
	self.title = title_of_the_thing[0]
	self.set_of_articles = []
	self.width = width
	self.decrement = decrement
	print title_of_the_thing
	if not title_of_the_thing[1] is None:
	    for i in title_of_the_thing[1]:
		#print "line 18",i
		self.add(included(i,width - decrement, decrement))
	try:
	    self.coment = title_of_the_thing[2]
	except:
	    self.coment = ""

    def do_limit_of_generation(self,y):
	self.limit_of_generation= y

    def add(self,i):
	self.set_of_articles.append(i)

    def genera(self, f, level = 0):
	if level==self.limit_of_generation:
	    return -1
	f.write("\\framebox{\\parbox{"+str(self.width)+" pt }{\\textit{ "+ self.title+"}")
	print self.coment
	if self.coment!="":
	    f.write("\\newline "+self.coment)
	if self.set_of_articles !=[]:
	    f.write(" \\newline")
	    if self.spaced=='on':
		f.write("\\vspace*{3 pt} \n")
 	for i in self.set_of_articles[:-1]:
	    if i.genera(f,level + 1)==1:
		f.write(" \\newline")
		if self.spaced=='on':
		    f.write("\\vspace*{3 pt} \n")

	if self.set_of_articles !=[]:
	    self.set_of_articles[len(self.set_of_articles)-1].genera(f)
	f.write("}}")
	return 1

"""
inputoutputfunction

This class creates a box, where it's detailed what is that 
module of function for, what are its inputs,outputs and what internal
functions does it call.
"""

class inputoutputfunction:
    def __init__(self, name, description, lang='en'):
	self.name = name
	self.description = description
	self.lang = lang
	self.inputnamelang={'en':'Inputs','es':'Entradas'}
	self.outputnamelang={'en':'Outputs','es':'Salidas'}
	self.functionnamelang={'en':'Functions','es':'Funciones'}
	if lang=='en':
	    self.inputs=("None",0)
	    self.outputs=("None",0)
	    self.functions=("None",0)
	elif lang=='es':
	    self.inputs=("No hay",0)
	    self.outputs=("No hay",0)
	    self.functions=("No hay",0)

    def do_inputs(self, inputs):
	self.inputs=[]
	for i in inputs:
	    self.inputs.append(string.replace(i,"_","\_"))

    def do_outputs(self, outputs):
	self.outputs=[]
	for i in outputs:
	    self.outputs.append(string.replace(i,"_","\_"))

    def do_functions(self, functions):
	self.functions=[]
	for i in functions:
	    self.functions.append(string.replace(i,"_","\_"))

    def generate_latex_code(self,file,width):
	f = open(file,"w")
	inputs = self.generate_inputs()
	outputs = self.generate_outputs()
	functions = self.generate_functions()
	#print (self.name, [inputs,functions,outputs], self.description)
	i = included((self.name, [inputs,functions,outputs],
		      self.description), width)
	f = open(file,"w")
	i.genera(f)
	f.close()

    def generate_inputs(self):
	return self.generate_thing(self.inputs, self.inputnamelang)

    def generate_outputs(self):
	return self.generate_thing(self.outputs, self.outputnamelang)

    def generate_functions(self):
	return self.generate_thing(self.functions, self.functionnamelang)

    def generate_thing(self,thing,dic):
	if type(thing)==type((0,0)):
	    return (dic[self.lang],None,thing[0])
	else:
	    t = ""
	    for i in thing:
		t=t+"\\item{"+i+"}"+"\n"
	    head = "\\begin{list}{*}{\\baselineskip 2pt}\n"
	    foot = "\\end{list}\n"
	    all= head+t+foot
	    return (dic[self.lang],None,all)
	

def test():
    r0 = ("men\\_prin.py",None,"Here it's the main menu is defined")
    r1 = ("Graphic representation", [("tkinter.py",None,"Main calling module"),r0], "Graphic interfases with the user, mainly")
    r2 = ("Structures of the languages(grammar)", None)
    r3 = ("Configuration", [("Database of words",None),
			     ("Labels",None)])
    i = included(("Lritaunas Peki",[r1,r2,r3]," This programm aims to teach vocabulary and grammar of different languages."))
    f = open("result.tex","w")
    i.genera(f)
    f.close()
    
    example2=inputoutputfunction('taxman',"This is your best friend, who helps you when you earn too much")
    example2.do_inputs(["Your income","Your properties","The Law"])
    example2.do_outputs(["Your taxes","Your fines","Historical information"])
    example2.do_functions(["Compute your taxes","Check your lies",
			  "Send you to prison","Bribery"])
    example2.generate_latex_code("result2.tex",200)

    example3=inputoutputfunction('doctor',"This is your best friend, who helps you when you are tired of life")
    example3.do_inputs(["Your income","Your properties","Your confidence"])
    example3.do_functions(["Kill you","Heal you"])
    example3.generate_latex_code("result3.tex",200)
    
if __name__=='__main__':
    test()
