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

Da Wikisource.

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()