# -*- coding: utf-8 -*- import os print '\n'*100 print '''Bienvenido/a a PyGlosGNU 0.0 \nEste programa localiza en un archivo de texto plano los términos del glosario de GNU para traductores y revisores a otras lenguas.\nVéase: www.gnu.org/server/standards/translations/es/recursos.html#glosario\n Al terminar la búsqueda, podrá guardar los resultados en un archivo. ''' archivo = str(raw_input('Introduzca el nombre del archivo a revisar (con extensión): ')) # Comprueba que exista el archivo. existe = os.path.exists(archivo) while existe != True: print 'El archivo no existe o no está en este directorio.\n' print 'Si no se encuentra en el mismo directorio en el que está \nel archivo a revisar, introduzca la ruta.\nEjemplo: /home/Mipc/Documentos/archivo.txt\n' print 'Si desea salir del programa, pulse +\n' archivo = str(raw_input('Introduzca el nombre del archivo a revisar (con extensión): ')) existe = os.path.exists(archivo) print texto = open(archivo,'r') contador_linea = 0 # Glosario de palabras glosario = ['back door', 'backend as a service', 'baas', 'blobs', 'computer', 'copyleft', 'copyleft license', 'copyleft program', 'copylefted program', 'developer', 'digital handcuffs', 'digital locks', 'digital restrictions management','drm', "drm'd", 'distro', 'driver', 'dual boot', 'ebooks', 'e-books', 'firmware blobs', 'firmware file', 'free software', 'free software activists', 'free software advocates', 'free software foundation', 'fsf', 'free software license', 'free software movement', 'free system distribution', 'gnu affero general public license', 'gnu affero gpl', 'agpl', 'gnu coding standards', 'gnu free documentation license', 'gfdl', 'gnu lesser general public license', 'lgpl',"gnu's not unix", 'gnu project', 'gpl-covered software', 'gratis', 'instant bootable distribution','lax license', 'permissive license', 'licensing & compliance lab', 'linux-based versions of GNU', 'malicious features','non-copyleft license','nondisclosure agreement','nonfree software','open source', 'source code', 'proprietary', 'proprietary software', 'library', 'maintainer', 'notice', 'release', 'run', 'see', 'reversible debugging', 'saas', 'software as a service', 'under the gpl', 'vendor lock-in','tivoization', 'webmaster', 'work'] resultado = [] # Variable para almacenar resultados. resumen = [] # Variables para almacenar resumen. lineas = [] suma = 0 linea_ant= '' def buscar(pal,cad, ant): cad = cad.lower() linea_form = cad.split() if linea_form != []: if linea_form[0] == '': return False for l in linea_form: if ' ' not in pal: if pal in l: if 'http' in l: if l.index('http') < l.index(pal): if '>' not in l[l.index('http'):l.index(pal)]: return False if 'href' in l: if l.index('href') < l.index(pal): if '>' not in l[l.index('href'):l.index(pal)]: return False if 'html' in l: if l.index('html') > l.index(pal): if '<' not in l[l.index(pal):l.index('html')]: return False if 'src' in l: if l.index('src') < l.index(pal): if '>' not in l[l.index('src'):l.index(pal)]: return False if 'url' in l: if l.index('url') < l.index(pal): if '>' not in l[l.index('url'):l.index(pal)]: return False if '@' in l: return False else: return True if ' ' in pal: doslin = linea_ant[:-1].lower()+' '+cad if pal in cad: return True elif '_'.join(pal.split()) in cad: return True elif '\xc2\xa0'.join(pal.split()) in cad: return True elif pal in doslin and pal not in linea_ant.lower(): return True for linea in texto: contador_linea +=1 for term in glosario: if buscar(term,linea, linea_ant): suma +=1 print 'El término < {0} > encontrado en la línea {1} \n>>>{2} '.format (term, contador_linea, linea) # Ordena resultados if term not in resumen: resumen.append(term) lineas.append([contador_linea]) else: ind = resumen.index(term) lineas[ind].append(contador_linea) dato1 = ['El término < {0} > encontrado en la línea {1} \n>>>{2} '.format (term, contador_linea, linea)] resultado.append(dato1) linea_ant = linea texto.close() print '*** Resumen de coincidencias ***\nTérmino : linea/s\n' for palabra in range(0, len(resumen)): print '{0} : {1}: {2}'.format(resumen[palabra], lineas[palabra], len(lineas[palabra])) print 'TOTAL DE COINCIDENCIAS: ', suma if resultado == []: print '\nNo hay coincidencias\n' else: guardar = str(raw_input('¿Desea conservar los resultados en un archivo? (s/n): ')) if guardar == 's' or guardar == 'S': archivo2 = str(raw_input('Introduzca el nombre del archivo: ')) archivo2 = archivo2+'.txt' # Comprueba si el archivo existe y si se desea sobreescribir. existe = os.path.exists(archivo2) while existe: print 'El archivo', archivo2, 'ya existe.\n' sobre = str(raw_input('¿Desea sobreescribirlo? (s/n): ')) if sobre.lower() == 's': existe = False else: archivo2 = str(raw_input('\nIntroduzca un nuevo nombre para el archivo : ')) existe = os.path.exists(archivo2) # Escribe el resultado de la búsqueda en el archivo nuevo f_salida = open(archivo2, 'w') for linea in resultado: for i in linea: f_salida.write(str(i)) res = '*** Resumen de coincidencias ***\nTérmino : linea/s\n' f_salida.write(res) for palabra in range(0, len(resumen)): f_salida.write('{0} : {1}'.format(resumen[palabra], lineas[palabra])) f_salida.write('\n') f_salida.write('Total de coincidencias: {0}\n'.format(suma)) f_salida.close() print '<<< Fin del script>>>'