#!/usr/bin/env python
# -*- coding:utf-8 -*-
#kicad_liste_alias.py crée un fichier liste qui énumère les alias d'une bibliothèque
# pierre launay 2007 licence GPL
# Sur Debian Etch mettre le paquet python_tk
import sys, os, string #Les bibiothèques python nécessaires
from Tkinter import Tk
from tkFileDialog import Open,SaveAs,Directory

def extrait(mot): #récupère la valeur du symbole 
    deb=string.find (mot," ")+1 #début apres l'espace
    fin=string.find(mot[deb:]," ") #fin avant  l'espace
    return mot[deb:fin+deb] #renvoie la valeur 
def sortir(erreur): #affiche une erreur et quitte le programme
    print erreur;  sys.exit(1)
def alias_lib(rep,fichier):
    f1=open(fichier,'r') #ouvre le fichier lib en lecture
    ligne = f1.readline() #lecture première ligne
    if not(("EESchema-LIBRARY" in ligne)or ("EESCHEMA-LIB" in ligne)) : #vérifie que le fichier est bien une lib valide
        sortir( "Attention, "+fichier+" n'est pas une bibiothèque de symboles valide") #erreur de fichier
    t=fichier+': ('+rep+'/'+fichier+')\n'; verif=0 #compatible avec entête kicadlib
    while 1 : #boucle sans fin sort par fin de fichier
        ligne = f1.readline()   #lecture d'une ligne du fichier cmp
        if ligne =='': break	#test fin de fichier, sort de la boucle tant que (while)
        if ("DEF " == ligne[:4]) : #recherche DEF dans le début de la ligne
            if verif : sortir("Erreur DEF sans ENDDEF "+fichier+" ligne "+ligne )#si verif est resté à 1, il a vu 2 DEF sans ENDDEF
            composant=extrait(ligne) #récupère la valeur du symbole
            verif=1 #si DEF dans ligne verif passe à 1
        if "ALIAS" in ligne : 
            if (verif==0): sortir("Erreur ALIAS sans DEF "+fichier+" ligne "+ligne )#vu ALIAS avant DEF erreur
            if ligne[-2] == 0x0d : #CR
                ligne=ligne[:-2]+'\n' #enlève 0x0d 0x0a CR LF puis remet 0x0a LF
            t+=composant+' alias '+ligne[6:]#écrit alias
        if "ENDDEF"== ligne[:6] : 
            if (verif==0): sortir("Erreur ENDDEF sans DEF "+fichier+" ligne "+ligne )#vu ENDDEF avant DEF erreur
            verif=0 #si ENDDEF remet verif à 0
    f1.close() #ferme le fichier lib
    return t
 #programme principal
if len(sys.argv) ==1 :
    Tk().withdraw() #lance l'explorateur de fichier avec Tkinter
    nom = eval('Open')(filetypes=[("all files", "*.lib")]) .show() #choisir le fichier lib à lister
    texte=alias_lib('',nom)
    f2=open(nom[:-3]+'alias','w') #ouvre le fichier alias en écriture
    f2.write(texte); f2.close() #ferme le fichier liste
else :
    texte=alias_lib(sys.argv[2],sys.argv[1])
    print texte
