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

# -*- coding: utf-8 -*-
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

def allinea(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
    
    paginaIt=bot.Page(it, nomePagina)
    paginaLa=bot.Page(la, nomePagina)
    if (not paginaIt.exists()) or (not paginaLa.exists()): # caso 1
        caso=1 
    else:
        header, body, footer=decomp(paginaIt.get())
        h,b,f=decomp(paginaLa.get())
        b=correggi(b)
        iwpage=find_stringa(body,"{{Iwpage|la","}}",1)
        lr=str(paginaLa.latestRevision())
        level=find_stringa(h,'level="','"',0)
        body=body.replace("{{iwpage","{{Iwpage") # normalizzazione Iwpage
        # 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 caso==1:
        print("Almeno una delle pagine non esiste")
        return
    if caso==2 or caso==3:
        
        if not lr in paginaIt.get():
            body="{{Allineatore|la}}<!--%s, %s, %s-->" % (iwpage,lr, level)+b
            paginaIt.put(header+body+footer, "Allineamento Iwpage")
        else:
            print("Pagina 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): # decompone il testo nsPagina in header, body, footer
    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): # corregge il testo sorgente in caso di codice incompatibile
    testo=testo.replace("{{Indent|2}}","::")
    return testo