Utente:FixBot/Scripts

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Ecco gli script usati dal Bot. Eventuali consigli sono sempre ben accetti. :)

fix_template.py[modifica | modifica wikitesto]

#!/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()