Skip to content

Instantly share code, notes, and snippets.

@grimmo
Created February 17, 2016 07:43
Show Gist options
  • Save grimmo/44f0235b99e37240a05b to your computer and use it in GitHub Desktop.
Save grimmo/44f0235b99e37240a05b to your computer and use it in GitHub Desktop.
Stampa etichette di collocazione da ALEPH 500
#!/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