Utente:Aubrey/scripts python

Questo è un primo script da salvare nella stessa directory dove partono i tuoi bot, con il nome Ale.py (è una piccola raccolta di funzioni):

# -*- coding: utf-8 -*-
import wikipedia
import pickle
from datetime import date
#from  buzhug import Base
# from Alebuz_go import leggi_capitoli

global autori, lista_autori, pagine_autore, offset
offset=0

def azbl(pagina):
##    indice=open("dati/indice_a.txt").read()
##    
    pag=leggi_pagina("Pagina:Zibaldone di pensieri I.djvu/"+str(pagina))
    
    voci=find_all(pag," ",".")
    vv=[]
    for i in voci:
        v=i[0].split(",")
        if len(v)==2:
            if v[0].isdigit() and v[1].isdigit():
                #print v[0],v[1]
                vv.append(v)
    # in vv serie delle sole coppie pagina pensiero
    
    vi=[]
    vizb=[]
    for i in vv:
        vi.append(" "+i[0]+","+i[1]+".")
        vizb.append("[[Zibaldone/"+i[0]+"#"+i[1]+"|"+i[0]+",<small>"+i[1]+"</small>]].")
    for i in range(len(vi)):
        pag=pag.replace(vi[i]," "+vizb[i])
    scrivi_pagina(pag,False,"Pagina:Zibaldone di pensieri I.djvu/"+str(pagina))
    return  "Fatto"






questo_file="Ale.py"

tavole_cronologiche=[u"Wikisource:Tavole cronologiche degli autori ",u"dell'Antichità",u"del Medioevo",u"del XI secolo",u"del XII secolo",u"del XIII secolo",u"del XIV secolo",u"del XV secolo",u"del XVI secolo",u"del XVII secolo",u"del XVIII secolo",u"del XIX secolo",u"del XX secolo",u"del XXI secolo"]
template_autore1=u'''<div style="width:25%; float: left; border:3px dotted #B8CC99; margin-right: 10px; background-color: #E9F1EE; font-size: 0.6pc;"> 
<span style="font-size: 0.8pc;">\'\'\'Data box\'\'\'</span>
* nome = <section begin="nome" />{{{Nome}}}<section end="nome" />
* cognome = <section begin="cognome" />{{{Cognome}}}<section end="cognome" />
* iniziale cognome = <section begin="iniziale cognome" />{{{Iniziale del cognome}}}<section end="iniziale cognome" />
* altro nome = <section begin="altro nome" />{{{Eventuale altro nome}}}<section end="altro nome" />
* pseudonimo = <section begin="pseudonimo" />{{{Eventuale pseudonimo}}}<section end="pseudonimo" />
* nome reale = <section begin="nome reale" />{{{Eventuale nome reale}}}<section end="nome reale" />
* giorno e mese nascita = <section begin="giorno e mese nascita" />{{{Giorno e mese di nascita}}}<section end="giorno e mese nascita" />
* anno nascita = <section begin="anno nascita" />{{{Anno di nascita}}}<section end="anno nascita" />
* giorno e mese morte = <section begin="giorno e mese morte" />{{{Giorno e mese di morte}}}<section end="giorno e mese morte" />
* anno morte = <section begin="anno morte" />{{{Anno di morte}}}<section end="anno morte" />
* secolo  = <section begin="secolo " />{{{Secolo di attività}}}<section end="secolo " />
* secondo secolo = <section begin="secondo secolo" />{{{Eventuale secondo secolo di attività}}}<section end="secondo secolo" />
* professione e nazionalità = <section begin="professione e nazionalità" />{{{Professione e nazionalità}}}<section end="professione e nazionalità" />
* pagina wikipedia = <section begin="pagina wikipedia" />{{{Nome della pagina su Wikipedia}}}<section end="pagina wikipedia" />
* pagina wikiquote = <section begin="pagina wikiquote" />{{{Nome della pagina su Wikiquote}}}<section end="pagina wikiquote" />
* pagina wikinotizie = <section begin="pagina wikinotizie" />{{{Nome della pagina su Wikinotizie}}}<section end="pagina wikinotizie" />
* pagina commons = <section begin="pagina commons" />{{{Nome della pagina su Commons}}}<section end="pagina commons" />
* nome immagine = <section begin="nome immagine" />{{{Nome dell'immagine}}}<section end="nome immagine" />
* indice contenuti = <section begin="indice contenuti" />{{{Vuoi l'indice dei contenuti?}}}<section end="indice contenuti" />
* testi = <section begin="testi" />{{{Abbiamo testi scritti dall'autore?}}}<section end="testi" />
* traduzioni = <section begin="traduzioni" />{{{Abbiamo traduzioni scritte dall'autore?}}}<section end="traduzioni" />
* citazioni = <section begin="citazioni" />{{{L'autore è citato in altre opere pubblicate?}}}<section end="citazioni" />
</div>'''


riscontro='''{{Utente:Alex_brollo/RiscontroAutore 
| autore=
| link=[http://it.wikisource.org/w/index.php?title=Autore:NomeAutore/Riscontro&action=edit modifica dati]
| date= 
| prof_naz= 
| wikipedia= 
| wikiquote= 
| commons= 
| foto= 
| anni= 
| SAL= 
| interwiki= 
| data_controllo= 
}}'''
oggi=date.today().strftime("%d-%m-%y")
h2u=wikipedia.html2unicode
u2h=wikipedia.UnicodeToAsciiHtml


def ocr(pagina,interattivo=False,delr=False):
    header_footer=u'<noinclude>{{PageQuality|1|}}<div class="pagetext">\n\n\n</noinclude>TESTO<noinclude>\n<references/></div></noinclude>'
    pagina="Pagina:Manzoni.djvu/"+str(pagina)
    p=leggi_pagina(pagina)
    if p=="" or "{{OCR}}" in p:
        return
    head='<noinclude>{{PageQuality|1|}}<div class="pagetext">\n\n\n</noinclude>'
    foot='<noinclude>\n<references/></div></noinclude>'
    if "<noinclude>" in p:
        p,head=el_st(p,"<noinclude>","</noinclude>")
        p,foot=el_st(p,"<noinclude>","</noinclude>")
        
    p=p.replace(u"« ",u"«") #elimina spazi dopo l'apertura..
    p=p.replace(u" »",u"»") #e dopo la chiusura
    p=p.replace("''",u"§corsivo§")
    p=p.replace("'''",u"§grassetto§")
    p=p.replace(u"ŕ",u"'")
    p=p.replace("' ","'")
    p=p.replace(" 48"," 18")
    p=p.replace(u"ů",u"u")
    p=p.replace(u"ì",u"i")
    p=p.replace("e'","e' ")
    p=p.replace("o'","o' ")
    p=p.replace("0","o")
    p=p.replace(u"§corsivo§","''")
    p=p.replace(u"§grassetto§","'''")
    p=p.replace(u"·\n","-\n")
    p=p.replace(u"·"," ")
    p=p.replace(u"—","-")
    p=p.replace(" ;","; ")   #elimina spazi prima di ;
    p=p.replace(" ,",", ")   #idem prima di ,
    p=p.replace("  "," ")
    p=p.splitlines(True)    #trasforma pagina in lista di righe con \n finale

    if delr:
        p=p[1:]
    x=u""
    for i in range(len(p)):

        p[i]=p[i].strip()+"\n"        #elimina spazi in testa e in coda alle righe
        
        if p[i][-3:-2]==" ":    #ricerca caratteri siolati a fine riga, preceduti
                                #da uno spazio: prima passata
            if not p[i][-2:-1] in "iaeo":
                p[i]=p[i][:-3]+"\n"
    for i in range(len(p)):
        if p[i][-3:-2]==" ": #idem come sopra:seconda passata
            if not p[i][-2:-1] in "iaeo":
                p[i]=p[i][:-3]+"\n" 
        if p[i][1:2]==" " and not p[i][0:1] in "Eeiao": #ricerca caratteri
                                        #isolati in testa alle righe
            p[i]=p[i][2:]
            
        p[i]=p[i].strip()+"\n" # ultimo strip
        if p[i][-2:]==".\n":
            p[i]=p[i]+"\n"
        if p[i][-2:]==":\n":
            p[i]=p[i]+"\n"
        if p[i][-2:]=="?\n":
            p[i]=p[i]+"\n"
            
        x=x+p[i] # accumulo delle righe
    x=x.replace("-\n","") #eliminazione acapi a metà parola
    x=correzione(x,interattivo)
    x=x.strip()
    x=head+x+foot
    scrivi_pagina(x,False,pagina)
    #print x
    return "Fatto"

def estrai_txt(file_input):
    file_input=file_input+".txt"
    f=open(file_input)
    fi=unicode(f.read(),"cp1252")
    f.close()
    p=[]
    p.append(" ")
    pagenum=1
    while True:
        tagi="["+str(pagenum)+"]"
        tagf="[/"+str(pagenum)+"]"
        if fi.find(tagi)>-1 and fi.find(tagf)>-1:
            fi,page=el_st(fi,tagi,tagf)
            p.append(page)
            pagenum=pagenum+1
            print pagenum,
        else:
            break
    p=elimina_numero_righe(p)
    p=elimina_prima_riga(p)
    p=aggiungi_header_footer(p)
    r=" "
    while not r in "fF":
        r=raw_input("pagina: numero; f: fine.")
        if r.isdigit():
            print p[eval(r)]
        
        
    return p

def aggiungi_header_footer(lista):
    header='''<noinclude>{{PageQuality|1|Alebot}}<div class="pagetext">

</noinclude>'''
    footer='''<noinclude>
<references/></div></noinclude>'''
    for i in range(len(lista)):
        lista[i]=header+lista[i]+footer
    return lista

def elimina_prima_riga(lista):
    for i in range(len(lista)):
        acapo=lista[i].find("\n")
        lista[i]=lista[i][acapo:].strip()
        
    return lista

def elimina_numero_righe(lista):
    for i in range(len(lista)):
        lista[i]=lista[i].replace("["+str(i)+"]","")
        lista[i]=lista[i].replace("[/"+str(i)+"]","")
    return lista

# trasforma un testo in una lista di elementi 
def splitter(testo):
    caratteri=u"ABCDEFGHILMNOPQRSTUVZJKXYWabcdefghilmnopqrstuvzjkwyx_'ìèòàù&0123456789"
    #inizializzazioni
    parole=[]
    elem=""
    ft=len(testo)
    
    #caricamento primo carattere
    tc=(testo[0:1] in caratteri)

    #scorrimento e analisi
    for i in range(ft): 
        elem=elem+testo[i:i+1]
        if not tc == (testo[i+1:i+2] in caratteri): #se il successivo carattere appartiene a altro tipo
            parole.append(elem) # aggiorna lista
            elem=""             # svuota elemeno corrente
            tc=not tc           # e cambia tipo

    # caricamento dell'ultima parola
    parole.append(elem)
    return parole

def splitter1(testo):
    caratteri=u"ABCDEFGHILMNOPQRSTUVZJKXYWabcdefghilmnopqrstuvzjkwyx_'ìèòàù&"
    #inizializzazioni
    testo1=""
    elem=""
    ft=len(testo)
    
    #caricamento primo carattere
    tc=(testo[0:1] in caratteri)

    #scorrimento e analisi
    for i in range(ft): 
        elem=elem+testo[i:i+1]
        if not tc == (testo[i+1:i+2] in caratteri): #se il successivo carattere appartiene a altro tipo
            testo1=testo1+elem+"|" # aggiorna lista
            elem=""             # svuota elemeno corrente
            tc=not tc           # e cambia tipo

    # caricamento dell'ultima parola
    testo1=testo1+elem
    return testo1

def correzione(t1,interattivo=False):
    t1=splitter(t1)
    diz=carica("diz")
    while True:
        for i in range(len(t1)):
            if t1[i] in diz:
                t1[i]=diz[t1[i]]
        if not interattivo:
            break
        print ricomponi(t1)
        err=unicode(raw_input("Parola errata o fine:"),"cp1252")
        if err=="fine":
            break
        corr=unicode(raw_input("Parola errata o fine:"),"cp1252")
        diz[err]=corr

    salva(diz,"diz")
    return ricomponi(t1)

def ricomponi(lista):
	x=""
	for i in lista:
		x=x+i
	return x

    

    
def aggiorna_atc():
    atc=[]
    for i in range(1,len(tc)):
        x=produci_lista(leggi_pagina(tc[0]+tc[i]),"[[Autore:","|")
        atc=atc+x
    salva(atc,"autori_tabelle_cronologiche")
    return
	
    

def output(testo=u"test ìèòàù"):
    print testo.encode("cp1252")
    return

def line_input(prompt="Inserisci da tastiera: "):
    testo=unicode(raw_input(prompt),"cp1252")
    return testo
 
##wiki reading/writing
def blocked(nome_pagina,code="it"):
    site = wikipedia.getSite(code)
    page = wikipedia.Page(site, nome_pagina)
    print page.canBeEdited()
    return
                      
def scrivi_pagina(testo="",aggiungi=True,nome_pagina="Utente:Alex brollo/Sandbox",commento="Edit by Alebot",code="it"):
    site = wikipedia.getSite(code)
    page = wikipedia.Page(site, nome_pagina)
    
    
    if aggiungi:
        contenuto = page.get()
        try:
            page.put(newtext=contenuto+u"\n\n"+testo,comment=commento)
        except wikipedia.LockedPage:
            return "Pagina bloccata"
    else:
        try:
            page.put(newtext=testo,comment=commento)
        except wikipedia.LockedPage:
            return "Pagina bloccata"
    wikipedia.stopme()
    return "Fatto"

def leggi_pagina(nome_pagina=u"Utente:Alex brollo", code="it",res="testo"):
    site = wikipedia.getSite(code)
    page = wikipedia.Page(site, nome_pagina)
    if res=="testo":
        try:
            text = page.get() # Taking the text of the page
        except wikipedia.NoPage: # First except, prevent empty pages
            text = ''
        except wikipedia.IsRedirectPage: # second except, prevent redirect
            text = "#REDIRECT"
            # output(u'%s is a redirect!' % pagename)
        
            
        except wikipedia.Error: # third exception, take the problem and print
            output(u"Some error, skipping..")
        wikipedia.stopme()
        return text
    elif res=="permessi":
        try:
            permessi = page.getRestrictions() # Taking the text of the page
        except wikipedia.NoPage: # First except, prevent empty pages
            permessi = ''
        except wikipedia.IsRedirectPage: # second except, prevent redirect
            permessi = "#REDIRECT"
            # output(u'%s is a redirect!' % pagename)
        except wikipedia.Error: # third exception, take the problem and print
            output(u"Some error, skipping..")
        wikipedia.stopme()
        return permessi
        

def leggi_pagina_html(nome_pagina=u"Utente:Alex brollo"):
    site = wikipedia.getSite()
    page = wikipedia.Page(site, nome_pagina)
    
    try:
        text = site.getUrl(nome_pagina) # Taking the text of the page
    except wikipedia.NoPage: # First except, prevent empty pages
        text = ''
    except wikipedia.IsRedirectPage: # second except, prevent redirect
        text = "#REDIRECT"
        # output(u'%s is a redirect!' % pagename)
        
    except wikipedia.Error: # third exception, take the problem and print
        output(u"Some error, skipping..")

    wikipedia.stopme()
    return text
                  

# Writes into it.wikisource a unicode string into a named page (full name), adding to previous content (aggiungi=True)
# or replacing it (aggiungi=False)
##def scrivi_pagina(testo=u"Prova\n\n",aggiungi=True ,nome_pagina=u"Utente:Alebot/Sandbox"):
##    site = wikipedia.getSite()
##    page = wikipedia.Page(site, nome_pagina)
##    if aggiungi:
##        contenuto = page.get()
##        page.put(contenuto+u"\n\n"+testo)
##    else:
##        page.put(testo)
##    wikipedia.stopme()
##    return "Fatto"

# reads from it.wikisource an Autore: page and builds xml conversion of data
def leggi_autore(autore_corrente=u"Alessandro Manzoni"):
    pagina_autore_corrente=leggi_pagina(u"Autore:"+autore_corrente)
    return pagina_autore_corrente

def leggi_lista_autori(iniziali="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
    x=iniziali
    text=[]
    for i in range(len(x)):
        titolo=u"Wikisource:Elenco alfabetico degli autori "+x[i:i+1]
        t=leggi_pagina(titolo)
        text.append([titolo,t])
        print u"letto "+titolo
    lista_autori=[]
    for i in range(len(text)):
        #print "parte produci lista"
        a1=produci_lista(text[i][1],"{{Template:","}}")
        lista_autori=lista_autori+a1
    return lista_autori

##Pickle data loading/dumping

# dumps a variable

def salva(variabile,nome_file="dato",folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()
    return "Variabile salvata nel file "+nome_file

def salva_pcl(variabile,nome_file="dato",folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()
    return "Variabile salvata nel file "+nome_file

# loads a variable
def carica(nome_file,folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto


def carica_pcl(nome_file,folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto

# translates a Author template into a xml structure
# as:  <autore>Alessandro Manzoni<dati><nome>Alessandro</nome>....</dati></autore>   
def parse_autore(pag_autore):
    l=""
    autore=find_stringa(pag_autore,u"Nome =",u"\n").strip()+" "+find_stringa(pag_autore,u"Cognome =",u"\n").strip()
    autore=autore.strip()
    l=l+tagger(u"nome",(find_stringa(pag_autore,u"Nome =",u"\n")))                          #0
    l=l+tagger(u"cognome",(find_stringa(pag_autore,u"Cognome =",u"\n")))                    #1
    l=l+tagger(u"iniziali",(find_stringa(pag_autore,u"Iniziale del cognome =",u"\n")))      #2
    l=l+tagger(u"altronome",(find_stringa(pag_autore,u"Eventuale altro nome =",u"\n")))     #3
    l=l+tagger(u"pseudonimo",(find_stringa(pag_autore,u"Eventuale pseudonimo =",u"\n")))    #4
    l=l+tagger(u"reale",(find_stringa(pag_autore,u"Eventuale nome reale =",u"\n")))         #5
    l=l+tagger(u"gm_nascita",(find_stringa(pag_autore,u"Giorno e mese di nascita =",u"\n")))#6
    l=l+tagger(u"a_nascita",(find_stringa(pag_autore,u"Anno di nascita =",u"\n")))          #7
    l=l+tagger(u"gm_morte",(find_stringa(pag_autore,u"Giorno e mese di morte =",u"\n")))    #8
    l=l+tagger(u"a_morte",(find_stringa(pag_autore,u"Anno di morte =",u"\n")))              #9
    l=l+tagger(u"secolo1",(find_stringa(pag_autore,u"Secolo di attività =",u"\n")))         #10
    l=l+tagger(u"secolo2",(find_stringa(pag_autore,u"Eventuale secondo secolo di attività =",u"\n")))       #11
    l=l+tagger(u"descrizione",(find_stringa(pag_autore,u"Professione e nazionalit\xe0 =",u"\n")))           #12
    l=l+tagger(u"wikipedia",(find_stringa(pag_autore,u"Nome della pagina su Wikipedia =",u"\n")))           #13
    l=l+tagger(u"wikiquote",(find_stringa(pag_autore,u"Nome della pagina su Wikiquote =",u"\n")))           #14
    l=l+tagger(u"wikinotizie",(find_stringa(pag_autore,u"Nome della pagina su Wikinotizie =",u"\n")))       #15
    l=l+tagger(u"commons",(find_stringa(pag_autore,u"Nome della pagina su Commons =",u"\n")))               #16
    l=l+tagger(u"immagine",(find_stringa(pag_autore,u"Nome dell'immagine =",u"\n")))                        #17
    l=l+tagger(u"indice",(find_stringa(pag_autore,u"Vuoi l'indice dei contenuti? =",u"\n")))                #18
    l=l+tagger(u"testi",(find_stringa(pag_autore,u"Abbiamo testi scritti dall'autore? =",u"\n")))           #19
    l=l+tagger(u"traduzioni",(find_stringa(pag_autore,u"Abbiamo traduzioni scritte dall'autore? =",u"\n"))) #20
    l=l+tagger(u"citazioni",(find_stringa(pag_autore,u"L'autore \xe8 citato in altre opere pubblicate? =",u"\n")))#21
    l=tagger(u"dati",l)
    l=tagger(u"autore",autore+l)+u"\n"
    return l

# adds tags to data (subroutine used by the previous procedure
def tagger(tag, dato):
    dato_tagged=u"<"+tag+u">"+dato+u"</"+tag+u">"
    return dato_tagged

# saves Ale.py code into Utente:Alebot/Scripts (t.i. here)
def aggiorna_pagina_scripts():
    f=open("Ale.py")
    scripts=u"<"+u"pre>"+unicode(f.read(),"cp1252")+u"<"+u"/pre>"
    f.close()
    pagina=leggi_pagina(u"Utente:Alebot/Scripts")
    intestazione=find_stringa(pagina,u'<section begin="s1" />',u'<section end="s1" />',1)+u"\n"
    firma=u"\n--~~~~"
    pagina=pagina[0]+u"--~~~~"
    pagina=intestazione+scripts+firma
    scrivi_pagina(pagina,False,u"Utente:Alebot/Scripts")
    
    return "Fatto"

## General string management routines for RegEx ignorants :-(

# finds a substring beginning with idi and ending with idf; returns it
# with (dc=1) or without (default dc=0) idi and idf; used for xml managing too

def find_stringa(stringa,idi,idf,dc=0,side="left"):
    if side=="right":
        idip=stringa.rfind(idi)
    else:
        idip=stringa.find(idi)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

# variant; as find_stringa, but searches into stringa from offset (default 0);
# returns substring without and with delimiters, the absolute offset of the
# second delimiter, the indices of the substring (null strings if not found)

def find_next(stringa,idi,idf,offset=0):
    idip=stringa.find(idi,offset)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        
        stringa_i=stringa[idip+len(idi):idfp-len(idf)]
        stringa_t=stringa[idip:idfp]
##        if stampa:
##            print stringa_t,
        offset=idfp-len(idf)
    else:
        stringa_i=''
        stringa_t=''
    return stringa_i,stringa_t,offset,idip,idfp

# appoggiandosi a find_next, produce una lista di tutte le istanze della
# sottostringa idi...idf, contenente per ciascun valore i dati:
# stringa_i,stringa_t,offset,idip,idfp

def find_all(stringa,idi,idf):
    lista=[]
    offset=0
    while True:
        r=find_next(stringa,idi,idf,offset)
        if r[0]!="":
            lista.append(r)
            offset=r[2]
        else:
            return lista

## carica un'intera opera, pagina per pagina, inserendo <!--NomePagina-->
## immediatamente prima del testo; salva la stringa risultante in dati/InteraOpera.pcl



# restituisce la stringa idi...ifd "a cavallo" di offset
# senza (dc=0) o con (dc!=0) i delimitatori idi...idf
        
def find_r(stringa,idi,idf,offset,dc=1):
    idip=stringa.rfind(idi,0,offset)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore
    
        
# replaces the first substring idi...idf into string with new; returns
# a tuple with whole replaced string and substring that has been removed/replaced

def el_st(stringa,idi,idf,new=""):
    idip=stringa.find(idi)
    idfp=stringa.find(idf,idip)+len(idf)
    if idip>-1 and idfp>0:
        vvalore=stringa[idip:idfp]
        valore=stringa.replace(vvalore,new,1)
    else:
        vvalore=""
        valore=stringa
    return valore, vvalore

# returns a list of all substrings (beginning with idi and ending with idf)
# of a string; ; used for xml data managing too

def produci_lista(testo,idi,idf,dc=0):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf)=="":
        el=find_stringa(t,idi,idf,1)
        t=t.replace(el,"")
        #print el
        if dc==0:
            el=find_stringa(el,idi,idf,0)
        #print el
        #print
        lista.append(el)
    return lista

def produci_lista1(testo,idi,idf,dc=0):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf)=="":
        el=find_stringa(t,idi,idf,1)
        t=t.replace(el,"",1)
        #print el
        if dc==0:
            el=find_stringa(el,idi,idf,0)
        #print el
        #print
        lista.append(el)
    return lista

def messaggi():
    

    casella=leggi_pagina(u"Discussioni_utente:Alebot")
    ric=produci_lista(casella,"==","(CET)",1)
    risp=0
    for i in range(len(ric)):
        if not "<!-- letto -->" in ric[i]:
            risposta,dut=elabora_messaggio(ric[i])
            casella=casella.replace(ric[i],ric[i].replace("==\n","==\n<!-- letto -->"))
            scrivi_pagina(casella, False,"Discussioni utente:Alebot")
            scrivi_pagina(risposta+u"--~~~~",True,dut)
            risp=risp+1
        
    return "Risposta inviata a ",risp," utenti"

def elabora_messaggio(m):
    risposta1=u"== Da Alebot ==\nCiao #ut, grazie del messaggio! "
    risposta=risposta1[:]
    ut,dut,azione,aut,aggiornamenti="","","","",""
    if u"[[Discussioni_utente:" in m:
        ut=find_stringa(m,u"[[Discussioni_utente:","|")
        dut=u"Discussioni_utente:"+ut
        
    elif u"[[User talk:" in m:
        ut=find_stringa(m,u"[[User talk:","|")
        dut=u"User talk:"+ut

    

    risposta=risposta.replace(u"#ut",ut)
    
    if "leggi " in m.lower() or "esamina " in m.lower() or "controlla " in m.lower() or "read " in m.lower():
        azione="leggi"
    elif "aggiorna " in m.lower():
        azione="aggiorna"
    else:
        azione="nessuna"
        
    if azione in "leggi":
        iaut=find_stringa(m,u"[[Autore:",u"]]",1)
        paut=find_stringa(iaut,u"[[",u"]]",0)
        aut=find_stringa(iaut,u"[[Autore:",u"]]",0)
        ppaut=leggi_autore(aut)
        errore_link=False
        if ppaut=="":
            risposta=risposta+u"Purtroppo non trovo una pagina corrispondende al link autore "+iaut+u". Controlla, per favore! :-(."
            errore_link=True
        else:
            aggiornamenti=u"la pagina "+iaut+u"che la pagina è stata aggiornata recentemente."
            if ppaut == pagine_autore[aut]:
                aggiornamenti=u"che non vedo nessun aggiornamento recente della pagina: è identica a quella che conosco. "
            aggiornamenti=aggiornamenti+u"\n\nLa struttura xml dei dati contenuti è la seguente:\n\n"+parse_autore(ppaut)+u"\n"
            if aut in autori_tabelle_cronologiche:
                aggiornamenti=aggiornamenti+u"Ho trovato "+aut+" regolarmente riportato nella mia copia delle tabelle cronologiche."
            else:
                aggiornamenti=aggiornamenti+u"Non ho trovato "+aut+" nella mia copia delle tabelle cronologiche."
            
    if azione=="nessuna":
        risposta=risposta+u"Non ho trovato, nel tuo messaggio, una parola chiave che mi chieda un'azione."
    if azione=="aggiorna":
        risposta=risposta+u"Nel tuo messaggio ho trovato la parola chiave collegata all'azione ''aggiorna'' ma non sono ancora addestrato a eseguirla. "
    if azione=="leggi":
        if errore_link==False:
            risposta=risposta+u"Nel tuo messaggio ho trovato la parola chiave ''leggi'' "
            if aut>"":
                risposta=risposta+u"e il link a "+aut+u"; ho letto la pagina. Al momento posso dirti "+aggiornamenti

            else:
                risposta=risposta+u"ma non ho trovato un link valido a una pagina Autore. :-("

    return risposta,dut
    

####################### ROUTINE DA VERIFICARE ######################


# reads from it.wikisource the pages with alphabetical lists of authors and 
# gets the authors list; saves the list into a txt file (one name for row)
def leggi_elenco_autori(iniziali="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
    x=iniziali
    text=[]
    for i in range(len(x)):
        titolo="Wikisource:Elenco alfabetico degli autori "+x[i:i+1]
        t=leggi_pagina(titolo)
        text.append([titolo,t])
        print "letto "+titolo
  #  stopme()
    lista_autori=[]
    for i in range(len(text)):
        #print "parte produci lista"
        a1=produci_lista(text[i][1],"{{Template:","}}")
        lista_autori=lista_autori+a1
    lista_autori_txt=""
    for i in range(len(lista_autori)):
        lista_autori_txt=lista_autori_txt+lista_autori[i]+"\n"
    f=open("lista_autori.txt","w")
    f.write(lista_autori_txt)
    f.close()
    return "fatto"


def stampr(testo="riscontro"):
    print riscontro
    return

def infotesto(ini=1,fin=1):
    testo='{{Discussioni indice:Il cavallarizzo}}\n\nNote:\n\n<section begin="note" /><section end="note" />'
    for i in range(ini,fin):
        pagina="Discussioni pagina:Il cavallarizzo.djvu/"+str(i)
        p=leggi_pagina(pagina)
        if p=="":
            scrivi_pagina(testo,False,pagina)
            print "pagina discussione "+ str(i)+ "vuota:aggiunto infotesto"
        elif not "{{Discussioni indice:Il cavallarizzo}}" in p:
            scrivi_pagina(testo+"\n\n"+p,False, pagina)
            print "pagina discussione "+ str(i)+ "aggiunto infotesto"
        elif "{{Discussioni indice:Il cavallarizzo}}" in p:
            print "pagina discussione "+ str(i)+ "con infotesto"


def xml2csv(s):
    campi=['autore','dati','nome','cognome','iniziali','altronome',
           'pseudonimo','reale','gm_nascita','a_nascita','gm_morte',
           'a_morte','secolo1','secolo2','descrizione','wikipedia',
           'wikiquote','wikinotizie','commons','immagine','indice',
           'testi','traduzioni','citazioni']
    s=s.replace("<dati>","\t")
    for i in range(len(campi)):
        s=r(s,campi[i])
    return s
    
    
def r(fi,x,sep="\t"):
    x1="<"+x+">"
    x2="</"+x+">"
    fi=fi.replace(x1,"")
    fi=fi.replace(x2,"\t")
    return fi

# elabora databox + xml
def databox_xml(iniziali="Z"):
    leggi_elenco_autori(iniziali)
    leggi_pagine(lista="lista_autori.txt",aggiorna=False)
    return "Fatta revisione databox e xml degli autori con iniziali "+iniziali



def nuovo_riscontro(autore):
    r=riscontro[:]
    date=""
    if cerca(autore,"a_nascita").isdigit() and cerca(autore,"a_nascita").isdigit():
        date=" x"
    prof_naz=""
    if len(cerca(autore,"a_nascita"))>0:
           prof_naz=" x"
    wikipedia=""
    if len(cerca(autore,"wikipedia"))>0:
           wikipedia=" x"
    wikiquote=""
    if len(cerca(autore,"wikiquote"))>0:
           wikiquote=" x"
    commons=""
    if len(cerca(autore,"commons"))>0:
           commons=" x"
    foto=""
    if len(cerca(autore,"immagine"))>0:
           foto=" x"
    r=r.replace("| autore=","| autore="+autore)
    r=r.replace("| date=","| date="+date)
    r=r.replace("| prof_naz=","| prof_naz="+prof_naz)
    r=r.replace("| wikipedia=","| wikipedia="+wikipedia)
    r=r.replace("| wikiquote=","| wikiquote="+wikiquote)
    r=r.replace("| commons=","| commons="+commons)
    r=r.replace("| foto=","| foto="+foto)
    r=r.replace("NomeAutore",autore.replace(" ","_"))
    r=r.replace("| data_controllo=", "| data_controllo= "+oggi+" bot")
    return r
    
    
                
    
    
    

##procedure list
def cerca(autore,dato=""):
    dati_autore=find_stringa(autori,"<autore>"+autore,"</autore>",1)
    if not dato == "":
        tag1,tag2="<"+dato+">","</"+dato+">"
        dato_autore=find_stringa(dati_autore,tag1,tag2)
    else:
        dato_autore=dati_autore
    
    return dato_autore
    



def nuovi_riscontri(numero=5):
    an=confronta_autori_tabella()
    t_an=[]
    for i in range(len(an)):
        print an[i]
        if cerca(an[i])>"":
            #print nuovo_riscontro(an[i])
            t_an.append([an[i],nuovo_riscontro(an[i])])
        print
    return t_an
    
    

def confronta_autori_tabella():
    #leggi_elenco_autori()
    f=open("lista_autori.txt")
    elenco_autori=f.read().split("\n")
    f.close()
    tabella=leggi_pagina(u"Progetto:Qualità/Tabella degli autori").replace("_"," ")
    s=produci_lista(tabella,"{{/","}}")
    segmenti=[]
    for i in range(len(s)):
        if "Iniziale" in s[i]:
            segmenti.append(s[i])
    tabella=""
    for i in segmenti:
        tabella=tabella+leggi_pagina(u"Progetto:Qualità/Tabella degli autori"+"/"+i).replace("_"," ")
            
    elenco_autori_tabella=produci_lista(tabella,"Autore:","/Riscontro")
##    print "Elenco autori presenti in tabella ma non in lista autori"
##    for i in range(len(elenco_autori_tabella)):
##        if not elenco_autori_tabella[i] in elenco_autori:
##            print elenco_autori_tabella[i]
    
    autori_nuovi=[]
    for i in range(len(elenco_autori)):
        if not elenco_autori[i] in elenco_autori_tabella:
            autori_nuovi.append(elenco_autori[i])
            
    return autori_nuovi

# reads from text file the list of authors' names, splits it into a python list 
# and reads the authors' pages, getting the data template; saves all templates content
# as text into a txt file

def leggi_pagine(lista="lista_autori.txt",aggiorna=False):
    print "Parametro Aggiorna impostato su False; i dati xml non saranno aggiornati su wikisource"
    f=open(lista)
    lista_autori=f.read().split("\n")
    f.close()
    fo=open("aut_xml.txt","w")
    for i in range(len(lista_autori)):
        if len(lista_autori[i])>0:
            autore=leggi_pagina(t2u("Autore:"+lista_autori[i]))
            autore=find_stringa(autore,"{{Autore","}}", 1)
            template=autore
            autore_xml=parse_autore(autore)
            if aggiorna:
                databox(lista_autori[i],template,"\n\n<!-- DATI XML AUTORE\n"+autore_xml+"\n -->")
            print "Letto "+lista_autori[i]; 
            fo.write(autore_xml)
            print ".. e scritto"
    fo.close()
    return "Fatto!"
        
# Writes a databox into Template:Cognome Nome/Dati
def databox(autore,template_autore,xml):
    template=template_autore[:]
    template=template.replace("{{Autore","{{subst:Autore1")+xml
    nome_pagina=t2u("Template:"+autore+"/Dati")
    #print template
    scrivi_pagina(template,False,nome_pagina)
    return 

    
    



# Authors' data managing

# Reads txt file with Authors' templates, calls "parser" and writes the result into a txt file
def parse_lista_autori(lista):
    dati=""
    pagine_autori=carica("autori_pagina.pcl")
    for i in range(len(lista)):
        elemento=parse_autore(pagine_autori[lista[i]])
        dati=dati+elemento
    f=open("dati_xml_autori.txt","w")
    f.write(dati)
    f.close()
    return dati

    
# test unused routine: builds a table from an old list-based data set
def tabella_autori(iniziale="A"):
    dati=carica("voc_dati_autori_new.pcl")
    tabella="{|\n"
    tabella=tabella+"|'''Cognome e nome'''||'''Data nascita e morte'''||'''Descrizione'''||'''Testi disponibili'''\n"
    l_a=dati.keys()
    l=[]
    for i in range(len(l_a)):
        if dati[l_a[i]][2]==iniziale:
            l.append([dati[l_a[i]][1],  l_a[i]])
    l.sort()
    for i in range(len(l)):
        l[i]=l[i][1]
        el1="[[Autore:"+l[i]+"|"+dati[l[i]][1]+", "+dati[l[i]][0]+"]]"
        el1=el1.replace("|, ","|")
        el2=dati[l[i]][6]+" "+dati[l[i]][7]+" - "+dati[l[i]][8]+" "+dati[l[i]][9]
        el3=dati[l[i]][12]
        el4=dati[l[i]][19]
        riga="|-\n|"+el1+"||"+el2+"||"+el3+"||"+el4+"\n"
        tabella=tabella+riga
    tabella=tabella+"|}\n"
    return tabella

# test unused routine: builds a dictionary of entries into Autore template
def var_autore():
    voc_var={'citazioni': 21, 'professione e nazionalit\xc3\xa0': 12, 'testi': 19, 'indice contenuti': 18, 'anno nascita': 7, 'secolo': 10, 'nome': 0, 'secondo secolo': 11, 'nome immagine': 17, 'giorno e mese nascita': 6, 'altro nome': 3, 'nome reale': 5, 'pagina commons': 16, 'pagina wikipedia': 13, 'iniziale cognome': 2, 'pseudonimo': 4, 'pagina wikinotizie': 15, 'traduzioni': 20, 'anno morte': 9, 'cognome': 1, 'giorno e mese morte': 8, 'pagina wikiquote': 14}
    return voc_var



# unused routine for Page: namespace.
# It reads Pagina: pages from page ini to page fin into a string 
# legge da it.wikisource le pagine Pagina dalla pagina ini alla pagina fin
# e le carica in una lista di liste [numero pagina,testo pagina]
def leggi_indice(name,ini,fin):
    text=[]
    for i in range(ini,fin):
        t=u2t(leggi_pagina("Pagina:"+name+".djvu/"+str(i)))
        text.append([i,t])
    stopme()
    return text

def leggi_pagina_indice(pagina=u"Indice:Poesie inedite di Silvio Pellico"):
    x=leggi_pagina(pagina)
    l=produci_lista(x,u"[[Pagina",u"]]",1)
    for i in range(len(l)):
        l[i]=find_stringa(l[i],u"Pagina:",u".jpg",1)
    return l

##unicode translations:

#cp1252->utf-8
def c2u(testo):
    testo=unicode(testo,"cp1252")
    testo=testo.encode("utf-8")
    return testo

def u2c(testo):
    testo=unicode(testo,"utf-8")
    testo=testo.encode("cp1252")
    return testo
#utf-8->unicode
def t2u(stringa):
    return unicode(stringa,"utf-8")

# unicode->utf-8
def u2t(stringa):
    return stringa.encode("utf-8")

La routine che converte le intestazioni devo sistemarla un po' prima di passartela. Nel frattempo, monta Ale.py.