Progetto:Bot/Programmi in Python per i bot/aubrey.py

Da Wikisource.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wikipedia
import pickle
import catlib
import pagegenerators
import table2wiki
from datetime import date
from time import gmtime, strftime
from random import random

__version__ = '0.7'

a="{{"
b="}}"
# richieste supportate:

# table2wiki
# Aggiorna tabella indici
# Aggiorna tabella SAL indici
# aggiungi infotesto


def richieste_bot():
    pr=list_in_cat("Bot calls")
    if len(pr)>0:
        pagina=pr[0]
        testo_pagina=leggi_pagina(pagina)
        richiesta=find_stringa(testo_pagina,"{{ToAlebot","}}",1)
        if not "|done=yes}}" in richiesta:
                richiesta_pendente=richiesta
                richiesta_fatta=richiesta_pendente.replace("}}","|done=yes}}")
                testo_pagina=esegui_richiesta(richiesta,pagina,testo_pagina)
                testo_pagina=testo_pagina.replace(richiesta_pendente,richiesta_fatta)
        scrivi_pagina(testo_pagina, False, pagina, "Alebot edit: bot call"+richiesta)
        print "Richiesta eseguita"
    else:
        print "Nessuna richiesta pendente"
    return

def esegui_richiesta(richiesta,pagina,testo_pagina):
    r=find_stringa(richiesta,"{{ToAlebot","}}").split("|")
    r_user=""
    r_page=""
    
    for i in range(len(r)):
        if r[i].lower().startswith("user="):
            r_user=r[i]
        if r[i].lower().startswith("page="):
            r_page=r[i]
    rx=r[:]
    r=[]
    for i in rx:
        if not i in (r_user,r_page):
            r.append(i)
            
        
    print r,r_user,r_page
    print "Richiesta da eseguire:",r[0]
    
    if r[0].lower()=="table2wiki":
        h2w=table2wiki.Table2WikiRobot(None)
        testo_pagina=h2w.markActiveTables(testo_pagina)
        testo_pagina=h2w.convertTable(testo_pagina)[0]
        del h2w
    if r[0].lower()=="roadmap autore":

#######
        autore,note=dati_autore(pagina)
        note=verifica_databox_autore(autore)
        note=verifica_tavole_cronologiche(autore)
        note=verifica_ricorrenze(autore)

#######

        
    elif r[0].lower()==u"qualità":
        azione=bot_qual(pagina,"",richiesta)
    elif r[0].lower()=="aggiorna tabella indici":
        x=prepara_tabella_indici(True,True)
    elif r[0].lower=="aggiorna tabella sal indici":
        x=tabella_indici("Progetto:Trascrizioni/Tabella SAL indici",True)
    elif r[0].lower()=="aggiungi infotesto":
        if r_page=="":
            pagina_base=pagina
        else:
            pagina_base=r_page.replace("page=","")
        x=infotesto(pagina_base)
    elif r[0].lower()=="apostrofi":
        if r_page=="":
            pagina_base=pagina
        else:
            pagina_base=r_page.replace("page=","")
        x=vao(pagina_base)
        testo_pagina=leggi_pagina(pagina_base)
        
    return testo_pagina

def vao(link_pagina,numero_pagine=1):
    pag=leggi_pagina(link_pagina)
    print pag
    if pag>"" and not "#REDIRECT" in pag:
        pagine=leggi_capitoli(link_pagina,numero_pagine)
        #print "lista pagine da leggi_capitoli:", pagine
        pagine[0:0]=[link_pagina]
        #print "lista pagine dopo aggiunta pagina_base:", pagine
        for r in pagine:
            pag=leggi_pagina(r)
            if pag>"" and not "#REDIRECT" in pag in pag:
                pag1=apos(pag)
                if pag1!=pag:
                    scrivi_pagina(pag1,False,r)
                    #print pag1
                else:
                    print "Pagina",r,"esaminata ma non modificata"
            
        
    else:
        note="Pagina inesistente o redirect."

    return

def apos(p=""):
    if p=="":

        p='''prova ''test'' <test1> prova' test {{test2<br />}} prova test
<test1> prova test [[test3' {{test2' <br />}} ]]
prova [test4] prova' http://www.alex'.com prova '''
    lista=[]
    p1=p[:]
    ne=0
    l=produci_lista(p1,u"<",u">",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            
    l=produci_lista(p1,u"[[",u"]]",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
    l=produci_lista(p1,u"[",u"]",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
    l=produci_lista(p1,u"http://",u" ",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
    l=produci_lista(p1,u"{{",u"}}",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
    #return p1
    if "'''" in p1:
        p1=p1.replace("'''","#ebold#")
        lista.append(("'''","#ebold#"))
    if "''" in p1:
        p1=p1.replace("''","#eitalic#")
        lista.append(("''","#eitalic#"))
    if not "'" in p1:
        #non vi sono apostrofi tipografici nel testo modificabile,
        #la stringa viene restituita immutata
        return p                  
    #qui modificare p1
    
    p1=p1.replace(u"'",u"’")
##    p1=p1.replace(u"’’’",u"'''")
##    p1=p1.replace(u"’’",u"''")

    lista.reverse()
    p2=p1[:]
    for r in lista:
        p2=p2.replace(r[1],r[0])

    return p2

def bot_qual(nome_pagina, testo_pagina, richiesta):
    # {{Qualità|avz=101%|data=30 aprile 2009|arg=poemi}}
    testo_pagina=leggi_pagina(nome_pagina)
    schemaq= u"{{Qualità|avz=xx|data="+oggi()+"|arg=}}"
    r=find_stringa(richiesta, "{{","}}").split("|")
    print r
    q=r[2].replace("%","").replace("avz=","")
    r[3]=r[3].replace("arg=","")
    print "Valore q:",q
    if q in "25,50,75,100":
        defaultq=schemaq.replace("xx",q+"%")
        if len(r)==4:
            defaultq=defaultq.replace("arg=","arg="+r[3])
        
        print "Qualità:", defaultq
        xx= find_stringa(testo_pagina,u"{{Qualità",u"}}") 
        print "find_stringa:",xx
        if not find_stringa(testo_pagina,u"{{Qualità",u"}}"):
            print "assegno a", nome_pagina, defaultq
            testo_pagina=defaultq+testo_pagina
            testo_pagina=testo_pagina.replace(richiesta,"")
            scrivi_pagina(testo_pagina, False,nome_pagina,"Alebot: Assegno SAL "+q+"%")
    if not "/" in nome_pagina:
        pagine=leggi_capitoli(nome_pagina,numero_pagine=0)
        print pagine
        for nome_pagina in pagine:
            if not "Cavalleria rusticana" in nome_pagina:
                testo_pagina=leggi_pagina(nome_pagina)
                if not find_stringa(testo_pagina,u"{{Qualità",u"}}"):
                    print "assegno a", nome_pagina, defaultq
                    testo_pagina=defaultq+testo_pagina
                    testo_pagina=testo_pagina.replace(richiesta,"")
                    scrivi_pagina(testo_pagina, False,nome_pagina,"Alebot: Assegno SAL "+q+"%")
                else:
                    print "Non assegno qualità a", nome_pagina
    return "Fatto"

def leggi_capitoli(titolo,numero_pagine=1):
    if not "Indice:" in titolo:
        pagina=leggi_pagina(titolo)
        if "{{testo|" in pagina:
            pagina=pagina.replace("{{testo|","{{Testo|")
        capitoli=produci_lista(pagina,"{{Testo|","}}")
        for i in range(len(capitoli)):
            if "|" in capitoli[i]:
                capitoli[i]=capitoli[i][:capitoli[i].find("|")]
            #p=leggi_pagina(capitoli[i])
            #print capitoli[i], len(p)
    else:
        pagina=leggi_pagina(titolo)
        if "<pagelist" in pagina:
            capitoli=[]
            nome_base=titolo.replace("Indice:","")
            if not ".djvu" in nome_base:
                nome_base=nome_base+".djvu"
            print nome_base
            numero_pagine=cerca(nome_base)
            pg=titolo.replace("Indice:","Pagina:")
            for i in range(numero_pagine):
                capitoli.append(pg+"/"+str(i+1))
                

        else:
            capitoli=produci_lista(pagina,"[[","|")
        
    print capitoli
    return capitoli

def cerca(p="Il cavallarizzo.djvu"):
    pag="Pagina:"+p+"/"
    print pag
    ma=1000
    mi=0
    while True:
        vc=ma
        p=leggi_pagina(pag+str(vc))
        if p=="":
            ris="Troppo"
        else:
            ris="Poco"
        print pag+str(vc),ris
        if ris=="Troppo":
            test=leggi_pagina(pag+str((ma+mi)/2))
            if test=="":
                ma=(ma+mi)/2
            else:
                mi=(ma+mi)/2
        
                              
        #print "Tento ",mi,ma
        if ma-mi<2:
            break
    return mi

def oggi():
    oggi=date.today()
    oggi=oggi.isoformat().split("-")
    print oggi
    mesi=["gennaio","febbraio","marzo","aprile","maggio","giugno", "luglio","agosto","settembre","ottobre","novembre","dicembre"]
    mese=oggi[1]
    if mese.startswith("0"):
        mese=mese[1:]
    mese=eval(mese)-1
    oggi=oggi[2] +" "+ mesi[mese] +" "+oggi[0]
    return oggi
# riceve il titolo di una pagina testuale principale e restituisce la lista
# della pagine elencate nellasua sezione indice all'interno di un tl|Testo.
# Il formato della lista è [[titolo,""],[titolo,""]...] per uniformarlo all'analogo
# script per le pagine indice
def elenco_capitoli(titolo):
    pagina=leggi_pagina(titolo)
    if "{{testo|" in pagina:
        pagina=pagina.replace("{{testo|","{{Testo|")
    capitoli=produci_lista(pagina,"{{Testo|","}}")
    for i in range(len(capitoli)):
        if "|" in capitoli[i]:
            capitoli[i]=capitoli[i][:capitoli[i].find("|")]
        capitoli[i]=[capitoli[i], ""]                  
    return capitoli

# riceve il titolo di una pagina Indice e restituisce la lista
# della pagine, sia che siano presenti, sia che siano "link rossi".
# Il formato della lista è [[titolo,qualità],[titolo,qualità]...] dove qualità
# è uno dei valori quality0,...quality4, new.
def elenco_pagine_indice(indice):
    elenco_pagine=[]
    #inizializzazione oggetto Page su pagina indice
    site=wikipedia.getSite()
    page=wikipedia.Page(site,indice)

    # calcolo nome x url
    nomeindice="/wiki/"+page.urlname()
    
    #lettura HTML originario (prima delle alterazioni js)
    testo=leggi_pagina_html(nomeindice)
    
    #ricerca di tutti i tag <a href..>...</a> e salvataggio su file
    pagine=produci_lista(testo,'<a href="',"</a>",1)
    titoli=[]
    for i in pagine:
        if ('title="Pagina:' in i) and ("class=" in i):
            titolo=find_stringa(i,'title="','"').replace(" (tuttora non scritto)","")
            qp=find_stringa(i,'class="','"')
            if not titolo in titoli:
                elenco_pagine.append([titolo,qp])
                titoli.append(titolo)

    return elenco_pagine
        
# ricevuta una pagina Indice, analizza il PageQuality di ciascuna delle sue
# pagine, valuta il SAL complessivo dell'indice, lo scrive o lo aggiorna,
# e restituisce la valutazione complessiva in una riga di testo, e la lista
# delle pagine. 
    

def qualityPagine(indice="Indice:Narcissa.djvu"):
    '''calcola la qualità delle pagine di un indice

Restituisce una riga della tabella "Elenco indici"''' 
    testo_wiki=leggi_pagina(indice)

    #lettura qualità
    template_qualita=find_stringa(testo_wiki,u"{{Qualità|","}}",1)
    if template_qualita=="":
        template_qualita=u"{{Qualità|avz=00%|data=11 settembre 2009|arg=}}"

    template_qualita_valore=find_stringa(template_qualita,"avz=","|")
    print indice,template_qualita,template_qualita_valore

# interroga elenco_pagine_indice e rivene una lista dei titoli pagina e qualità
    pagine=elenco_pagine_indice(indice) #new
    conteggi={"quality0":0,"quality1":0,"quality2":0,"quality3":0,"quality4":0,"new":0, }
    #lista_quality1=[]
    djvu=False
    for i in pagine:
        if not djvu: # controllo djvu
             if ".djvu" in i[0]:
                djvu=True
                break
    
    for i in pagine:    
        conteggi[i[1]]+=1 # contatore pagine di diversa qualità
    print conteggi
    riga='''|-\n|align=left|{{testo|indice}}||si||qnew||q0||q1||q2||q3||q4\n'''
    riga=riga.replace("indice",indice).replace("qnew",str(conteggi["new"]))
    riga=riga.replace("q2",str(conteggi["quality2"]))
    riga=riga.replace("q3",str(conteggi["quality3"])).replace("q4",str(conteggi["quality4"]))

    #analisi pagine quality1 se non sono >20
    if conteggi["quality1"]<21:
        for i in pagine:
            if 'quality1' in i[1]:
                p=leggi_pagina(i[0])
                if "PageQuality|0" or '<pagequality level="0"' in p:
                    conteggi["quality1"]=conteggi["quality1"]-1
                    conteggi["quality0"]=conteggi["quality0"]+1
    # calcolo qualità complessiva
    qi="100%"
    if conteggi["quality3"]>0:
        qi="75%"
    if conteggi["quality2"]>0:
        qi="50%"
    if conteggi["quality1"]>0 or conteggi["new"]>0:
        qi="25%"
        
    riga=riga.replace("q0",str(conteggi["quality0"])).replace("q1",str(conteggi["quality1"]))    
    riga=riga.replace("||0","||<br />")
    print riga
    
    if not djvu:
        riga=riga.replace("||si||","||no||")
    #print riga
    print "Qualità indice rivalutata:",qi,"vs.",template_qualita_valore
            
    if not qi == template_qualita_valore:
        template_qualita_new=template_qualita.replace(template_qualita_valore,qi)
        if u"{{Qualità|avz" in testo_wiki:
            testo_wiki=testo_wiki.replace(template_qualita,template_qualita_new)
        else:
            testo_wiki=testo_wiki.replace("Sommario=","Sommario="+template_qualita_new+"\n")
        scrivi_pagina(testo_wiki,False,indice,commento=u"Aggiornata Qualità indice")
    return riga,pagine

## Riesamina analiticamente il SAL di tutte le pagine indice (e loro pagine)
## e ricostruisce la tabella riassuntiva.
def tabella_indici(pagina_tabella="Progetto:Trascrizioni/Tabella SAL indici",scrivi=True):
    l=list_in_cat("Sommari")
    tabella=[]
    for indice in l:
        print indice
        tabella.append(qualityPagine(indice)[0])
    tabella.sort()
    tabella=u'''{{ToAlebot|Tabella indici|done=yes}}

{|{{prettytable|width=90%|text-align=center}}
|text-align=left width=35%|Titolo||djvu||pagine mancanti||pagine 00%||pagine 25%||pagine 50%||pagine 75%%||pagine 100%
|-
'''+u"\n".join(tabella)+u"\n|}"
    if scrivi:
        scrivi_pagina(tabella,False,pagina_tabella)
    return 







def list_in_cat(category_name,site="it"):
    site = wikipedia.getSite()
    cat = catlib.Category(site,'Category:'+category_name)
    gen = pagegenerators.CategorizedPageGenerator(cat)
    page_list=[]
    for page in gen:
    #Do something with the page object, for example:
        page_list.append(page.title())
    return page_list

      
def infotesto(pagina_base):
    if pagina_base.startswith("Indice:"):
        lista_pagine=elenco_pagine_indice(pagina_base)
        daTranscludere="{{"+pagina_base.replace("Indice:","Discussioni indice:")+"}}"
    else:
        lista_pagine=elenco_capitoli(pagina_base)
        daTranscludere="{{Discussione:"+pagina_base+"}}"
    print  lista_pagine
    for i in lista_pagine:
        if i[0].startswith("Pagina:"):
            pagina_corrente=i[0].replace("Pagina:","Discussioni pagina:")
        else:
            pagina_corrente="Discussione:"+i[0]
        if leggi_pagina(pagina_corrente)=="":
            scrivi_pagina(daTranscludere,False,pagina_corrente)
        else:
            print pagina_corrente,"OK"
    return
                
 
##wiki reading/writing
                      
def leggi_pagina(nome_pagina=u"Utente:Alex brollo",site="it"):
    #site = wikipedia.getSite()
    page = wikipedia.Page(site, nome_pagina)
    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
                  

# 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",commento="Edit by Alebot"):
    site = wikipedia.getSite()
    page = wikipedia.Page(site, nome_pagina)
    wikipedia.setAction=commento
    if aggiungi:
        contenuto = page.get()
        page.put(contenuto+u"\n\n"+testo,comment=commento)
    else:
        page.put(testo,comment=commento)
    wikipedia.stopme()
    return "Fatto"





def carica_pagine_indice():
    indici=list_in_cat("Sommari")
    indici_dump=[]
    for i in range(len(indici)):
        x=leggi_pagina(indici[i])
        xx=find_stringa(leggi_pagina(indici[i].replace("Indice:","Discussioni indice:")), u"{{Infotesto",u"}}",1)
        indici_dump.append("<!--NomeIndice:"+indici[i]+"-->\n"+x+xx)
        print indici[i]
    salva_pcl(indici_dump,"indici_dump")
        
    return indici, indici_dump

def prepara_tabella_indici(leggi=True,scrivi=True):
    if leggi:
        indici,indici_dump=carica_pagine_indice()
    else:
        indici=list_in_cat("Sommari")
        print "Trovati", len(indici), "indici"
        indici_dump=carica_pcl("indici_dump")
                               
    #riga=u'''|-\n|{{Testo|§indice}}||[[Autore:§autore|§autore]]||{{Testo|§nome opera}}||§edizione||§città di edizione||§anno||[§fonte <small>fonte</small>]\n'''
    riga=u'''|-
|style="background:#eeeeee;font-size:90%"|{{Testo|§indice}}
|style="background:#eeeeee;font-size:90%"|[[Autore:§autore|§autore]]
|style="background:#eeeeee;font-size:90%"|{{Testo|§nome opera}}
|style="background:#eaeaea;font-size:90%"|§edizione
|style="background:#eaeaea;font-size:90%"|§città di edizione
|style="background:#eaeaea;font-size:90%"|§anno
|style="background:#e6e6e6;font-size:90%"|[§fonte <small>fonte</small>]
'''


    header=u'''La tabella è scritta da [[Utente:Alebot|Alebot]] sulla base dei contenuti di [[:Categoria:Sommari]], delle pagine Indice e testuale e dei relativi Infotesto. Non modificare i contenuti, ogni modifica sarebbe
comunque azzerata dalla successiva riscrittura della pagina da parte del bot. 

Ultimo aggiornamento:{{subst:CURRENTDAY}} {{subst:CURRENTMONTH}} {{subst:CURRENTYEAR}}


{| {{prettytable|width=100%|text-align=left}}
| colspan="7" align="center" style="background:#D0F0C0"|\'\'\'Tabella delle pagine Indice\'\'\'
|-
!width=25% align="center" style="background:#D0F0C0;font-size:90%"|\'\'\'Indice\'\'\'
!width=10% align="center" style="background:#D0F0C0;font-size:90%"|\'\'\'Autore\'\'\'
!width=25% align="center" style="background:#D0F0C0;font-size:90%"|\'\'\'Versione testuale\'\'\'
!width=15% align="center" style="background:#FFFF66;font-size:90%"|\'\'\'Edizione\'\'\'
!width=10% align="center" style="background:#FFFF66;font-size:90%"|\'\'\'Città\'\'\'
!width=5% align="center" style="background:#FFFF66;font-size:90%"|\'\'\'Anno\'\'\'
!width=5% align="center" style="background:#ccccff;font-size:90%"|\'\'\'Fonte web\'\'\'
'''
    #header=header+u"!width=25%|'''Indice'''||width=10%|'''Autore'''||width=25%|'''Versione testuale'''||width=15%|'''Edizione'''||width=10%|'''Città'''||width=5%|'''Anno'''||width=5%|'''Fonte'''\n"
    footer=u"|}\n"
    tabella=header
    for i in range(len(indici)):
        print "Passo ",i
        dati=dati_indice(indici_dump[i])
        for j in dati.keys():
            if dati[j]=="":
                dati[j]="<br />"
        # autore, nome opera, edizione, citta di edizione, anno
        if dati["Autore"]=="<br />":
            riga_c=riga.replace(u"[[Autore:§autore|§autore]]",dati["Autore"])
        else:           
            riga_c=riga.replace(u"§autore",dati["Autore"])
        riga_c=riga_c.replace(u"§indice",indici[i])
        if dati["NomePagina"]=="<br />":
            riga_c=riga_c.replace(u"[[§nome opera]]",dati["NomePagina"])
        else:
            riga_c=riga_c.replace(u"§nome opera",dati["NomePagina"])
        riga_c=riga_c.replace(u"§edizione",dati["Editore"])
        riga_c=riga_c.replace(u"§città di edizione",dati[u"Città"])
        riga_c=riga_c.replace(u"§anno",dati["Anno"])
        if dati["Fonte"]=="<br />":
            riga_c=riga_c.replace(u"[§fonte <small>fonte</small>]",dati["Fonte"])
        else:
            riga_c=riga_c.replace(u"§fonte",dati["Fonte"])
        #riga_c=riga_c.replace(u"§sal","<br />")
        tabella=tabella+riga_c
    tabella=tabella+footer
    if scrivi:
        scrivi_pagina(tabella,False,"Progetto:Trascrizioni/Tabella delle pagine Indice")
    else:
        return tabella

    return "Fatto"


def list_in_cat(category_name,site="base"):
    site = wikipedia.getSite()
    cat = catlib.Category(site,'Category:'+category_name)
    gen = pagegenerators.CategorizedPageGenerator(cat)
    page_list=[]
    for page in gen:
    #Do something with the page object, for example:
        page_list.append(page.title())
    return page_list
# Routine generiche
# dumps a variable

def salva(variabile,nome_file="dato"):
    nome_file="dati/"+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"):
    nome_file="dati/"+nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()
    return "Variabile salvata nel file "+nome_file




## 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


# 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 carica_pcl(nome_file, folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto

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
####
# Dati e routine per roadmap autore
####
dic={}
riscontro=u'''<noinclude>Il seguente template raccoglie i dati necessari alla corretta compilazione della Tabella autori 

=== Istruzioni ===
*\'''Date\''': Data di nascita e di morte dell'autore
*\'''Prof/Naz\''': Professione e nazionalità
*\'''Wikipedia\''': Presenza della voce su Wikipedia. X indica che su Wikisource è presente il rimando verso Wikipedia; R indica che su Wikipedia è presente il rimando verso Wikisource 
*\'''Wikiquote\''': Presenza della voce su Wikiquote. X indica che su Wikisource è presente il rimando verso Wikiquote; R indica che su Wikiquote è presente il rimando verso Wikisource 
*\'''Commons\''': Presenza della voce su Commons 
*\'''Foto\''': Presenza del ritratto o fotografia dell'autore 
*\'''Anni\''': Presenza dell'indicazione degli anni in tutte le opere elencate per le quali tale dato è disponibile 
*\'''SAL\''': Presenza dell'icona SAL in tutte le opere elencate 
*\'''Interwiki\''': Presenza degli interwiki. Indicare le sigle degli interwiki presenti. 
*\'''Controllo\''': Giorno in cui è stato effettuato il controllo

Vedi anche [[Progetto:Qualità/Tabella_degli_autori|Tabella degli autori]].


</noinclude>{{Utente:Alex_brollo/RiscontroAutore 
| autore=#NomeAutore
| link=[http://it.wikisource.org/w/index.php?title=Template:#HtmlNomeAutore/Riscontro&action=edit modifica dati]
| date=  
| prof_naz=  
| wikipedia=  
| wikiquote=  
| commons=  
| foto=  
| anni=  
| SAL=  
| interwiki=  
| data_controllo=  
}}<noinclude>[[Categoria:Template di prova]][[Categoria:Template di servizio per i progetti]]</noinclude>
'''

interlink=["[[en:", "[[fr:", "[[zh:", "[[es:", "[[de:", "[[ru:", "[[it:",\
           "[[pt:", "[[fa:", "[[th:", "[[pl:", "[[hu:", "[[he:", "[[ro:", \
           "[[cs:", "[[hr:", "[[ar:", "[[te:", "[[fi:", "[[tr:", "[[nl:", \
           "[[sv:", "[[sr:", "[[la:", "[[ja:", "[[sl:", "[[ml:", "[[uk:", \
           "[[is:", "[[bs:", "[[el:", "[[ko:", "[[id:", "[[ca:", "[[bn:", \
           "[[li:", "[[no:", "[[hy:", "[[da:", "[[az:", "[[vi:", "[[ta:", \
           "[[et:", "[[mk:", "[[bg:", "[[yi:", "[[kn:", "[[lt:", "[[sk:", \
           "[[cy:", "[[gl:", "[[zh-min-nan:", "[[ht:", "[[fo:", "[[ang:"]

note="Note:"

def verifica_databox_autore(autore):
    note=""
    #autore=find_stringa(ric,u'[[Autore:',']]',1)
    #pagina_autore=find_stringa(autore,"[[","]]")
    nome_autore=autore["pagina"].replace("Autore:","")
    
    #azione
    template_autore=find_stringa(leggi_pagina(autore["pagina"]),"{{Autore","}}\n",1)
    template_autore1=template_autore.replace("{{Autore","{{subst:Autore1")+"\n<!-- nuova versione -->"
    pagina_dati="Template:"+nome_autore+"/Dati"
    scrivi_pagina(template_autore1,False,pagina_dati)
    # fine azione

    note=scrivi_template_riscontro(autore)
    note=verifica_tabella_autori(autore)
    if note=="":
        note="Databox, riscontro, tabella autori OK."
    
    return note
def verifica_tabella_autori(autore):
    iniziale=autore["iniziale"]
    if iniziale in "A":
        n=1
    elif iniziale in "BC":
        n=2
    elif iniziale in "DEFGH":
        n=3
    elif iniziale in "IJKLM":
        n=4
    elif iniziale in "NOPQ":
        n=5
    else:
        n=6
    nome_tabella=u"Progetto:Qualità/Tabella degli autori/"+str(n)
    tabella=leggi_pagina(nome_tabella)
    if not autore["pagina"].replace("Autore:","Template:") in tabella:
        print autore["pagina"],"mancante in",nome_tabella
        tabella=tabella.split("\n")
        riga="{{"+autore["pagina"].replace("Autore:","Template:")+"/Riscontro}}"
        riferimento_autore=autore["cognome"]+" "+autore["nome"].strip()
        if not riferimento_autore[0:1]==iniziale:
            r=riferimento_autore.split()
            for i in range(len(r)):
                if r[i][0:1]==iniziale:
                    riferimento_autore=r[i]
                    break
        for i in range(len(tabella)):
            if u"IntestazioneTabella|"+iniziale in tabella[i]:
                p=i+1
                break
        for i in range(p,len(tabella)):
            if u"IntestazioneTabella|" in tabella[i] or "<noinclude>" in tabella[i]:
                tabella[i:i]=[riga]
            else:
                riferimento=find_stringa(tabella[i],"{{Template:","/Riscontro").split()
                for j in range(1,len(riferimento)):
                    if riferimento[j][0:1]==iniziale:
                        riferimento=riferimento[j]+" "+riferimento[0]
                        break
                    elif j==len(riferimento)-1:
                        riferimento=" ".join(riferimento)
            if riferimento_autore<riferimento:
                tabella[i:i]=[riga]
                break

        print riferimento_autore, riferimento
        tabella="\n".join(tabella)
        scrivi_pagina(tabella,False,nome_tabella)
        note=""
    else:
        print "La pagina",nome_tabella,"contiene",autore["pagina"]
        note=""
    return note

def verifica_tavole_cronologiche(autore):
    riga,note=tavole_cronologiche(autore)
    riga="  "+riga
    
    if note=="OK":# and find_stringa(riga,"from:","till:").strip().isdigit():
        from_autore=eval(find_stringa(riga,"from:","till:"))
        pagina1,pagina2=pagine_cronologia(riga)
        pagina=leggi_pagina(pagina1)
        if autore["pagina"] in pagina:
            print "OK in ",pagina1
        else:
            pagina=pagina.split("\n")
            r=[]
            for i in range(len(pagina)):
                if u'text:"[[Autore:' in pagina[i]:
                    r.append(i)
            for i in range(len(r)):
                if from_autore<=eval(find_stringa(pagina[r[i]],"from:","till")):
                    pagina[r[i]:r[i]]=[riga]
                    break
                elif i==len(r)-1:
                    pagina[r[i]+1:r[i]+1]=[riga]
            pagina="\n".join(pagina)
            scrivi_pagina(pagina,False,pagina1)
        if pagina1 != pagina2:
            pagina=leggi_pagina(pagina2)
            if autore["pagina"] in pagina:
                print "OK in ",pagina2
            else:
                pagina=pagina.split("\n")
                r=[]
                for i in range(len(pagina)):
                    if u'text:"[[Autore:' in pagina[i]:
                        r.append(i)
                for i in range(len(r)):
                    if from_autore<=eval(find_stringa(pagina[r[i]],"from:","till")):
                        pagina[r[i]:r[i]]=[riga]
                        break
                    elif i==len(r)-1:
                        pagina[r[i]+1:r[i]+1]=[riga]
                pagina="\n".join(pagina)
                scrivi_pagina(pagina,False,pagina2)
        
    return note
def pagine_cronologia(riga):
    ''' riceve una riga autore-cronologia e restituisce i nomi pagina periodo storico-secolo

    '''
    
    dn=eval(find_stringa(riga,"from:","till:"))
    dm=eval(find_stringa(riga,"till:","text:"))
    
    if dn>-500 and dn<501:
        pagina1=u"Wikisource:Tavole cronologiche degli autori dell'Antichità"
    elif dn<1001:
        pagina1=u"Wikisource:Tavole cronologiche degli autori dell'Alto Medioevo"
    else:
        secolo=romani(dn/100+1)
        pagina1=u"Wikisource:Tavole cronologiche degli autori del "+secolo+" secolo"
    if dm>-500 and dm<501:
        pagina2=u"Wikisource:Tavole cronologiche degli autori dell'Antichità"
    elif dm<1001:
        pagina2=u"Wikisource:Tavole cronologiche degli autori dell'Alto Medioevo"
    else:
        secolo=romani(dm/100+1)
        pagina2=u"Wikisource:Tavole cronologiche degli autori del "+secolo+" secolo"
    return pagina1,pagina2

def romani(n):
    r=",I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII,XIII,XIV,XV,XVI,XVII,XVIII,XIX,XX,XXI"
    r=r.split(",")
    return r[n]

def scrivi_template_riscontro(autore):
    '''Se manca scrive un template nomeautore/riscontro

    Riceve il dizionario Autore e restituisce eventuali note'''
    note=""
    # crea indirizzo pagina
    template_riscontro=u"Template:#1/Riscontro"
    nome_autore=autore["pagina"].replace("Autore:","")
    nome_autore_html=nome_autore.replace(" ","_")
    template_riscontro=template_riscontro.replace("#1",nome_autore_html)
    #leggi pagina
    pag_riscontro=leggi_pagina(template_riscontro)

    #se la pagina non esiste o è un reditect creala
    if len(pag_riscontro)==0 or pag_riscontro==u"#REDIRECT":
        
        pag_riscontro=riscontro
        pag_riscontro=pag_riscontro.replace(u"#NomeAutore",nome_autore)
        pag_riscontro=pag_riscontro.replace(u"#HtmlNomeAutore",nome_autore_html)
        if len(autore["gm_nascita"])>0 and len(autore["a_nascita"])>0 and len(autore["gm_morte"])>0 and len(autore["a_morte"])>0:
            pag_riscontro=pag_riscontro.replace(u"| date= ",u"| date= "+"x")
        if len(autore["prof_naz"])>0:
            pag_riscontro=pag_riscontro.replace(u"| prof_naz= ",u"| prof_naz= "+"x")
        if len(autore["wikipedia"])>0:
            pag_riscontro=pag_riscontro.replace(u"| wikipedia= ",u"| wikipedia= "+"x")
        if len(autore["wikiquote"])>0:
            pag_riscontro=pag_riscontro.replace(u"| wikiquote= ",u"| wikiquote= "+"x")
        if len(autore["commons"])>0:
            pag_riscontro=pag_riscontro.replace(u"| commons= ",u"| commons= "+"x")
        if len(autore["immagine"])>0:
            pag_riscontro=pag_riscontro.replace(u"| foto= ",u"| foto= "+"x")

        interwiki=""
        testo=autore["testo_pagina"]
        for r in interlink:
            if r in testo:
                if len(interwiki)>0:
                    interwiki=interwiki+", "
                interwiki=interwiki+find_stringa(r,"[[",":")
        if len(interwiki)>0:
            pag_riscontro=pag_riscontro.replace(u"| interwiki= ",u"| interwiki= "+interwiki) 
            
        
        pag_riscontro=pag_riscontro.replace(u"| data_controllo= ",u"| data_controllo= "+strftime("%d %b %Y", gmtime())+" bot")
        scrivi_pagina(pag_riscontro,False,template_riscontro)
    else:
        pass # qui inserire la routine di revisione di una pagina esistente 

    return note

def verifica_ricorrenze(autore):
    '''verifica la presenza delle due ricorrenze per l'autore e le corregge

    '''
    dmn=autore["gm_nascita"].split()
    dmm=autore["gm_morte"].split()
    print autore["gm_nascita"],autore["gm_morte"]
    if len(dmn)==2 and dmn[1] in u"gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre":
        if autore["pagina"] in leggi_pagina("wikisource:Ricorrenze/"+autore["gm_nascita"]):
            note="Ricorrenza nascita OK; "
        else:
            aggiorna_ricorrenza(autore, "nascita")
            note="Aggiornata ricorrenza nascita; "
    else:
        note="Data nascita non conforme: "+autore["gm_nascita"]+" ;"
    if len(dmm)==2 and dmm[1] in "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre":
        if autore["pagina"] in leggi_pagina("wikisource:Ricorrenze/"+autore["gm_morte"]):
            note=note+"ricorrenza morte OK."
        else:
            aggiorna_ricorrenza(autore, "morte")
            note=note +"aggiornata ricorrenza morte."
    else:
        note=note +"data morte non conforme: "+autore["gm_morte"]+"."
    return note
    
def tavole_cronologiche(autore):
    ''' riceve dizionario autore e restituisce una riga di codice e una nota

    Se il controllo dati passa, viene restituita la riga e OK; se il controllo
    non passa, restituisce riga vuota e note descrittive dell'errore'''
    
    riga='from:#1  till:#2 text:"[[Autore:#3|#3]]" color:BarraVita'
    dn=autore["a_nascita"].strip()
    dm=autore["a_morte"].strip()
    aut=autore["pagina"].strip()
    digits=u"-0123456789 "
        
    # selezione date accettabili
    if dn=="" or dm=="":
        note="Manca anno nascita o anno morte; se vivente aggiungere manualmente"
        return "",note
    test=dn.split()
    if len(test)>2:
        note="Anno nascita non conforme"
        return "",note
    if len(test)==2 and test[1]==u"a.C.":
        dn="-"+test[0]
    elif len(test)==2 and test[1]!=u"a.C.":
    #print len(test),test[0],test[1],dn
        note="Anno nascita non conforme"
        return "",note

    test=dm.split()
    if len(test)>2:
        note="Anno morte non conforme"
        return "",note
    if len(test)==2 and test[1]==u"a.C.":
        dm="-"+test[0]
    elif len(test)==2 and test[1]!=u"a.C.":
    #print len(test),test[0],test[1],dn
        note="Anno morte non conforme"
        return "",note
    #print len(test),test[0],test[1],dm
        
    for i in dn:
        #print dn
        if not i in digits:
            #print i
            note="Anno nascita (cifre) non conforme"
            return "",note
    for i in dm:
        if not i in digits:
            note="Anno morte non conforme"
            return "",note
    dn=eval(dn)        
    dm=eval(dm)
    autn=aut.replace("Autore:","")
    riga=riga.replace("#1",str(dn))
    riga=riga.replace("#2",str(dm))
    riga=riga.replace("#3",autn)
    note="OK"
    return riga, note

def dati_autore(titolo_pagina_autore,fonte="web",dictionary=dic):
    ''' legge una pagina autore e estrae i dati

    Da rivedere per aubrey.py (escludere l'opzione dictionary)'''
    
    if fonte=="web" and not "Autore:" in titolo_pagina_autore:
        titolo_pagina_autore="Autore:"+titolo_pagina_autore.strip()
    autore_dic={}
    note=""
  
    pagina_autore=leggi_pagina(titolo_pagina_autore) # sostituisce 
    autore_dic["pagina"]=titolo_pagina_autore
    autore_dic["testo_pagina"]=pagina_autore
    if pagina_autore=="":
        note="Pagina autore inesistente"
        return autore_dic, note
    elif "REDIRECT" in pagina_autore:
        note="Pagina #Redirect"
        return autore_dic, note

    autore_dic["nome"]=find_stringa(pagina_autore,u"| Nome =","\n").strip()
    autore_dic["cognome"]=find_stringa(pagina_autore,u"| Cognome =","\n").strip()
    autore_dic["iniziale"]=find_stringa(pagina_autore,u"| Iniziale del cognome =","\n").strip()
    autore_dic["altro_nome"]=find_stringa(pagina_autore,u"| Eventuale altro nome =","\n").strip()
    autore_dic["nome_reale"]=find_stringa(pagina_autore,u"| Eventuale nome reale =","\n").strip()
    autore_dic["gm_nascita"]=find_stringa(pagina_autore,u"| Giorno e mese di nascita =","\n").strip()
    autore_dic["a_nascita"]=find_stringa(pagina_autore,u"| Anno di nascita =","\n").strip()
    autore_dic["gm_morte"]=find_stringa(pagina_autore,u"| Giorno e mese di morte =","\n").strip()
    autore_dic["a_morte"]=find_stringa(pagina_autore,u"| Anno di morte =","\n").strip()
    autore_dic["secolo"]=find_stringa(pagina_autore,u"| Secolo di attività =","\n").strip()
    autore_dic["secolo2"]=find_stringa(pagina_autore,u"| Eventuale secondo secolo di attività =","\n").strip()
    autore_dic["prof_naz"]=find_stringa(pagina_autore,u"| Professione e nazionalità =","\n").strip()
    autore_dic["wikipedia"]=find_stringa(pagina_autore,u"| Nome della pagina su Wikipedia =","\n").strip()
    autore_dic["wikiquote"]=find_stringa(pagina_autore,u"| Nome della pagina su Wikiquote =","\n").strip()
    autore_dic["wikinotizie"]=find_stringa(pagina_autore,u"| Nome della pagina su Wikinotizie =","\n").strip()
    autore_dic["commons"]=find_stringa(pagina_autore,u"| Nome della pagina su Commons =","\n").strip()
    autore_dic["immagine"]=find_stringa(pagina_autore,u"| Nome dell'immagine =","\n").strip()
    autore_dic["indice"]=find_stringa(pagina_autore,u"| Vuoi l'indice dei contenuti? =","\n").strip()
    autore_dic["testi"]=find_stringa(pagina_autore,u"| Abbiamo testi scritti dall'autore? =","\n").strip()
    autore_dic["traduzioni"]=find_stringa(pagina_autore,u"| Abbiamo traduzioni scritte dall'autore? =","\n").strip()
    autore_dic["citazioni"]=find_stringa(pagina_autore,u"| L'autore è citato in altre opere pubblicate? =","\n").strip()
    #verifiche e correzioni
    errori=False
    correzioni=False
    #controllo campi giorno/mese
    test=autore_dic["gm_nascita"]
    if test>"":
        tests=test.split()
        if len(tests) !=2 or (not tests[0].isdigit()) or (not tests[1] in u"gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre"):
               errori=True
               note=note+"Campo Giorno e data nascita errato: "+autore_dic["pagina"]+" "+test
    test=autore_dic["gm_morte"]
    if test>"":
        tests=test.split()
        if len(tests) !=2 or (not tests[0].isdigit()) or (not tests[1] in u"gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre"):
               errori=True
               note=note+"Campo Giorno e data morte errato: "+autore_dic["pagina"]+" "+test
    #controllo campi anno
    test=autore_dic["a_nascita"]
    if test>"":
        tests=test.split()
        if len(tests)>2:
            errori=True
            note=note+"Campo Anno nascita errato: "+autore_dic["pagina"]+" "+test
        elif len(tests)==2:
            if (not tests[1]=="a.C.") or (not tests[0].isdigit):
                errori=True
                note=note+"Campo Anno nascita errato: "+autore_dic["pagina"]+" "+test
        elif len(tests)==1:
            if not tests[0].isdigit():
                errori=True
                note=note+"Campo Anno nascita errato: "+autore_dic["pagina"]+" "+test

    test=autore_dic["a_morte"]
    if test>"":
        tests=test.split()
        if len(tests)>2:
            errori=True
            note=note+"Campo Anno morte errato: "+autore_dic["pagina"]+" "+test
        elif len(tests)==2:
            if (not tests[1]=="a.C.") or (not tests[0].isdigit):
                errori=True
                note=note+"Campo Anno morte errato: "+autore_dic["pagina"]+" "+test
        elif len(tests)==1:
            if not tests[0].isdigit():
                errori=True
                note=note+"Campo Anno morte errato: "+autore_dic["pagina"]+" "+test
    return autore_dic,note

def aggiorna_ricorrenza(autore,tipo="nascita"): #r : pag. ricorrenza ri : riga entrambe in utf-8 o entrambe in unicode
    if tipo=="nascita":
        data=autore["gm_nascita"]+" "+autore["a_nascita"]
        ri="* "+data+": nasce [["+autore["pagina"]+"|"+autore["nome"]+" "+autore["cognome"]+"]]"
    elif tipo=="morte":
        data=autore["gm_morte"]+" "+autore["a_morte"]
        ri="* "+data+": muore [["+autore["pagina"]+"|"+autore["nome"]+" "+autore["cognome"]+"]]"      
                
    data=data.split()
    if len(data)<3:
        return r
    criterio_ri=data[2]
    if len(data)==4 and data[3].lower()=="a.c.":
        criterio_ri="-"+data[2]
    criterio_ri=eval(criterio_ri)
    pagina_ricorrenze=u"Wikisource:Ricorrenze/"+data[0]+" "+data[1]
    rl=leggi_pagina(pagina_ricorrenze).split("\n")
    trovato_el=False
    el1=-1
    #print rl
    for i in range(len(rl)):
        if u"{{Ricorrenze giorno" in rl[i]:
            urp=i
        elif not trovato_el and rl[i].strip()[0:1]=="*":
            el1=i
            trovato_el=True
        elif u"[[Categoria:Ricorrenze" in rl[i]:
            prs=i
    #print "urp=", urp ,"el1=", el1, "prs=", prs
    if el1==-1: #nessun elemento
        rl[prs:prs]=[ri]
    else: #esistono elementi
        #print "esistono elementi"
        for i in range(el1,prs):
            errore=False
            data=find_stringa(rl[i],"*",":").strip()
            data=data.split()
            if len(data)==3: # non c'è a.C.
                #print data[2],"non c'è a.C."
                criterio=data[2]
            elif len(data)==4 and data[3].lower()=="a.c.":
                criterio="-"+data[2]
            else:
                break

            #print data_ins,criterio
            if criterio_ri<eval(criterio):
                #print "condizione datains<criterio"
                rl[i:i]=[ri]
                break
            elif i==prs-1:
                rl[prs:prs]=[ri]
                break
    rl="\n".join(rl)
    scrivi_pagina(rl,False,pagina_ricorrenze)
    return


### Parte attiva del programma
richieste_bot()