Utente:Nemo bis/Elenco titoli/Incipit/Codice

Da Wikiquote, aforismi e citazioni in libertà.

Elenco incipit[modifica]

Ispirato inizialmente a Utente:BimBot/Scripts.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re, wikipedia

def main():
    args = wikipedia.handleArgs()              
    site = wikipedia.getSite('it', 'wikiquote')
    genPage = wikipedia.Page(site, "Utente:Nemo bis/Elenco titoli")
    
    for i in genPage.linkedPages():
        iText = i.get()
        #Prendo i titoli dei paragrafi dedicati a un'opera che contengano anche un incipit:
        opereconincipit = re.findall(r"(?m)^==\s*(''|''''')\s*(.*?)\s*\1\s*==(?:\s*\n)+===\s*(\[\[)?[Ii]ncipit(\]\])?\s*===", iText)
        #Prendo il titolo dell'opera dai paragrafi dedicati a una sola opera di cui c'è solo l'incipit [non bisogna eliminare il primo gruppo perché se ce n'è solo una restituisce una lista di caratteri[:
#        incipitsingoli = re.findall(r"(?m)^==(\[\[)?[Ii]ncipit(\]\])? di ''([^']+)''==", iText)
        incipitsingoli = re.findall(r"(?m)^==\s*\[\[[Ii]ncipit\]\]\s*d(i|e|el|ello|ella|ei|egli|elle)\s*''\s*(.*)\s*''\s*==", iText)
        #Prendo tutto il testo del paragrafo che contiene un elenco di incipit. Il contenuto del paragrafo è definito come tutto ciò che è l'apertura o chiusura di un'intestazione di terzo livello oppure non è un = (sono quindi escluse le intestazioni di quarto livello). Butto via tutto ciò che viene prima e tutto ciò che viene dopo a partire dalla prima intestazione di secondo livello, il primo === e il contenuto dell'ultimo paragrafo di terzo livello a partire dalla chiusura dell'intestazione.
        paragrafoincipitmultipli = re.subn(r"(?m)\A[\w\W]+^==\s*\[\[[Ii]ncipit\]\] di alcune opere\s*==\n===(?P<paragrafo>(===|[^=])+)===(?:\s*\n)[^=]+(?:^==[^=]+==(?:\s*\n)+)[\w\W]+\Z", r"\g<paragrafo>", iText, 1)
        #Estraggo i titoli dalle intestazioni di terzo livello, separati da tutto ciò che sta fra la chiususra di un'intestazione e l'apertura della successiva (comprese).
        incipitmultipli = ['Vuoto']
        if paragrafoincipitmultipli[1] > 0:
            incipitmultipli = re.split(r"(?m)===(?:\s*\n)*[^=]+^===", paragrafoincipitmultipli[0]) 
        #(?<=\s*''\s*.*\s*''\s*) sre_constants.error: look-behind requires fixed-width pattern
        
        #Stampo i titoli trovati, se ce ne sono.
        if (len(opereconincipit) > 0 or len(incipitsingoli) > 0 or len(incipitmultipli) > 1):
            wikipedia.output("*[[" + i.title() + "]]")
            for j in opereconincipit:
                wikipedia.output("**''" + j[1] + "''")
            for k in incipitsingoli:
                wikipedia.output("**''" + k[1] + "''")
            #Solo se ci sono almeno due elementi ho trovato un paragrafo e ne ho estratto dei titoli.
            if len(incipitmultipli) > 1: 
                for l in incipitmultipli:
  	                wikipedia.output("**" + l)
        
if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()