Utente:FixBot/Scripts
Ecco gli script usati dal Bot. Eventuali consigli sono sempre ben accetti. :)
fix_template.py
modifica#!/usr/bin/python
# -*- coding: utf-8 -*-
# Script per la sistemazione dei template
# Author: Mauro742, Regex fixes from: Filnik
import re, datetime, copy
import wikipedia, pagegenerators, catlib
class TemplateFixer:
def __init__(self, TemplateConfig, TemplateParams, PrefixList, IndexList, site):
self.categoria = TemplateConfig['cat']
self.template = TemplateConfig['name']
self.signature_flag = False
self.TemplateParams = TemplateParams
self.PrefixList = PrefixList
self.IndexList = IndexList
self.site = site
def GetArticles(self):
content = catlib.Category(self.site, self.categoria)
articoli = list()
generator = pagegenerators.CategorizedPageGenerator(content)
for articolo in generator:
articoli.append(articolo.title())
return articoli
def FixTemplate(self, articolo):
status = 1
WithParams = 0
begin_regex = ""
NewTemplate = ""
EditFlags = {"new":[], "edit":[]}
self.signature_flag = False
current_data_flag = False
LocalTemplateParams = []
#Azzero la lista che conterrà i valori dei parametri
LocalTemplateParams = copy.deepcopy(self.TemplateParams)
while 1:
if status == 1:
#legge voce
strout = "Lettura voce %s" % articolo
wikipedia.output(strout)
page = wikipedia.Page(self.site, articolo)
try:
pagetxt = page.get()
except wikipedia.NoPage():
wikipedia.output(u'%s non esiste...' % page.title())
# Esce
return True
except wikipedia.IsRedirectPage():
wikipedia.output(u"%s e' un redirect!..." % page.title())
# Esce
return True
status = 2
elif status == 2:
wikipedia.output("Controllo presenza del template")
#Costruisco la parte di regex per l'inizio del template
if len(self.template) > 1:
begin_regex = "[%s%s]{1}%s" % (self.template[0], self.template[0].lower(), self.template[1:])
else:
begin_regex = "[%s%s]{1}" % (self.template, self.template.lower())
#Conteggio occorrenze template
#Prima verifica: template privo di parametri
regex = '(\{\{%s\}\})' % (begin_regex)
reg = re.compile(regex)
WithoutParams = len(reg.findall(pagetxt))
#Seconda verifica: template con parametri
regex = '\{\{%s\|([^}]*)\}\}' % (begin_regex)
reg = re.compile(regex)
ExtParams = reg.findall(pagetxt)
WithParams = len(ExtParams)
if (WithoutParams + WithParams) <> 1:
wikipedia.output("La voce contiene più (o nessuna) ripetizioni del template. Controllare manualmente la voce")
raw_input()
#esce
return True
else:
status = 3
elif status == 3:
wikipedia.output("Estrazione parametri");
#stampa le prime 25 righe, estrae i parametri e chiede cosa fare
wikipedia.output('Titolo: ' + articolo)
linee = pagetxt.split('\n')
risultato = str()
for l in linee[0:24]:
risultato += '\n' + l
# Testo da mandare nella schermata
txtresult = "\n***** TESTO ******\n\n" + risultato + "\n\n***** FINE TESTO ******\n"
wikipedia.output(txtresult)
#estrae i parametri, se presenti
if WithParams == 1:
outstr = "Parametri estratti dal template {{%s|%s}}: \n" % (self.template, ExtParams[0])
wikipedia.output(outstr)
self.CurrentParams = []
StrParams = ExtParams[0]
StrParams += "|"
reg = re.compile('([^\|\[]*|([^\|\[]*\[\[?[^\]]*\]\]?[^\|\[]*)*)\|')
res = reg.findall(StrParams)
for i in range(0, len(res)):
if res[i][0].find("=") == -1:
parametro = res[i][0]
else:
parametro = self.RemovePrefix(res[i][0])
regex = '[Gg]ennaio|[Ff]ebbraio|[Mm]arzo|[Aa]prile|[Mm]aggio|[Gg]iugno|[Ll]uglio|[Aa]gosto|[Ss]ettembre|[Oo]ttobre|[Nn]ovembre|[Dd]icembre'
reg = re.compile(regex).findall(parametro)
WithParams = len(ExtParams)
if parametro.find("[[Utente:") <> -1 or parametro.find("[[Discussioni utente:") <> -1 or parametro.find("[[User") <> -1 or parametro.find("[[user") <> -1:
if self.IndexList['firma'] <> None:
LocalTemplateParams[self.IndexList['firma']]['default_value'] = parametro
self.signature_flag = True
elif len(reg) > 0:
if self.IndexList['data'] <> None:
if parametro == GetCurrentData():
current_data_flag = True
LocalTemplateParams[self.IndexList['data']]['default_value'] = parametro
self.CurrentParams.append(parametro)
strout = "Parametro %d: %s\n" % (i, self.CurrentParams[i])
wikipedia.output(strout)
else:
wikipedia.output("Il template è privo di parametri")
caratt = raw_input("Proseguire? [s=skip, q=quit, INVIO=continua] ")
if caratt == 's':
return True
elif caratt == 'q':
return False
else:
status = 4
elif status == 4:
#Immissione dei parametri
wikipedia.output("Richiesta parametri")
action = "Bot: sistemo la sintassi del template %s" % self.template
EditFlags['new'] = []
EditFlags['edit'] = []
for i in range( len(LocalTemplateParams)):
end_input = False
while end_input == False:
#Richiedo l'immissione per tutti i parametri tranne la firma se non ho estratto parametri con struttura [[Utente:name|name]]
if ( LocalTemplateParams[i]['is_signature'] == 1 and self.signature_flag == True ) or LocalTemplateParams[i]['is_signature'] == 0:
#controllo se il parametro ha un valore di default
if len(LocalTemplateParams[i]['default_value']) > 0:
p_str = "\n%s [%s]: " % (LocalTemplateParams[i]['p_name'], LocalTemplateParams[i]['default_value'])
else:
p_str = "\n%s: " % (LocalTemplateParams[i]['p_name'])
param = raw_input(p_str.encode('cp850'))
#controllo la stringa immessa dall'utente
if param.isdigit() == True:
#se è una cifra verifico la correttezza dell'indice dei parametri estratti dal template
if int(param) <= len(self.CurrentParams):
LocalTemplateParams[i]['value'] = self.CurrentParams[int(param)]
end_input = True
#se non è un numero sarà una stringa. Se non è vuota la inserisco
elif len(param) > 0:
if param.find("*") <> -1: # * presente: correzione del parametro
EditFlags['edit'].append(LocalTemplateParams[i]['p_name'])
LocalTemplateParams[i]['value'] = param[1:]
else:
EditFlags['new'].append(LocalTemplateParams[i]['p_name'])
LocalTemplateParams[i]['value'] = param
end_input = True
#altrimenti controllo se il parametro ha un valore di default
else:
if len(LocalTemplateParams[i]['default_value']) > 0:
if LocalTemplateParams[i]['p_name'] == "data" and current_data_flag == False and LocalTemplateParams[i]['default_value'] == GetCurrentData():
EditFlags['new'].append("data")
LocalTemplateParams[i]['value'] = LocalTemplateParams[i]['default_value']
else:
LocalTemplateParams[i]['value'] = ""
end_input = True
else:
end_input = True
#Prelevati i parametri da tastiera è il momento di constuire il template
NewTemplate = "{{%s" % (self.template)
for i in range( len(LocalTemplateParams) ):
if len(LocalTemplateParams[i]['prefix']) > 0:
if len(LocalTemplateParams[i]['value']) > 0:
NewTemplate += "|%s=%s" % (LocalTemplateParams[i]['prefix'], LocalTemplateParams[i]['value'])
else:
NewTemplate += "|"
else:
NewTemplate += "|%s" % (LocalTemplateParams[i]['value'])
#rimuove le | in eccesso
tmp = NewTemplate
end_str = len(tmp)-1
while tmp[end_str] == "|":
end_str -= 1
NewTemplate = tmp[0:end_str+1]
NewTemplate += "}}"
#effettuo la sotituzione
if WithParams == 1:
regex = "\{\{%s\|[^\}]*\}\}" % (begin_regex)
else:
regex = "\{\{%s\}\}" % (begin_regex)
reg = re.compile(regex)
pagetxt_new = reg.sub(NewTemplate, pagetxt)
#genero commento alla modifica
for i in range(0, len(EditFlags['new'])):
if i == 0:
action += ": aggiungo %s" % EditFlags['new'][i]
elif i == len(EditFlags['new'])-1: #ultimo
action += " e %s" % EditFlags['new'][i]
else:
action += ", %s" % EditFlags['new'][i]
if len(EditFlags['new']) > 0 and len(EditFlags['edit']) > 0:
action += ";"
elif len(EditFlags['new']) == 0 and len(EditFlags['edit']) > 0:
action += ":"
for i in range(0, len(EditFlags['edit'])):
if i == 0:
action += " correggo %s" % EditFlags['edit'][i]
elif i == len(EditFlags['edit'])-1: #ultimo
action += " e %s" % EditFlags['edit'][i]
else:
action += ", %s" % EditFlags['edit'][i]
#stampo la differenza
wikipedia.showDiff(pagetxt, pagetxt_new)
wikipedia.output(action)
caratt = raw_input("Effettuo l'aggiornamento? [r=ripeti, y=si, n=no] ")
if caratt == "y":
page.put(pagetxt_new, action)
return True
elif caratt == "n":
return True
def RemovePrefix(self, parametro):
for pref in self.PrefixList:
pref += "="
p_split = parametro.split(pref)
if len(p_split) > 1:
return p_split[1]
for pref in self.PrefixList:
pref += " ="
p_split = parametro.split(pref)
if len(p_split) > 1:
return p_split[1]
return parametro
def start(self):
articoli = self.GetArticles()
for articolo in articoli:
if articolo.find(':') == -1:
if ( self.FixTemplate(articolo) == False ):
break
def main():
mex = """
Quale categoria sistemare?
(1) Da wikificare
(2) Da aiutare
(3) Da controllare
(4) Da verificare per enciclopedicità
(5) Pagine orfane
(6) Segnalazioni NPOV
(7) Paragrafi da wikificare
(8) Voci mancanti di fonti
(9) Da controllare per copyright"""
wikipedia.output(mex)
# In caso di errore nell'immettere il parametro, il programma fa riscegliere invece di bloccarsi.
while 1:
scelta = raw_input("Scelta: ")
if scelta == "1":
TemplateConfig = {"name":"W", "cat":"Categoria:Da wikificare"}
TemplateParams = []
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams[1]['default_value'] = GetCurrentData()
IndexList = {"firma":2, "data":1}
PrefixList = ['motivo', 'argomento', 'mese', 'firma']
break
elif scelta == "2":
TemplateConfig = {"name":"A", "cat":"Categoria:Da aiutare"}
TemplateParams = []
TemplateParams.append({"p_name":"motivazione", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams[2]['default_value'] = GetCurrentData()
IndexList = {"firma":3, "data":2}
PrefixList = ['motivo', 'argomento', 'mese', 'firma']
break
elif scelta == "3":
TemplateConfig = {"name":"C", "cat":"Categoria:Da controllare"}
TemplateParams = []
TemplateParams.append({"p_name":"motivazione", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams[2]['default_value'] = GetCurrentData()
IndexList = {"firma":3, "data":2}
PrefixList = ['motivo', 'argomento', 'mese', 'firma']
break
elif scelta == "4":
TemplateConfig = {"name":"E", "cat":u"Categoria:Da verificare per enciclopedicità"}
TemplateParams = []
TemplateParams.append({"p_name":"motivazione", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams[2]['default_value'] = GetCurrentData()
IndexList = {"firma":3, "data":2}
PrefixList = ['motivo', 'argomento', 'mese', 'firma']
break
elif scelta == "5":
TemplateConfig = {"name":"O", "cat":"Categoria:Pagine orfane"}
TemplateParams = []
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"mese", "is_signature":0, "value":""})
TemplateParams[1]['default_value'] = GetCurrentData()
IndexList = {"firma":None, "data":1}
PrefixList = ['argomento', 'mese']
break
elif scelta == "6":
TemplateConfig = {"name":"P", "cat":"Categoria:Segnalazioni NPOV"}
TemplateParams = []
TemplateParams.append({"p_name":"motivazione", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams.append({"p_name":"sezione", "default_value":"", "prefix":"sezione", "is_signature":0, "value":""})
TemplateParams[2]['default_value'] = GetCurrentData()
IndexList = {"firma":3, "data":2}
PrefixList = ['motivo', 'argomento', 'mese', 'firma', 'sezione']
break
elif scelta == "7":
TemplateConfig = {"name":"PW", "cat":"Categoria:Paragrafi da wikificare"}
TemplateParams = []
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams[1]['default_value'] = GetCurrentData()
IndexList = {"firma":2, "data":1}
PrefixList = ['argomento', 'mese', 'firma', 'data']
break
elif scelta == "8":
TemplateConfig = {"name":"F", "cat":"Categoria:Voci mancanti di fonti"}
TemplateParams = []
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"commento", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams[1]['default_value'] = GetCurrentData()
IndexList = {"firma":None, "data":1}
PrefixList = ['argomento', 'mese', 'commento', 'data']
break
elif scelta == "9":
TemplateConfig = {"name":"Controlcopy", "cat":"Categoria:Da controllare per copyright"}
TemplateParams = []
TemplateParams.append({"p_name":"motivazione", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"firma", "default_value":"", "prefix":"", "is_signature":1, "value":""})
TemplateParams.append({"p_name":"categoria", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams.append({"p_name":"data", "default_value":"", "prefix":"", "is_signature":0, "value":""})
TemplateParams[3]['default_value'] = GetCurrentData()
IndexList = {"firma":1, "data":3}
PrefixList = ['argomento', 'mese', 'motivo', 'firma', 'data']
break
elif scelta == 'q':
return
else:
wikipedia.output(u'Opzione non disponibile, riprova.')
continue
site = wikipedia.getSite()
fixer = TemplateFixer(TemplateConfig, TemplateParams, PrefixList, IndexList, site)
fixer.start()
def GetCurrentData():
data = datetime.date.today()
mesi = ('', 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre')
datastr = "%s %s" % (mesi[data.month], data.year)
return datastr
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()