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

# -*- coding: utf-8 -*-
# versione 19.09.2022: aggiunta funzione correggi_scriptor() 
import pywikibot as bot
import re
from os import listdir,system,path
from pywikibot.data import api


mul=bot.Site("mul","wikisource")
it=bot.Site("it","wikisource")
la=bot.Site("la","wikisource")

from parseTemplate import *
US=u'\x1f'  # unit separator
GS=u'\x1d' # group separator
VT=u'\x0b' # vertical tab
FF=u'\x0c'  # form feed
'''
Comando di esempio
allinea("Vico, Giambattista – Il diritto universale, Vol. II, 1936 – BEIC 1961223.djvu",120,132)
'''


def get_qid(pagina):
    # ricava il qid dell'elemento wikidata connesso alla pagina
    return pagina.data_item().id

def allineaGlobale(n=None):
    lista="""Indice:Boccaccio, Giovanni – Opere latine minori, 1924 – BEIC 1767789.djvu	1	394
Indice:Vico, Giambattista – Le orazioni inaugurali, il De Italorum sapientia e le polemiche, 1914 – BEIC 1965567.djvu	1	332
Indice:Campanella, Tommaso – Poesie, 1915 – BEIC 1777758.djvu	1	328
Indice:Campanella, Tommaso – Lettere, 1927 – BEIC 1776819.djvu	1	468
Indice:Politici e moralisti del Seicento, 1930 – BEIC 1898115.djvu	1	324
Indice:Vico, Giambattista – Il diritto universale, Vol. I, 1936 – BEIC 1960672.djvu	1	274
Indice:Vico, Giambattista – Il diritto universale, Vol. II, 1936 – BEIC 1961223.djvu	1	332
""".split("\n")
    if n!=None:
        lista=lista[n:n+1]
        
    for e in lista:
        opera=e.split("\t")
        opera[1]=int(opera[1])
        opera[2]=int(opera[2])
        allinea(opera[0], opera[1], opera[2])
        return
        
def allineaPagine(base,ini,fin):
    # base: base indice (senza namespace nè slash finale)
    if not base.startswith("Pagina:"):
        base="Pagina:"+base
    if not base.endswith("/"):
        base+="/"
    
    for p in range(ini,fin):
        nomePagina=base+str(p)
        print(nomePagina)
        allineaPagina(nomePagina)
    return

def correggi_scriptor(base,ini,fin):
        # base: base indice (senza namespace nè slash finale)
    if not base.startswith("Pagina:"):
        base="Pagina:"+base
    if not base.endswith("/"):
        base+="/"
    
    for p in range(ini,fin):
        nomePagina=base+str(p)
        paginaLa=bot.Page(la, nomePagina)
        testoOld=paginaLa.get()
        testoNew=ac2wl(testoOld)
        if testoNew!=testoOld:
            paginaLa.put(testoNew,"replacing Scriptor links with Wl templates")
    return
    
                      
def allineaPagina(nomePagina):
    # distingui cinque casi:
    # la pagina non esiste
    # Iwpage primario
    # Iwpage secondario da precedente allineamento
    # IwpageSection primario
    # IwpageSection secondario da precedente allineamento
    # nessuni Iwpage nè IwpageSection
    r1=re.compile(r'level="\d"')
    r2=re.compile(r'user=".+?"')
    paginaIt=bot.Page(it, nomePagina)
    paginaLa=bot.Page(la, nomePagina)
    if not paginaLa.exists(): # caso 1
        caso=1 
    else:
        h,b,f=decomp(paginaLa.get())
        h=correggi(h)
        b=correggi(b,paginaLa)
        if paginaIt.exists():
            header, body, footer=decomp(paginaIt.get())
            body=body.replace("{{iwpage","{{Iwpage") # normalizzazione Iwpage
            iwpage=find_stringa(body,"{{Iwpage|la","}}",1)
            
            if iwpage=="":
                print("pagina da non allineare")
                return
        else:
            header=h
            footer=f
            body=""
            iwpage="{{Iwpage|la}}"

        lr=str(paginaLa._revid)
        level=find_stringa(h,'level="','"',0)
        levelIt=find_stringa(header,'level="','"',0)
        
        # analisi casi
        if "<!--{{Iwpage|la}}" in body:
            caso=3
        elif "{{Iwpage|la}}" in body:
            caso=2
        elif "<!--{{IwpageSection|la" in body:
            caso=5
        elif "{{IwpageSection|la" in body:
            caso=4
        else:
            caso=6
    print(caso)
##    if level!=levelIt:
##        print("SAL di itwikisource %s discordante con il SAL di lawikisource %s" % (levelIt, level))
        
    if caso==1:
        print("La pagina non esiste su la.wikisource")
        return
    if caso==2 or caso==3 or caso==6:

        if not lr in body:
            body="{{Allineatore|la}}<!--%s, %s, %s-->" % (iwpage,lr, level)+b
            # due righe nuove: allineamento header
            header=h
            header=r1.sub('level="%s"' % level,header)
            header=r2.sub('user="BrolloBot"', header)
            
            print(h,header)
                  
            paginaIt.put(header+body+footer, "Allineamento Iwpage")
        else:
            print("Pagina ", nomePagina, " già allineata")
        
                         
    if caso==4:
        iwpagesection=find_stringa(body,"{{IwpageSection|la|","}}",1)
        section=find_stringa(iwpagesection,"{{IwpageSection|la|","}}",0).split("|")[1]
        #testoLa=paginaLa.get()
        testoSection=trovaSection(b,section)
        newIwpagesection="{{Allineatore|la}}<!--%s, %s, %s-->" % (iwpagesection,lr, level) + testoSection +"<!--fine iwpagesection-->"
        body=body.replace(iwpagesection,newIwpagesection)
        paginaIt.put(header+body+footer,"Allineamento IwpageSection")
    if caso==5:
        section_old=find_stringa(body,"<!--{{IwpageSection|la|","<!--fine iwpagesection-->",1) # intera sezione
        if not lr in section_old:
            body=body.replace("{{Allineatore|la}}","")
            iwpagesection=find_stringa(section_old,"{{IwpageSection|la|","}}",1) # template iwpagesection
            section=find_stringa(iwpagesection,"{{IwpageSection|la|","}}",0).split("|")[1] #sezione
            #print("Nome sezione: ",section)
            #testoLa=paginaLa.get() 
            testoSection=trovaSection(b,section) # sezione section su lawikisource
            #print("Testo sezione su la.wikisource: ")
            newIwpagesection="{{Allineatore|la}}<!--%s, %s, %s-->" % (iwpagesection,lr,level) + testoSection +"<!--fine iwpagesection-->"
            body=body.replace(section_old,newIwpagesection)
            paginaIt.put(header+body+footer,"Allineamento IwpageSection")
        else:
            print("Pagina già allineata")
    
    return

def normalizzaSection(testo): # normalizza i tag section
    r=re.compile(r"< *section *begin *= *\"*(.+?)\"* *\/>")
    testo=r.sub(r'<section begin="\1" />', testo)
    r=re.compile(r"< *section *end *= *\"*(.+?)\"* *\/>")
    testo=r.sub(r'<section end="\1" />', testo)
    return testo

def trovaSection(testo, section):          # restituisce la section di una pagina,
    #'<section begin="%s" />' % section,     compresi  i tag section
    testo=normalizzaSection(testo)
    section=find_stringa(testo,'<section begin="%s" />' % section, \
                         '<section end="%s" />' % section, 1)
    
    
    return section

def decomp(testo):
    header=testo[0:testo.find("</noinclude>")+len("</noinclude>")]
    footer=testo[testo.rfind("<noinclude"):]
    body=testo.replace(header,"").replace(footer,"")
    return (header,body,footer)
    
def correggi(testo,paginaLa):
    testo=testo.replace("[[scriptor:","[[Scriptor:")
##    if "[[Scriptor:" in testo:
##        testo=ac2wl(testo)
##        paginaLa.put(testo,"Replacing Scriptor: link with Wl template")
    testo=testo.replace("{{Indent|2}}","::")\
           .replace("{{Rh","{{RigaIntestazione")\
           .replace("{{rh","{{RigaIntestazione")

    return testo

def ac2wl(testo):
    testo=testo.replace("[[scriptor", "[[Scriptor")
    lista=produci_lista(testo, "[[Scriptor","]]",1)
    for i in range(len(lista)):
        try:
            scriptor=[find_stringa(lista[i],"[[","|",0), find_stringa(lista[i],"|","]]",0)]
            qid=get_qid(bot.Page(la,scriptor[0]))
        
            wl="{{Wl|%s|%s}}" % (qid,scriptor[1])
            print(lista[i], wl)
            testo=testo.replace(lista[i], wl)
        except:
            print(lista[i]+" non risolto")
        
    return testo
        

def allinea(base, ini, fin):
    if base.startswith("Indice:"):
        base=base.replace("Indice:","")
    if not base.startswith("Pagina:"):
        base="Pagina:"+base

    if not base.endswith("/"):
        base+="/"
    for i in range(ini,fin):
        allineaPagina((base+"%d") % i)
    return

def  iwpage_it(base, ini, fin):
    # crea pagine Iwpage|it  in la.wikisource
    header='<noinclude><pagequality level="0" user="BrolloBot" /></noinclude>'
    for p in range(ini, fin):
        pageIt=bot.Page(it, "Pagina:"+base+"/"+str(p))
        pageLa=bot.Page(la, "Pagina:"+base+"/"+str(p))
        if pageIt.exists() and not pageLa.exists():
            testoIt=pageIt.get()
            print(pageIt.title())
            t=decomp(testoIt)
            if not "wpage|la" in testoIt: # and not 'level="0"' in testoIt:
##                print(pageIt.title())
##                t=decomp(testoIt)
                #print(t[1])
                pageLa.put(header+"{{Iwpage|it}}"+'<noinclude></noinclude>', "Applico Iwpage")
    return

def  iwpage_la(base, ini, fin):
    # crea pagine Iwpage|la  in it.wikisource
    header='<noinclude><pagequality level="0" user="BrolloBot" /></noinclude>'
    for p in range(ini, fin):
        pageIt=bot.Page(it, "Pagina:"+base+"/"+str(p))
        pageLa=bot.Page(la, "Pagina:"+base+"/"+str(p))
        if pageLa.exists() and not pageIt.exists():
            testoLa=pageLa.get()
            print(pageLa.title())
            t=decomp(testoLa)
            
            pageIt.put(header+"{{Iwpage|la}}"+'<noinclude></noinclude>', "Applico Iwpage")
    return

    
def move_to_la(base, ini, fin,sal=None,iwpage=True, rewrite=False):
    # copia pagine da it.wikisource a la.wikisource e le sostituisce opzionalmente con
    # Iwpage|la
    h0='<noinclude><pagequality level="0" user="BrolloBot" /></noinclude>' 
    for p in range(ini, fin):
        pageIt=bot.Page(it, "Pagina:"+base+"/"+str(p))
        pageLa=bot.Page(la, "Pagina:"+base+"/"+str(p))
        if pageIt.exists():#  and not pageLa.exists():
            testoIt=pageIt.get()
            print(pageIt.title())
            header,body,footer=decomp(testoIt)
            user=find_stringa(header,'user="','"', 1)
            oldSal=find_stringa(header,'level="','"', 1)
            h=header.replace(user,'user="BrolloBot"')
            if sal != None:
                h=h.replace(oldSal,'level="%s"' % sal)
            h=h.replace("RigaIntestazione","Rh")
            print(h)
            if not "wpage|la" in testoIt: # and not 'level="0"' in testoIt:
                if rewrite:
                    if pageLa.exists():
                        pageLa.put(h+body+footer)

                    else:
                        pageLa.put(body)
                    if iwpage:
                        testoIt=h+"{{Iwpage|la}}"+footer
                        pageIt.put(testoIt)
    return