Utente:CandalBot/aaa listeAutori.py

#!/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 VI secolo", u"Wikisource:Elenco cronologico degli autori del VI secolo"),
    (u"Categoria:Autori del VII secolo", u"Wikisource:Elenco cronologico degli autori del VII secolo"),
    (u"Categoria:Autori del VIII secolo", u"Wikisource:Elenco cronologico degli autori del VIII secolo"),
    (u"Categoria:Autori del IX secolo", u"Wikisource:Elenco cronologico degli autori del IX secolo"),
    (u"Categoria:Autori del X secolo", u"Wikisource:Elenco cronologico degli autori del X secolo"),
    (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
#troppo lunga!    ("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()