""" /* * AnalizaToo.py It parses a Too.tex file producing html files for * browsing them. * * Copyright (C) Manuel Gutierrez Algaba, 1999 * * This program is free software; you can redistribute it and/or modif y * it under the terms of the GNU General Public License as published b y * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * */ For new submissions : irmina@ctv.es """ """ Este programa analiza un fichero Too.tex y genera una serie de indices. """ import re #r = re.compile("\s*def\s+(?P[\w_]+)") #rr = re.compile("\s*class\s+(?P[\w_]+)") class AnalizaToo: def __init__(self, fichero, indice): """ indice :numero para crear cada uno de los ficheros """ self.contador_articulos = 0 # Para la base de datos de articulos self.base_articulos = {} self.indice = indice f = open(fichero, "r") self.lines = f.readlines() f.close() self.en_articulo = 0 self.dict_indices = {} self.RE_indice = re.compile("[^{]*{(?P[^{}]*)}{(?P.*)") self.un_indice = re.compile("\\\index{(?P[^}]*)}}?") self.espacios =re.compile("\s*") self.indiceg= re.compile("\\\index[^\s{]+") self.lineas_temp = [] self.indices_asociados = [] self.articulos_asociados_a_indices={} self.respuestas = [] self.alguno = 0 # este es el nombre de los ficheros self.teencontrex= "TeEncontreX" # este sirve para el indice, para que diff nos genere # todos los articulos por nombre self.teencontrexReal = "TeEncontreX" def analiza(self): for i in self.lines: if self.es_un_indice(i): self.procesa_indice(i) continue if i[0:5]=="\\jiji": if not self.alguno: self.alguno = 1 self.respuestas = [] self.lineas_temp = [] continue if i[0:5]=="\\jiji": self.asocia_con_respuesta() self.asocia_indices() continue if i[0:5]=='\\jaja': self.asocia_con_respuesta() continue if self.tiene_indices(i): continue self.filtra_linea(i) def filtra_linea(self, i): " quitamos verb, ponemos acentos y eso..." self.lineas_temp.append(i[:]) def asocia_con_respuesta(self): """ cada una de las respuestas sobre un tema y la pregunta inicial son dividas en varias partes, esta funcion une todo en respuestas """ self.respuestas.append(self.lineas_temp[:]) self.lineas_temp=[] def asocia_indices(self): #print "asociando indices", self.respuestas, self.indices_asociados copia =self.asocia_base_articulos( self.respuestas[:]) asociado = {} for i in self.indices_asociados: for j in self.dict_indices[i]: if re.search("AT", j): continue try: asociado[j] except KeyError: asociado[j]=1 for j in asociado.keys(): #print "asociando", j try: self.articulos_asociados_a_indices[j].append(( asociado.keys()[:], copia)) except KeyError: self.articulos_asociados_a_indices[j]=[( asociado.keys()[:], copia)] self.respuestas=[] self.indices_asociados =[] def asocia_base_articulos(self, a): self.contador_articulos = self.contador_articulos + 1 self.base_articulos[self.contador_articulos]= a return self.contador_articulos def imprime_indices_articulos(self): print self.articulos_asociados_a_indices.keys() for i in self.articulos_asociados_a_indices.keys(): print i,">>\n", self.articulos_asociados_a_indices def es_un_indice(self, i): return i[0:18]=='\\newcommand{\\index' def procesa_indice(self, i): m = self.RE_indice.match(i) indeses = m.group('nom') nombre = m.group('des') while 1: el = self.un_indice.match(indeses) if el is None: return inde = el.group('nom') indeses = indeses[len(inde)+len('\\index{}'):] try: self.dict_indices[nombre].append(inde) except: self.dict_indices[nombre]=[inde] def tiene_indices(self, i): t = i[:] adev = 0 while 1: m = self.espacios.match(t) if not m is None: t = t[m.end(0):] m = self.indiceg.match(t) if not m is None : self.indices_asociados.append(m.group(0)) t = t[m.end(0):] adev = 1 else: return adev def imprime_todos_indices(self): for i in self.dict_indices.keys(): print i, self.dict_indices[i] def expande_macroindice(self): self.dict_min_indices = [] for i in self.dict_indices.keys(): self.dict_min_indices = self.dict_min_indices + self.dict_indices[i] def escribe_html_palabra_clave(self, pal): """ palabra clave cuya pagina queremos crear """ inf = self.articulos_asociados_a_indices[pal] print inf # generamos la primera pagina f = open(self.teencontrex+pal+".html","w") self.genera_cabecera(f, pal) """ [(['tabla', 'cuadro', 'rput', 'pstricks', 'box'], 2), (['imagenes', 'centrado', 'tabla', 'tama\\~no', 'box', 'cuadro'], 6), (['color', 'tabla', 'cuadro', 'box'], 9), (['tabla', 'cuadro', 'columnas', 'box'], 28)] """ f.write("Estos son los articulos disponibles
") for articulo in inf: palabras_clave, articul = articulo f.write("Articulo ") self.genera_TeXen(f,str(articul)) f.write(":") for una_palabra_clave in palabras_clave: f.write(" ") #print una_palabra_clave self.genera_TeXen(f,una_palabra_clave) f.write(" ") f.write("
") self.genera_enlace(f, "\n
Al indice principal", self.teencontrex+ ".html") self.genera_pie(f) f.close() def genera_cabecera(self, fic, tema): fic.write(''' TeEncontreX:'''+ tema + '''

'''+ tema +"

") def genera_pie(self, fic): fic.write(" ") def genera_articulo(self, num): inf = self.base_articulos[num] #print inf f = open(self.teencontrex+str(num)+".html","w") self.genera_cabecera(f, "Articulo "+ str(num)) i = 0 for subarticulos in inf: f.write("Parte : ") self.genera_TeXen(f,str(num)+"."+str(i)) self.genera_subarticulo(subarticulos, str(num)+"."+str(i) ) f.write("
") i = i + 1 self.genera_pie(f) f.close() def genera_subarticulo(self, subart, nombre): f = open(self.teencontrex+nombre+".html","w") self.genera_cabecera(f, "Sub Articulo "+ nombre) for linea in subart: f.write("
"+linea+"
") self.genera_pie(f) f.close() def genera_TeXen(self,f, nombre_enlace): self.genera_enlace(f, nombre_enlace, self.teencontrexReal+nombre_enlace+".html") def genera_enlace(self, f, nombre_enlace, enlace_html): f.write('\n'+nombre_enlace + '') def genera_cuerpo(self, fic, cu): fic.write("
"+ cu + "
") def genera_listado_conceptos(self): f = open(self.teencontrex+".html","w") f.write("""

Bienvenidos a TeEncontreX.


Navega hasta que encuentres tu solucion
""") f.write("""Surf until you find your solution, some articles are in English, another in Spanish, others will be in German...
""") import time f.write("Version : ") f.write(time.asctime(time.localtime(time.time()))) f.write("
") l = self.articulos_asociados_a_indices.keys() l.sort() f.write("Exactly "+ str(len(l)) + " concepts! and " + str(self.contador_articulos) + " articles" ) f.write(""" """) contador = 0 for i in l : if re.search("AT", i): continue if contador % 7 == 0: if contador == 0: f.write("") else: f.write( "\n") f.write ("") self.escribe_html_palabra_clave(i) contador = contador + 1 f.write("
Lista/tabla de conceptos
") self.genera_enlace(f, i, self.teencontrex+i+".html") f.write ("
\n") f.write(''' ''') self.genera_enlace(f, "
A pyttex", "pyttex.htm") self.genera_enlace(f, "
A TeEncontreXIntro", "TeEncontreXIntro.html") self.genera_enlace(f, "

SOURCES!

", "TeEncontreX_Sources.html") self.genera_enlace(f, "

Want to add some data?

", "TeEncontreX_ADD.html") self.genera_pie(f) f.close() def genera_articulos(self): l = self.base_articulos.keys() l.sort() for i in l: self.genera_articulo(i) def hazlo(): a=AnalizaToo("Too.tex", 0) # al llegar aqui cada articulo tiene una serie de macroindices # asociado y se encuentra divido en varias partes # ahora lo l'ogico es expandir cada macroindice y encontrar # los articulos asociados a cada indice # por ultimo hay que ordenar los indices y generar una pagina # para cada uno y para cada articulo generar una serie de # enlaces a los otros sitios donde est'a asociado a.analiza() a.imprime_todos_indices() #print a.dict_indices['\indexcaja'] #print a.articulos_asociados_a_indices['cuadro'] #a.imprime_indices_articulos() #a.expande_macroindice() #a.escribe_html_palabra_clave('cuadro') #a.genera_articulo(2) a.genera_listado_conceptos() a.genera_articulos() if __name__=='__main__': hazlo()