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