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

Da Wikisource.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
Crea le liste relative alle categorie di autori.
 
Parametri da passare allo script:
-solo lista_categorie
    Crea le liste relative solo alle categorie specificate.
-contiene pattern
    Crea le liste relative solo alle categorie che contengono nel titolo "pattern".
-aiuto
    Mostra queste informazioni di aiuto.
 
Esempio:
        python ListeAutori.py
            Crea le liste relative a tutte le categorie di autori
        python ListeAutori.py -solo Autori-A "Autori del XII secolo"
            Crea le liste solo relative alle categorie specificate
        python ListeAutori.py -contiene secolo
            Crea le liste per "Autori del XI secolo", "Autori del XII secolo",..
"""
 
import time
import wikipedia, catlib
 
# la parte di testo "costante" in tutte le pagine lista.
paginaListaSchema = u"""<noinclude>{{Lista Bot}}</noinclude>
{|style="width:100%; background:transparent"
*LISTA*|}
<div style="text-align:right;"><small>''[[Aiuto:Elenchi generati da bot|Elenco generato il giorno {{subst:REVISIONDAY}}.{{subst:REVISIONMONTH}}.{{subst:REVISIONYEAR}}]]''</small></div><noinclude>[[Categoria:Liste di sistema per gli autori| ]]</noinclude>
"""
 
# un lista di coppie "categoria di qualche tipo di autore" - "corrispondente lista"
categorieListe = [ 
# Indice alfabetico
    ("Categoria:Autori-A", "Wikisource:Elenco alfabetico degli autori A"),
    ("Categoria:Autori-B", "Wikisource:Elenco alfabetico degli autori B"),
    ("Categoria:Autori-C", "Wikisource:Elenco alfabetico degli autori C"),
    ("Categoria:Autori-D", "Wikisource:Elenco alfabetico degli autori D"),
    ("Categoria:Autori-E", "Wikisource:Elenco alfabetico degli autori E"),
    ("Categoria:Autori-F", "Wikisource:Elenco alfabetico degli autori F"),
    ("Categoria:Autori-G", "Wikisource:Elenco alfabetico degli autori G"),
    ("Categoria:Autori-H", "Wikisource:Elenco alfabetico degli autori H"),
    ("Categoria:Autori-I", "Wikisource:Elenco alfabetico degli autori I"),
    ("Categoria:Autori-J", "Wikisource:Elenco alfabetico degli autori J"),
    ("Categoria:Autori-K", "Wikisource:Elenco alfabetico degli autori K"),
    ("Categoria:Autori-L", "Wikisource:Elenco alfabetico degli autori L"),
    ("Categoria:Autori-M", "Wikisource:Elenco alfabetico degli autori M"),
    ("Categoria:Autori-N", "Wikisource:Elenco alfabetico degli autori N"),
    ("Categoria:Autori-O", "Wikisource:Elenco alfabetico degli autori O"),
    ("Categoria:Autori-P", "Wikisource:Elenco alfabetico degli autori P"),
    ("Categoria:Autori-Q", "Wikisource:Elenco alfabetico degli autori Q"),
    ("Categoria:Autori-R", "Wikisource:Elenco alfabetico degli autori R"),
    ("Categoria:Autori-S", "Wikisource:Elenco alfabetico degli autori S"),
    ("Categoria:Autori-T", "Wikisource:Elenco alfabetico degli autori T"),
    ("Categoria:Autori-U", "Wikisource:Elenco alfabetico degli autori U"),
    ("Categoria:Autori-V", "Wikisource:Elenco alfabetico degli autori V"),
    ("Categoria:Autori-W", "Wikisource:Elenco alfabetico degli autori W"),
    ("Categoria:Autori-X", "Wikisource:Elenco alfabetico degli autori X"),
    ("Categoria:Autori-Y", "Wikisource:Elenco alfabetico degli autori Y"),
    ("Categoria:Autori-Z", "Wikisource:Elenco alfabetico degli autori Z"),
# Indice cronologico
    (u"Categoria:Autori dell'Antichità", u"Wikisource:Elenco cronologico degli autori dell'Antichità"),
    (u"Categoria:Autori del Medioevo", u"Wikisource:Elenco cronologico degli autori del Medioevo"),
    (u"Categoria:Autori del XI secolo", u"Wikisource:Elenco cronologico degli autori del XI secolo"),
    (u"Categoria:Autori del XII secolo", u"Wikisource:Elenco cronologico degli autori del XII secolo"),
    (u"Categoria:Autori del XIII secolo", u"Wikisource:Elenco cronologico degli autori del XIII secolo"),
    (u"Categoria:Autori del XIV secolo", u"Wikisource:Elenco cronologico degli autori del XIV secolo"),
    (u"Categoria:Autori del XV secolo", u"Wikisource:Elenco cronologico degli autori del XV secolo"),
    (u"Categoria:Autori del XVI secolo", u"Wikisource:Elenco cronologico degli autori del XVI secolo"),
    (u"Categoria:Autori del XVII secolo", u"Wikisource:Elenco cronologico degli autori del XVII secolo"),
    (u"Categoria:Autori del XVIII secolo", u"Wikisource:Elenco cronologico degli autori del XVIII secolo"),
    (u"Categoria:Autori del XIX secolo", u"Wikisource:Elenco cronologico degli autori del XIX secolo"),
    (u"Categoria:Autori del XX secolo", u"Wikisource:Elenco cronologico degli autori del XX secolo"),
    (u"Categoria:Autori del XXI secolo", u"Wikisource:Elenco cronologico degli autori del XXI secolo"),
# Autori citati
    ("Categoria:Autori citati in opere pubblicate", "Wikisource:Elenco degli autori citati in opere pubblicate"),
# Indice per argomento
## Arti
    ("Categoria:Autori di testi delle arti", "Wikisource:Elenco degli autori di testi delle arti"),
### Arti performative
    ("Categoria:Autori di testi delle arti performative", "Wikisource:Elenco degli autori di testi delle arti performative"),
#### Musica
    ("Categoria:Autori di testi musicali", "Wikisource:Elenco degli autori di testi musicali"),
    ("Categoria:Musicisti", "Wikisource:Elenco dei musicisti"),
    ("Categoria:Compositori", "Wikisource:Elenco dei compositori"),
#### Teatro
    ("Categoria:Autori di opere teatrali", "Wikisource:Elenco degli autori di opere teatrali"),
    ("Categoria:Drammaturghi", "Wikisource:Elenco dei drammaturghi"),
### Arti visive
    ("Categoria:Autori di testi delle arti visive", "Wikisource:Elenco degli autori di testi delle arti visive"),
#### Arti plastiche
    ("Categoria:Autori di testi delle arti plastiche", "Wikisource:Elenco degli autori di testi delle arti plastiche"),
##### Scultura
    ("Categoria:Autori di testi di scultura", "Wikisource:Elenco degli autori di testi di scultura"),
    ("Categoria:Scultori", "Wikisource:Elenco degli scultori"),
#### Pittura
    ("Categoria:Autori di testi di pittura", "Wikisource:Elenco degli autori di testi di pittura"),
    ("Categoria:Pittori", "Wikisource:Elenco dei pittori"),
### Letteratura
    ("Categoria:Autori di opere letterarie", "Wikisource:Elenco degli autori di opere letterarie"),
#### Scrittori
    ("Categoria:Scrittori", "Wikisource:Elenco degli scrittori"),
    ("Categoria:Bibliofili", "Wikisource:Elenco dei bibliofili"),
#### Scrittori per genere
    ("Categoria:Scrittori per genere", "Wikisource:Elenco degli scrittori per genere"),
    ("Categoria:Critici letterari", "Wikisource:Elenco dei critici letterari"),
 
## Filosofia
    ("Categoria:Autori di testi di filosofia", "Wikisource:Elenco degli autori di testi di filosofia"),
    ("Categoria:Filosofi", "Wikisource:Elenco dei filosofi"),
    ("Categoria:Filosofi britannici", "Wikisource:Elenco dei filosofi britannici"),
    ("Categoria:Filosofi cinesi", "Wikisource:Elenco dei filosofi cinesi"),
    ("Categoria:Filosofi francesi", "Wikisource:Elenco dei filosofi francesi"),
    ("Categoria:Filosofi greci", "Wikisource:Elenco dei filosofi greci"),
    ("Categoria:Filosofi italiani", "Wikisource:Elenco dei filosofi italiani"),
    ("Categoria:Filosofi latini", "Wikisource:Elenco dei filosofi latini"),
## Scienze
    ("Categoria:Scienziati", "Wikisource:Elenco degli scienziati"),
#### Astronomia
    ("Categoria:Autori di testi di astronomia", "Wikisource:Elenco degli autori di testi di astronomia"),
    ("Categoria:Astronomi", "Wikisource:Elenco degli astronomi"),
    ("Categoria:Saggisti di astronomia", "Wikisource:Elenco dei saggisti di astronomia"),
#### Fisica
    ("Categoria:Autori di testi di fisica", "Wikisource:Elenco degli autori di testi di fisica"),
    ("Categoria:Fisici", "Wikisource:Elenco dei fisici"),
#### Geografia
    ("Categoria:Autori di testi di geografia", "Wikisource:Elenco degli autori di testi di geografia"),
    ("Categoria:Esploratori", "Wikisource:Elenco degli esploratori"),
    ("Categoria:Geografi", "Wikisource:Elenco dei geografi"),
    ("Categoria:Viaggiatori", "Wikisource:Elenco dei viaggiatori"),
#### Matematica
    ("Categoria:Autori di testi di matematica", "Wikisource:Elenco degli autori di testi di matematica"),
    ("Categoria:Matematici", "Wikisource:Elenco dei matematici"),
    ("Categoria:Saggisti di matematica", "Wikisource:Elenco dei saggisti di matematica"),
    ("Categoria:Storici delle matematiche", "Wikisource:Elenco degli storici delle matematiche"),
#### Scienze naturali
    ("Categoria:Autori di testi delle scienze naturali", "Wikisource:Elenco degli autori di testi delle scienze naturali"),
    ("Categoria:Naturalisti", "Wikisource:Elenco dei naturalisti"),
### Scienze sociali
 
### Tecnologia e scienze applicate
    ("Categoria:Autori di testi di tecnologia e scienze applicate", "Wikisource:Elenco degli autori di testi di tecnologia e scienze applicate"),
#### Architettura
    ("Categoria:Autori di testi di architettura", "Wikisource:Elenco degli autori di testi di architettura"),
    ("Categoria:Architetti", "Wikisource:Elenco degli architetti"),
#### Informatica
    ("Categoria:Autori di testi di informatica", "Wikisource:Elenco degli autori di testi di informatica"),
    ("Categoria:Informatici", "Wikisource:Elenco degli informatici"),
    ("Categoria:Programmatori", "Wikisource:Elenco dei programmatori"),
#### Ingegneria
    ("Categoria:Autori di testi di ingegneria", "Wikisource:Elenco degli autori di testi di ingegneria"),
    ("Categoria:Ingegneri", "Wikisource:Elenco degli ingegneri"),
#### Medicina
    ("Categoria:Autori di testi di medicina", "Wikisource:Elenco degli autori di testi di medicina"),
    ("Categoria:Medici", "Wikisource:Elenco dei medici"),
    ]
 

def find_stringa(stringa,idi,idf,dc=0,side="left"):
    if side=="right":
        idip=stringa.rfind(idi)
    else:
        idip=stringa.find(idi)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

class ListeAutori:
    """Bot che date delle coppie "categoria"-"pagina elenco",
        genera gli elenchi partendo dalle categorie.
    """
 
    def __init__(self, listeDaGenerare):
        """Costruisce un bot che agira` sulle coppie di pagine in "listeDaGenerare".
        """
        self.listeDaGenerare = listeDaGenerare
        self.sito = wikipedia.getSite('it', 'wikisource')
        wikipedia.action = "Bot: aggiornamento delle liste relativi agli autori"
 
    def run(self):
        """Avvia la generazione delle pagine lista."""
        for (categoria, lista) in self.listeDaGenerare:
#            print categoria, " -> ", lista
            categoria = catlib.Category(self.sito, categoria)
            autori = categoria.articles()
            contenutoPagina = u""
            for autore in autori:
                contenutoPagina += (
                    "{{AutoreIndici|" + autore.titleWithoutNamespace() + "}}\n" )
            listanuova=contenutoPagina
            contenutoPagina = paginaListaSchema.replace("*LISTA*", contenutoPagina)
            lista = wikipedia.Page(self.sito, lista)
            listavecchia=find_stringa(lista.get(),'{|style="width:100%; background:transparent"\n','|}')

            if "<!-- blocca ListaAutori.py -->" in lista.get():
                wikipedia.output("La pagina " + lista.title() + " non e' aggiornabile con ListaAutori.py")
            elif listanuova==listavecchia:
                wikipedia.output("La pagina " + lista.title() + " non ha subito modifiche rispetto all'ultimo edit")
            else:
                lista.put(contenutoPagina)
 
 
def main():
    """Lancia il bot sulle pagine elencate in "categorieListe". """
    import sys
    listeDaGenerare = []
    argomenti = wikipedia.handleArgs()
    if len(argomenti) == 0:
        listeDaGenerare = categorieListe
    else:
        operazione = argomenti[0]
        altriArg = argomenti[1:]
        if operazione == "-solo" and len(altriArg) >= 1:
            catChieste = [u"Categoria:" + cat for cat in argomenti[1:]]
            listeDaGenerare = [catList for catList in categorieListe if catList[0] in catChieste]
        elif operazione == "-contiene" and len(altriArg) == 1:
            listeDaGenerare = [catList for catList in categorieListe if argomenti[1] in catList[0]]
        elif operazione == "-aiuto":
            print __doc__
            sys.exit(0)
        else:
            print "Parametri non validi.\n\nIstruzioni:\n" + __doc__
            sys.exit(1)
    bot = ListeAutori(listeDaGenerare)
    bot.run()
    
 
if __name__  == "__main__":
        try:
                main()
        except:
                wikipedia.stopme()
                raise
        else:
                wikipedia.stopme()
[visualizza] [modifica] Documentazione


Descrizione

Questo programma aggiorna le liste relative a tutte le categorie di autori. In questo modo vengono generate degli elenchi automatici da inserire nelle pagine di servizio.

Quando usarlo

Il programma viene lanciato ogni notte in modo automatico.

Può essere lanciato all'occorrenza quando si è certi che siano stati aggiunti/rimossi degli autori.

Nome del file

ListeAutori.py

Comando

python ListeAutori.py
Aggiorna le liste relative a tutte le categorie di autori
python ListeAutori.py -solo "NOME CATEGORIA"
Aggiorna le liste solo relative alla categoria specificata
python ListeAutori.py -contiene "PAROLA CONTENUTA NELLA CATEGORIA"
Aggiorna le liste per tutte le categorie che contengono una parola definita

Esempi

python ListeAutori.py -solo "Autori del XVIII secolo"
Per aggiornare la lista presente su Wikisource:Indice cronologico degli autori del XVIII secolo
python ListeAutori.py -contiene "Autori-"
Per aggiornare tutte le liste di Wikisource:Indice alfabetico degli autori

Autore

Qualc1, iPork