Utente:Qualc1/BotScripts/autoreToTemplate.py

Da Wikisource.
Nome del programma autoreToTemplate.py
Autore Qualc1
Descrizione
  • Genera tutte le pagine template:nome_autore per gli autore presenti su wikisource.
  • Richiede templateHandler.py
Come si usa

Da avviare semplicemente con "python autoreToTemplate.py" senza nessuna opzione.

Dove si trova Utente:Qualc1/BotScripts/autoreToTemplate.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Crea i template contententi i dati utili per ogni autore.
 
Parametri da passare allo script:
-solo "nome autore"
    Crea le liste relative solo al nome specificato
-aiuto
    Mostra queste informazioni di aiuto.
 
Esempi:
	python autoreToTemplate.py
		Crea/aggiorna il template di ogni autore
	python autoreToTemplate.py -solo "Dante Alighieri"
		Crea/aggionra il template di Dante Alighieri
	python autoreToTemplate.py -solo "Dante Alighieri" "Cecco Angiolieri"
		Crea/aggionra il template di Dante Alighieri e di Cecco Angiolieri
"""

import re # python libs
import wikipedia, pagegenerators, catlib # pywikipedia libs
import templateHandler # my libs
 
paginaTemplate = \
u"""<noinclude>{{Lista Bot}}</noinclude><includeonly>*TEMPLATE_AUTORE*</includeonly><noinclude>__NOEDITSECTION__
 
 
<div class="toccolours" style="clear:both; margin-bottom: 0.5em; font-size: 90%;">
=== Descrizione ===
Inserisce i dati relativi all'autore formattati per le pagine indice.
=== Uso ===
Ricopiare il testo sottostante.
: '''<nowiki>{{*AUTORE*}}</nowiki>'''
</div>[[Categoria:Template per gli autori|{{PAGENAME}}]]</noinclude>
"""
 
class autoreToTemplate:
    """Deve prende una pagina contenente qualcosa tipo:
    ============================
        {{Autore
        |Nome=Cesare
        |Cognome=Beccaria
        |Iniziale del cognome=B
        |Eventuale altro nome=
        |Eventuale pseudonimo=
        |Eventuale nome reale=
        |Giorno e mese di nascita=15 marzo
        |Anno di nascita=1738
        |Giorno e mese di morte=28 novembre
        |Anno di morte=1794
        |Secolo di attivita`=
        |Professione e nazionalita`=letterato, filosofo, giurista ed economista italiano
        |Nome della pagina su Wikipedia=Cesare Beccaria
        |Nome della pagina su Wikiquote=Cesare Beccaria
        |Nome della pagina su Wikinotizie=
        |Nome della pagina su Commons=Category:Cesare Beccaria
        |Nome dell'immagine=CesareBeccaria.jpg
        |Vuoi l'indice dei contenuti?=no
        |Abbiamo testi scritti dall'autore?=si
        |Abbiamo traduzioni scritte dall'autore?=no
        |L'autore e` citato in altre opere pubblicate?=no
        }}
    ==========================
    E resituire:
    ==========================
        {{Autore per indici
        |Nome=Cesare
        |Cognome=Beccaria
        |Iniziale del cognome=B
        |Eventuale altro nome=
        |Eventuale pseudonimo=
        |Eventuale nome reale=
        |Giorno e mese di nascita=15 marzo
        |Anno di nascita=1738
        |Giorno e mese di morte=28 novembre
        |Anno di morte=1794
        |Secolo di attivita`=
        |Professione e nazionalita`=letterato, filosofo, giurista ed economista italiano
        }}
    ==========================
    """
 
    wikipedia.action = "Bot: aggiornamento dei template relativi agli autori"
 
    parametriDaEliminare =  [ u"Nome della pagina su Wikipedia",
        u"Nome della pagina su Wikiquote",
        u"Nome della pagina su Wikinotizie",
        u"Nome della pagina su Commons",
        u"Nome dell'immagine",
        u"Vuoi l'indice dei contenuti?",
        u"Abbiamo testi scritti dall'autore?",
        u"Abbiamo traduzioni scritte dall'autore?",
        u"L'autore è citato in altre opere pubblicate?" ]
 
    def __init__(self):
        self.sito = wikipedia.getSite()
 
    def autoreToTemplate(self, paginaAutore):
        """Da una pagina di autore (il cui titolo e` "paginaAutore") restituisce il
        testo del template corrispondente.
        """
        pagina = wikipedia.Page(self.sito, paginaAutore).get()
        templatesText = re.findall("{{.*?}}", pagina, re.S)
        templAutore = None
        for templateText in templatesText:
            templ = templateHandler.Template(fromText = templateText)
            if templ.name == "Autore":
                templAutore = templ
                break
        if templAutore is None:
            raise ValueError("La pagina" + paginaAutore + \
                            " non ha un template Autore. Non posso usarla!")
        # "converto il template
        templAutore.name = "Autore per indici"
        templAutore.removeByParamName(autoreToTemplate.parametriDaEliminare)
        return templAutore
 
 
def autoriToTemplates():
    """Crea le pagine "template:nomeAutore".
    """
    import sys
    argomenti = sys.argv[1:]
    sito = wikipedia.getSite()
    cat = catlib.Category(sito, "Categoria:Autori in ordine alfabetico")
    generatoreAutori = pagegenerators.CategorizedPageGenerator(cat, recurse = True)    
 
    print "Sto raccogliendo le informazioni sugli autori..." # TODO eliminare...
    bot = autoreToTemplate()
    if len(argomenti) == 0:	
		for autore in generatoreAutori:
			if not autore.isRedirectPage():
				templateAutore = bot.autoreToTemplate(autore.title()).toText()
				pagina = paginaTemplate.replace("*TEMPLATE_AUTORE*", templateAutore)
				pagina = pagina.replace("*AUTORE*", autore.titleWithoutNamespace())
				wikiPagina = wikipedia.Page(sito, u"template:" + autore.titleWithoutNamespace())
				wikiPagina.put(pagina)
    else:
		operazione = argomenti[0]
		autoriDaGenerare = argomenti[1:]
		if operazione == "-solo" and len(autoriDaGenerare) >= 1:
			for (autore) in autoriDaGenerare:
				print "Raccolgo le informazioni su " + autore + " e genero il template"
				templateAutore = bot.autoreToTemplate("Autore:"+autore).toText()
				pagina = paginaTemplate.replace("*TEMPLATE_AUTORE*", templateAutore)
				pagina = pagina.replace("*AUTORE*", autore)
				wikiPagina = wikipedia.Page(sito, u"template:" + autore)
				wikiPagina.put(pagina)
		elif operazione == "-aiuto":
			print __doc__
			sys.exit(0)
		else:
			print "Parametri non validi.\n\nIstruzioni:\n" + __doc__
			sys.exit(1)
 
def main():
    autoriToTemplates()

if __name__  == "__main__":
        try:
                main()
        except:
                wikipedia.stopme()
                raise
        else:
                wikipedia.stopme()