Progetto:Bot/Programmi in Python per i bot/Areadati.py
Script per l'aggiunta/modifica dell'area dati alle pagine in ns0.
ATTENZIONE: script non ancora testato a fondo, non usatelo se non siete ben certi di ciò che state facendo!
Scritto da Candalua a partire da MediaWiki:Areadati.js
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wikipedia, pagegenerators, re, string
#stringa di apertura dell'area dati
areaBegin = u"<!-- Area dati: non modificare da qui: --><onlyinclude><div style=\"display:none\">"
#stringa di chiusura dell'area dati
areaEnd = u"</div></onlyinclude><!-- a qui -->"
#parametri di Qualità
paramNamesQualita = [u"data", u"avz", u"arg"]
#se è true, aggiorna anche le vecchie aree dati
update = True
def findparam(str, param_name):
pattern = "\n([\s]*?)\|([\s]*?)" + param_name + "([\s]*?)=([\s\S]*?)\n([\s]*?)\|([^=\n\|]+)=";
m = re.search(pattern, str)
if m:
return m.group(4)
return ''
def findparamQualita(str, param_name):
pattern = "\\|" + param_name + "=([\\s\\S]*?)\\|([^=\\|]+)=";
m = re.search(pattern, str)
if m:
return m.group(1)
return ''
def areadati(testo):
#parametri di Intestazione
paramNames = [u"Lingua originale del testo", u"Nome e cognome dell'autore", u"Nome e cognome dell'autore delle musiche", u"Organismo emittente", u"Anno di pubblicazione", u"Eventuale secondo anno di pubblicazione", u"Iniziale del titolo", u"Anno di traduzione", u"Nome e cognome del traduttore", u"URL della versione cartacea a fronte", u"Argomento", u"Progetto", u"Titolo", u"Nome della pagina principale", u"Università", u"Facoltà", u"Corso di laurea", u"Nome e cognome del relatore", u"Giorno della prima rappresentazione", u"Città in cui è avvenuta la prima rappresentazione", u"Teatro in cui è avvenuta la prima rappresentazione"]
templateName = u"Intestazione"
#se update è false, opera solo sulle pagine che non hanno un'area dati
if update or testo.find(areaBegin) == -1:
templateTrovato = False
# cerco Template:Intestazione
pattern = re.compile("\{\{[Ii]ntestazione([\s\S]*)\n\}\}")
m = pattern.search(testo)
if m:
templateTrovato = True
params = m.group(1) + u"\n|END="
else:
#se non lo trovo cerco IncludiIntestazione
pattern2 = re.compile("\{\{[Ii]ncludiIntestazione([\s\S]*)[\n]?\}\}")
testo2 = re.sub("\|", "\n|", testo)
testo2 = re.sub("\n\n", "\n", testo2)
m2 = pattern2.search(testo2)
if m2:
templateTrovato = True
paramNames = [u"sottotitolo", u"prec", u"succ", u"data", u"avz", u"arg"]
templateName = u"IncludiIntestazione"
#controllo che dopo il }} che chiude il template non sia rimasta della robaccia in più
#facendo il matching di ogni doppia grafa aperta con la sua chiusura
testo2 = m2.group(1)
testo3 = testo2[2:] + u"}}"
i = 1
fine = 2
while i > 0:
open = testo3.find(u"{{")
close = testo3.find(u"}}")
if open != -1 and open < close:
i += 1
testo3 = testo3[open+2:]
fine += open+2
else:
i -= 1
testo3 = testo3[close+2:]
fine += close+2
#butto via ciò che è fuori del template
testo2 = testo2[:fine-2]
params = testo2 + u"\n|END="
if templateTrovato:
#cerco il template Qualità
qualitaTrovata = False
pattern3 = re.compile(u"\{\{[Qq]ualità([\s\S]*)\}\}([\s\n]*)((<onlyinclude>)|(\{\{[Ii]ncludiIntestazione)|(\{\{[Ii]ntestazione))")
m3 = pattern3.search(testo)
if m3:
qualitaTrovata = True
paramsQualita = m3.group(1) + u"\n|END="
#tolgo la vecchia area dati
if update and testo.find(areaBegin) != -1:
begin = testo.find(areaBegin)
end = testo.rfind(areaEnd) + len(areaEnd)
testo = testo[:begin] + testo[end:]
#compongo l'area dati
area = areaBegin
#aggiungo tutti i parametri
for name in paramNames:
val = findparam(params, name).strip()
if val != '':
area += u"<section begin=\"" + name + u"\"/>" + val + u"<section end=\"" + name + u"\"/>\n"
#aggiungo il nome del template (può essere utile per sapere se è una sottopagina o no)
area += u"<section begin=\"nome template\"/>" + templateName + u"<section end=\"nome template\"/>\n"
#aggiungo la qualità se c'è
if qualitaTrovata:
for name in paramNamesQualita:
val = findparamQualita(paramsQualita, name).strip()
if val != '':
area += u"<section begin=\"" + name + u"\"/>" + val + u"<section end=\"" + name + u"\"/>\n"
#chiudo l'area dati
area += areaEnd
testo = area + testo
return testo
return ''
def main():
gen = pagegenerators.AllpagesPageGenerator("A", namespace=0, includeredirects=False)
for page in gen:
testoOriginale = page.get()
testoNuovo = areadati(testoOriginale)
if testoNuovo != '' and testoOriginale != testoNuovo:
#mostra il diff
wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
wikipedia.showDiff(testoOriginale, testoNuovo)
#per il momento chiedi sempre conferma!
choice = wikipedia.inputChoice(
u'Do you want to accept these changes?',
['Yes', 'No'],
['y', 'N'], 'N')
if choice == 'y':
page.put(testoNuovo, comment=u"Bot: creazione area dati")
else:
wikipedia.output(u"Niente da fare su: " + page.title())
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()