Created
February 17, 2016 07:43
-
-
Save grimmo/44f0235b99e37240a05b to your computer and use it in GitHub Desktop.
Stampa etichette di collocazione da ALEPH 500
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import re | |
from subprocess import call | |
import sys | |
def scavezza_classic(collo): | |
if collo != '': | |
print ("Collocazione in entrata: %s" % collo) | |
# Vuolsi cosi' cola' ove si puote | |
newcollo = re.sub('Statistiche','ST.PER.ST',collo) | |
newcollo = newcollo.split(' ') | |
return newcollo | |
def scavezza_latest(collo): | |
if collo != '': | |
# Aggiunge uno spazio dopo il primo punto (Tipicamente la 1^ cifra della CDD) | |
newcollo = collo.replace('.','. ',1) | |
# Aggiunge uno spazio dopo il secondo / se la collocazione comprende | |
# una partizione per volumi, es: CDD 346.002638 SCHP.COD | |
# /1703-1709/2012 diventa CDD 346.002638 SCHP.COD /1703-1709 /2012) | |
# Se invece c'e' una normale divisione per annate, es: /2/1/2007 | |
# si comporta normalmente. | |
newcollo = re.sub('(/[0-9]{2,}-[0-9]{2,})/(.*)','\\1 /\\2',newcollo) | |
# Spezza ad ogni spazio | |
newcollo = newcollo.split(' ') | |
# Lunghezza della prima cifra della cdd | |
# Cerca la prima cifra della CDD prendendo il primo campo che contiene | |
# il . e inizia per un numero | |
try: | |
# Prende il pezzo piu' lungo della collocazione | |
#icdd = list(filter(lambda x:'.' in x and x[0].isdigit(),newcollo))[0] | |
icdd = max(newcollo,key=len) | |
except IndexError: | |
print ("Non riesco a capire la collocazione %s\nSei proprio sicuro che sia corretta?" % collo) | |
raise | |
# Paddiamo con degli spazi tutte le altre componenti della cdd che hanno una | |
# lunghezza inferiore alla prima cifra della cdd comprensiva di punto | |
#centratura = '{: ^%i}' % len(max(newcollo)) | |
centratura = '{: ^%i}' % len(icdd) | |
newcollo = [len(x) <len(icdd) and centratura.format(x) or x for x in newcollo] | |
return newcollo | |
def trovacollo(sezione): | |
"Ritorna il contenuto del primo tag <z30-call-no> di una sezione" | |
return re.findall(b'<z30-call-no>(.*?)<\/z30-call-no>',sezione)[0] | |
def tipocollo(sezione): | |
#return re.findall('<z30-call-no-type>\d<\/z30-call-no>',sezione) | |
return re.findall('<z30-call-no-type>([0-9])<\/z30-call-no-type>',sezione)[0] | |
def scrivicollo(fileout,collocazione): | |
nuovacollo = [] | |
# Filtra i campi della collocazione vuoti | |
collocazione = list(filter(lambda x:x!= '',collocazione)) | |
print ("Collocazione da scrivere: %s" % collocazione) | |
# Allinea al centro a 9 caratteri | |
nuovacollo = '\n'.join(['{:^9}'.format('%s' % pezzo) for pezzo in collocazione]) | |
print("Nuova collocazione:\n%s" % nuovacollo) | |
# Infine scrive su file la stringa | |
#fileout.write(nuovacollo.encode('utf-8')) | |
fileout.write(nuovacollo) | |
if __name__ == '__main__': | |
try: | |
# L'encoding in utf-8 va specificato altrimenti | |
# si pianta al primo libro con caratteri accentati | |
# nel titolo o nell'autore | |
file_etichette = open(sys.argv[1],encoding='utf-8') | |
except: | |
print ("Utilizzo: scavezzacollo <file_etichetta_xml>") | |
sys.exit() | |
outfile = 'etichetta_ok.txt' | |
#TODO: Qua si potrebbe fare un discorso di allocazione memoria.. | |
etichette = file_etichette.read() | |
file_etichette.close() | |
lista_etichette = re.findall('<z30-call-no>(.*?)<\/z30-call-no>',etichette) | |
# Filtra le collocazioni vuote | |
lista_etichette = list(filter(lambda x:x != '',lista_etichette)) | |
print ("Lista etichette: %s" % lista_etichette) | |
for etichetta in lista_etichette: | |
file_uscita = open(outfile,'w',-1) | |
try: | |
print ("Tipo di collocazione: %s" % tipocollo(etichette)) | |
except IndexError: | |
# Mai fidarsi dei bibliotecari.. | |
# manca del tutto il tipo di collocazione nel record | |
scrivicollo(file_uscita,scavezza_classic(etichetta)) | |
else: | |
# Se abbiamo la collocazione CDD con cifre dopo il punto ci comportiamo in un modo.. | |
if tipocollo(etichette) == '1' and re.match('.*(\d{3}\.?\d+?) \w.*',etichetta): | |
print("latest") | |
scrivicollo(file_uscita,scavezza_latest(etichetta)) | |
else: | |
# Altrimenti ci comportiamo nel modo standard | |
print("classic") | |
scrivicollo(file_uscita,scavezza_classic(etichetta)) | |
file_uscita.close() | |
call(['notepad.exe','/P',outfile]) | |
# DEBUG | |
#call(['notepad.exe',outfile]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment