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

Da Wikisource.
# -*- coding: utf-8 -*-

"""
Crea le pagine discussione delle sottopagine di un opera,
includendo come un template la pagina discussione della
pagina principale dell'opera.

Parametri da passare allo script:

-titolo:XX    - con XX che e` il nome pagina principale dell'opera.
-inizio:YY:   - con YY che e` il nome pagina da cui deve iniziare,
				cioe` non crea le pagine che sarebbero create prima di YY

Esempio:
        python Infotesto.py "-titolo:Amori (Marino)"

        python Infotesto.py "-titolo:Amori (Marino)" "-inizio:Discussione:33 - Giuoco di dadi"

Note:
        Lo script è ricorsivo, può dunque inserire lo stesso infotesto anche nelle varie sottopagine di un opera.
        E' richiesto lo script templateHandler.py per poter funzionare.
"""

import pagegenerators
import templateHandler
import wikipedia

import re

class Infotesto:
        """Si occupa di includere i template infotesto pag discussione delle sottopagine.
        """

        NS_DISCUSS = "Discussione:"
        wikipedia.action = "Bot: includo la pagina con infotesto"

        def __init__(self, paginaPrincipale, startPage=None):
                """
                Argomenti:
                * paginaPrincipale - la pagina principale dell'opera
                * startPage - se specificata, ignora tutte le pagine che dovrebbe
                            creare prima di startPage.
                """
                self.pagPrincipale = paginaPrincipale
                if self.pagPrincipale.startswith("Indice:"):
                    lPrefix = len("Indice:")
                    self.daInserire = "{{Discussioni indice:%s}}" % paginaPrincipale[lPrefix:]
                    self.nsDiscussione = "Discussioni pagina:"
                    self.nsSottoPagAtteso = 108
                else:
                    self.daInserire = "{{Discussione:%s}}" % paginaPrincipale
                    self.nsDiscussione = "Discussione:"
                    self.nsSottoPagAtteso = 0

                self.startPage = startPage

        def run(self):
                """
                Fa quel che deve.
                """

                ### ottieni pagina principale e le pagine a cui puntano i link che contiene.
                sito = wikipedia.getSite()
                pagina = wikipedia.Page(sito, self.pagPrincipale)
                generatoreSottoPag = pagegenerators.LinkedPageGenerator(pagina)
                for sottoPagina in generatoreSottoPag:
                    self.aggiungiTemplate(sottoPagina)

                ### considera come link da seguire anche il primo parametro del template Testo.
                for template in templateHandler.templatesFromPage(pagina.get()):
                    if re.match("[tT]esto", template.name):
                       sottoPagina = wikipedia.Page(sito, template[0])
                       self.aggiungiTemplate(sottoPagina)

        def aggiungiTemplate(self,  sottoPagina):
                ### scorri i link che contiene e controlla che siano "sottopagine normali"
                titolo = sottoPagina.sectionFreeTitle()
                titoloSenzaNs = titolo[len("Pagina:"):] if titolo.startswith("Pagina:") else titolo
                titoloDiscussione = self.nsDiscussione + titoloSenzaNs

                # finchè c'è una startPage, ignora la pagina corrente.
                if self.startPage == titoloDiscussione:
                    self.startPage = None
                if self.startPage is not None:
                    return

                if sottoPagina.namespace() != self.nsSottoPagAtteso:
                        print u"\"%s\" non si trova nel namespace principale. La salto" % titolo
                        return
                if not self.pagPrincipale.startswith("Indice:") and not titolo.startswith(self.pagPrincipale + "/"):
                        print u"\"%s\" non è sottopagina di %s. La salto" % (titolo, self.pagPrincipale)
                        return
                if self.pagPrincipale.startswith("Indice:") and not titolo.startswith("Pagina:"):
                        print u"\"%s\" non è sottopagina di %s. La salto" % (titolo, self.pagPrincipale)
                        return
                if sottoPagina.isCategory():
                        print u"\"%s\" è una categoria. La salto." % titolo
                        return
                if sottoPagina.isImage():
                        print u"\"%s\" è un immagine. La salto." %  titolo
                        return
                if not sottoPagina.exists():
                        print u"\"%s\" non esiste. La salto." %  titolo
                        return

                ### inserisco nella sottopagina discussione il "template"
                pagDiscussione = wikipedia.Page(wikipedia.getSite(), titoloDiscussione)
                if not pagDiscussione.exists():
                    print u"\nscrivo: \"", self.daInserire, "\" in: ", titoloDiscussione , '"'
                    pagDiscussione.put(self.daInserire)
                sottoBot = Infotesto(titolo)
                sottoBot.run()

def main():
        ### gestisci gli argomenti
        titolo = ""
        inizio = None
        for arg in wikipedia.handleArgs():
                if arg.startswith("-titolo:"):
                        titolo = arg[len("-titolo:"):]
                if arg.startswith("-inizio:"):
                        inizio = arg[len("-inizio:"):]
        if titolo == "":
                print "Parametri non validi.\n\n\n**** ISTRUZIONI ***\n"
                print __doc__
                return

        ### usa la classe che gestisce questo bot
        bot = Infotesto(titolo, inizio)
        bot.run()

if __name__  == "__main__":
        try:
                main()
        except:
                wikipedia.stopme()
                raise
        else:
                wikipedia.stopme()
[visualizza] [modifica] Documentazione


Descrizione[modifica]

Crea le pagine discussione delle sottopagine di un opera, includendo come un template la pagina discussione della pagina principale dell'opera. Lo script è ricorsivo, può dunque inserire lo stesso infotesto anche nelle varie sottopagine di un opera.

Per funzionare è necessario avere anche lo script templateHandler.py (aggiornato all'ultima versione pubbilcata).

Quando usarlo[modifica]

Quando un testo ha delle sottopagine e bisogna segnalare la fonte usata per ogni sottopagina.

Nome del file[modifica]

Infotesto.py

Comando[modifica]

python Infotesto.py -titolo:XX
con XX che è il nome pagina principale dell'opera.
python Infotesto.py -inizio:YY
con YY che è il nome della pagina discussione da cui iniziare.

Esempi[modifica]

python Infotesto.py "-titolo:Amori (Marino)"
Crea le pagine discussione delle sottopagine di Amori (Marino) inserendo il template infotesto dell'opera.
python Infotesto.py "-titolo:Amori (Marino)" "-inizio:Discussione:33 - Giuoco di dadi"
È come il comando precedente, ma inizia a crearle a partire da Discussione:33 - Giuoco di dadi.

Autore[modifica]

Qualc1