Progetto:Bot/Programmi in Python per i bot/ElencoAutori.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 pywikibot as 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 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"),
    ]


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

    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, "Bot - ElencoAutori.py: aggiornamento delle liste relativi agli autori")

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