opereteatrali.py

# -*- coding: utf-8 -*-
 
import os, sys, re
import config, wikipedia, catlib, pagegenerators
 
#################################################
#                                               #
#        opereteatrali.py - ver. 2.5            #
#                                               #
#################################################
 
"""
Questo script raccoglie dati relativi alle opere teatrali
presenti su it.wiki, restituendo un elenco di voci
"""
botname = config.usernames['wikipedia']['it']
pagina_log = wikipedia.Page('it', 'Utente:%s/Log' % botname)
pagina_input = wikipedia.Page('it', 'Progetto:Teatro/Opere teatrali')
pagina_output = wikipedia.Page('it', 'Progetto:Teatro/Opere teatrali')
id_elenco= pagina_input.latestRevision()

def controllaid(page):
    id_voce = page.latestRevision()
    if id_voce > id_elenco:
        print id_voce, id_elenco
        nomepagina=page.title()
        wikipedia.output(u'\nLa pagina %s è stata modificata' % nomepagina)
        contenuto=page.get()
        scrivifile(nomepagina, contenuto)    

def categorie():
    catfile='opereteatrali/!categorie.txt'
    listacategorie= []
    categoryname = u'Opere teatrali per autore'
    cat = catlib.Category(wikipedia.getSite(), 'Categoria:%s' % categoryname)
    gencat1 = pagegenerators.SubCategoriesPageGenerator(cat, recurse=False)
    for subcat in gencat1:
        print subcat
        if subcat.title() in listacategorie:
            continue
        else:
            listacategorie.append(subcat.title())            
    categoryname = u'Opere teatrali per nazionalità'
    cat = catlib.Category(wikipedia.getSite(), 'Categoria:%s' % categoryname)
    gencat2 = pagegenerators.SubCategoriesPageGenerator(cat, recurse=False)
    for subcat in gencat2:
        print  subcat 
        if subcat.title() in listacategorie:
            continue
        else:
            listacategorie.append(subcat.title())                    
    categoryname = u'Opere teatrali per lingua'
    cat = catlib.Category(wikipedia.getSite(), 'Categoria:%s' % categoryname)
    gencat3 = pagegenerators.SubCategoriesPageGenerator(cat, recurse=False)
    for subcat in gencat3:
        print subcat 
        if subcat.title() in listacategorie:
            continue
        else:
            listacategorie.append(subcat.title())            
    return listacategorie

def gestorelista():
    dizionario={}
    lista=[]
    listacategorie=categorie()
    template=wikipedia.Page('it', 'Template:Dramma')
    gen3 = pagegenerators.ReferringPageGenerator(template)
    for page in gen3:
        if page.namespace() == 0:                
            titolo=page.title()
            if titolo not in lista:
                if re.search(r'Elenco', titolo):
                    continue
                else:
                    lista.append(titolo)
                    wikipedia.output(titolo)
                    controllaid(page)
    for categoria in listacategorie:
        wikipedia.output( '***************** %s' % categoria)
        cat = catlib.Category(wikipedia.getSite(), '%s' % categoria)
        gen1 = pagegenerators.CategorizedPageGenerator(cat)
        for page in gen1:
            if page.namespace() == 0:                
                titolo=page.title()
                if titolo not in lista:
                    if re.search(r'Elenco', titolo):
                        continue
                    else:
                        lista.append(titolo)
                        wikipedia.output(titolo)
                        controllaid(page)
    categoryname = u'Opere teatrali'
    cat = catlib.Category(wikipedia.getSite(), 'Categoria:%s' % categoryname)
    gen2 = pagegenerators.CategorizedPageGenerator(cat)
    for page in gen2:
        if page.namespace() == 0:                
            titolo=page.title()
            if titolo not in lista:
                if re.search(r'Elenco', titolo):
                    continue
                else:
                    lista.append(titolo)
                    wikipedia.output(titolo)
                    controllaid(page)
    for titolo in lista:
        titoloord=titoloLink(titolo)
        dizionario[titolo]=titoloord
        items=dizionario.items()
        backitems=[ [v[1],v[0]] for v in items]
        backitems.sort()
        lista=[ backitems[i][1] for i in range(0,len(backitems))]
    return lista

def scrivifile(nomepagina, testo):
    nomepagina = re.sub('\/', '_', nomepagina).strip()
    nomepagina = re.sub(' ', '_', nomepagina).strip()
    nomepagina = re.sub('"', '_', nomepagina).strip()
    nomepagina = re.sub('\?', '_', nomepagina).strip()
    nomefile='opereteatrali/'+nomepagina+'.txt'
    wikipedia.output(u'scrivo il file ' + nomefile)
    contenuto=testo.encode( "utf-8" )
    # Scrive un file.
    out_file = open(nomefile,"w")
    out_file.write(contenuto)
    out_file.close()
    
def leggifile(nomepagina):
    nomepagina = re.sub('\/', '_', nomepagina).strip()
    nomepagina = re.sub(' ', '_', nomepagina).strip()
    nomepagina = re.sub('"', '_', nomepagina).strip()
    nomepagina = re.sub('\?', '_', nomepagina).strip()
    nomefile='opereteatrali/'+nomepagina+'.txt'
    try:
        wikipedia.output( 'leggo il file %s' % nomefile )   
        # Legge un file.
        in_file = open(nomefile,"r")
        contenuto = in_file.read()
        in_file.close()
    except IOError, (errno, strerror):
        print "I/O error(%s): %s" % (errno, strerror)
        contenuto='errore'
    except ValueError:
        print "Could not convert data to an integer."
        contenuto='errore'
    except WindowsError:
        print "Unexpected error:", sys.exc_info()[0]
        contenuto='errore'
    except:
        print "Unexpected error:", sys.exc_info()[0]
        contenuto='errore'
        raise
    return contenuto

def cancellafile(nomepagina):
    nomepagina = re.sub('\/', '_', nomepagina).strip()
    nomepagina = re.sub(' ', '_', nomepagina).strip()
    nomepagina = re.sub('"', '_', nomepagina).strip()
    nomepagina = re.sub('\?', '_', nomepagina).strip()
    nomefile='opereteatrali/'+nomepagina+'.txt'
    wikipedia.output('provo a cancellare il file %s' % nomefile)
    try:      
        os.remove(nomefile)
    except IOError, (errno, strerror):
        print "I/O error(%s): %s" % (errno, strerror)
        contenuto='errore'
    except ValueError:
        print "Could not convert data to an integer."
        contenuto='errore'
    except:
        print "Unexpected error:", sys.exc_info()[0]
        contenuto='errore'
        raise
    
def templatesWithParams(self, thistxt, get_redirect=False):
    
    # remove commented-out stuff etc.
    thistxt  = wikipedia.removeDisabledParts(thistxt)

    # marker for inside templates or parameters
    marker = wikipedia.findmarker(thistxt,  '@@', '@')

    # marker for links
    marker2 = wikipedia.findmarker(thistxt,  '##', '#')

    # marker for math
    marker3 = wikipedia.findmarker(thistxt,  '%%', '%')

    result = []
    inside = {}
    count = 0
    Rtemplate = re.compile(
                ur'{{(msg:)?(?P<name>[^{\|]+?)(\|(?P<params>[^{]*?))?}}')
    Rlink = re.compile(ur'\[\[[^\]]+\]\]')
    Rmath = re.compile(ur'<math>[^<]+</math>')
    Rmarker = re.compile(ur'%s(\d+)%s' % (marker, marker))
    Rmarker2 = re.compile(ur'%s(\d+)%s' % (marker2, marker2))
    Rmarker3 = re.compile(ur'%s(\d+)%s' % (marker3, marker3))

    # Replace math with markers
    maths = {}
    count = 0
    for m in Rmath.finditer(thistxt):
        count += 1
        text = m.group()
        thistxt = thistxt.replace(text, '%s%d%s' % (marker3, count, marker3))
        maths[count] = text

    while Rtemplate.search(thistxt) is not None:
        for m in Rtemplate.finditer(thistxt):
            # Make sure it is not detected again
            count += 1
            text = m.group()
            thistxt = thistxt.replace(text,
                                      '%s%d%s' % (marker, count, marker))
            # Make sure stored templates don't contain markers
            for m2 in Rmarker.finditer(text):
                text = text.replace(m2.group(), inside[int(m2.group(1))])
            for m2 in Rmarker3.finditer(text):
                text = text.replace(m2.group(), maths[int(m2.group(1))])
            inside[count] = text

            # Name
            name = m.group('name').strip()
            m2 = Rmarker.search(name) or Rmath.search(name)
            if m2 is not None:
                # Doesn't detect templates whose name changes,
                # or templates whose name contains math tags
                continue

            # {{#if: }}
            if name.startswith('#'):
                continue
            
            # Parameters
            paramString = m.group('params')
            params = []
            if paramString:
                # Replace links to markers
                links = {}
                count2 = 0
                for m2 in Rlink.finditer(paramString):
                    count2 += 1
                    text = m2.group()
                    paramString = paramString.replace(text,
                                    '%s%d%s' % (marker2, count2, marker2))
                    links[count2] = text
                # Parse string
                markedParams = paramString.split('|')
                # Replace markers
                for param in markedParams:
                    
                    for m2 in Rmarker.finditer(param):
                        param = param.replace(m2.group(),
                                              inside[int(m2.group(1))])
                    for m2 in Rmarker2.finditer(param):
                        param = param.replace(m2.group(),
                                              links[int(m2.group(1))])
                    for m2 in Rmarker3.finditer(param):
                        param = param.replace(m2.group(),
                                              maths[int(m2.group(1))])
                    params.append(param)

            # Add it to the result
            result.append((name, params))
            
    return result
    
def caratteri(parola):
    caratteri = {u"È":"E",
             u"É":"E",
             u"Č":"C"
             }
    for car in caratteri.keys():
        alf=caratteri[car]
        if parola.startswith(car):
            parolasenza = parola[len(car):] 
            parola = alf+parolasenza
    return parola
            
def linguaLink(lingua):
    #Se il campo è vuoto
    if lingua == '':
        ops= 'Oooops, stringa nulla'
        wikipedia.output( ops )
    else:    
        if re.search(r'[Ii]nglese', lingua):
            lingua='{{en}}'
        elif re.search(r'[Ll]atin', lingua):
            lingua='{{la}}'
        elif re.search(r'[Gg]rec', lingua):        
            if re.search(r'[Gg]reco [Aa]ntico', lingua):
                lingua='{{grc}}'
            else:
                lingua='{{el}}'
        elif re.search(r'[Ff]rancese', lingua):
            lingua='{{fr}}'
        elif re.search(r'[Tt]edesc', lingua):
            lingua='{{de}}'
        elif re.search(r'[Ss]pagnol', lingua):
            lingua='{{es}}'
        elif re.search(r'[Nn]orvegese', lingua):
            lingua='{{no}}'
        elif re.search(r'[Gg]iapponese', lingua):
            lingua='{{ja}}'
        elif re.search(r'[Cc]inese', lingua):
            lingua='{{zh}}'
        elif re.search(r'[Rr]uss', lingua):
            lingua='{{ru}}'
        elif re.search(r'[Ss]vedese', lingua):
            lingua='{{sv}}' 
        #Dialetti
        elif re.search(r'[Nn]apoletan', lingua):
            lingua='{{nap}}'
        elif re.search(r'[Ll]ombard', lingua):
            lingua='{{lmo}}'
        elif re.search(r'[Ss]icilian', lingua):
            lingua='{{scn}}'
        elif re.search(r'[Vv]enet', lingua):
            lingua='{{vec}}'
        #Se è italiano, va omesso
        elif re.search(r'[Ii]talian', lingua):
            lingua=''
        #Se è una lingua diversa dalle precedenti, avviso
        else:
            avvisolingua='Trovata nuova lingua: '+lingua
            if re.search(r'\[\[', lingua):
                lingua=lingua
            else:
                lingua='[['+lingua+']]'     
    return lingua
 
def autoreLink(nomeautore, cognomeautore):
    autore=''
    nomeautore = re.sub('\[', '', nomeautore).strip()
    nomeautore = re.sub('\]', '', nomeautore).strip()
    cognomeautore = re.sub('\[', '', cognomeautore).strip()
    cognomeautore = re.sub('\]', '', cognomeautore).strip() 
    if nomeautore and cognomeautore:
        autore= nomeautore+' '+cognomeautore
    elif nomeautore and not cognomeautore:
        autore= nomeautore
    elif cognomeautore and not nomeautore:
        autore= cognomeautore
    else:
        autore=''        
    if autore:
        linkautore=leggifile(autore)
        linkautore=linkautore.decode("utf8")
        if linkautore == '' or linkautore == 'errore':
            voceautore = wikipedia.Page('it', autore)
            if voceautore.exists(): 
                linkautore = voceautore.title()
                if voceautore.isDisambig():
                    linkautore = voceautore.title()
                    
                elif voceautore.isRedirectPage(): 
                    voceautore=voceautore.getRedirectTarget()
                    linkautore = voceautore.title()
            else:
                linkautore = autore
            scrivifile(autore, linkautore)
            linkautore=leggifile(autore)
            linkautore=linkautore.decode("utf8")               
        autore = linkautore
             
        if autore == 'Anonimato':
            autore = 'Anonimato|Anonimo'       
    autore='[['+autore+']]'
    nomeautore=''
    cognomeautore=''
    if autore == '[[]]':
        autore=''
    return autore
 
def titoloLink(titoloorig):
    titoloorig = re.sub('\n', '', titoloorig).strip()
    titoloorig = re.sub('<[Bb][Rr]/>', '', titoloorig).strip()
    articoli = ["Il ", "Lo ", "La ", "I ", "Gli ", "Le ",
                "L'", "'O ", "'A ", "Los ", "Lu ", "U ", "The ", "El ", 
                "Un ", "Uno ", "Una ", "Un'", "Uno dei ", "Una delle ", "Uno degli ", "..."]
    titolo=titoloorig 
    for articolo in articoli:
        if titoloorig.startswith(articolo):
            titolosenza = titoloorig[len(articolo):]
 
            titolomaiuscolo = titolosenza[:1].upper()+titolosenza[1:]
            titolo=titolomaiuscolo +', '+articolo
    titolo=caratteri(titolo)
    return titolo


def stringaDramma(parametri, nomepagina):
    pretesto=u'* '
    titolodef=''
    trattino=u' - '
    barra=''
    link=''    
    diz = {'Titoloitaliano':'',
           'Titolooriginale':'',
           'Nome':'',
           'Cognome':'',
           'Nome2':'',
           'Cognome2':'',
           'Nome3':'',
           'Cognome3':'',
           'Dramma':'',
           'Drammalink':'',
           'PostDramma':'',
           'Immagine':'',
           'ImmagineDimensione':'',
           'Didascalia':'',
           'Titolooriginale':'',
           'Source':'',
           'Linguaoriginale':'',
           'Lingua2':'',
           'Genere':'',
           'Soggetto':'',
           'Scena':'',
           'Epocacomposizione':'',
           'Primapubblicazione':'',
           'Primarappresentazione':'',
           'Teatro':'',
           'Primaitaliana':'',
           'Teatroprimaitaliana':'',
           'Premi':'',
           'Versionisuccessive':'',
           'Personaggi':'',
           'Autografo':'',
           'Opera':'',
           'Cinema':'',
           # spettacolo teatrale
           'nomesceneggiatore':'',
           'nomesoggetto':'',
           # opera
           'titoloitaliano':'',
           'titolooriginale':'',
           'musica':'',
           'libretto':'',
           'soggetto':'',
           'linguaoriginale':'',
           'epocacomposizione':''
           }   
    rx1 = re.compile(r" ?= ?")
    for p in parametri:
        p=p.decode("utf8")
        pl = re.split(rx1, p, 1)
        if len(pl) == 2:
            nomep=pl[0]
            lunp=len(nomep)           
            while nomep.startswith(' '):
                nomep=nomep[1:]
                
            while nomep.endswith(' '):
                nomep=nomep[lunp:]
                lunp=lunp-1               
            for k in diz.keys():
                kup=k.upper()
                pup=pl[0].upper()
                if kup == pup:
                    contp = pl[1]
                    contp = re.sub('\n', '', contp).strip()
                    contp = re.sub('=', '', contp).strip()
                    while contp.startswith(' '):
                        nomep=nomep[1:]
                        
                    while contp.endswith(' '):
                        nomep=nomep[lunp:]
                        lunp=lunp-1
                    if len(contp) < 2:
                        continue
                    else:
                        ##scrivo entry nel dizionario##
                        diz[k] = contp
    titolo = diz['Titoloitaliano']
    if titolo == '':
        titolo = diz['titoloitaliano']        
    titolo = re.sub('\n', '', titolo).strip()
    titolo = re.sub('<[Bb][Rr]/>', ' ', titolo).strip()
    titolo = re.sub('<[Bb][Rr]>', ' ', titolo).strip()
    titolo = re.sub('<[Bb][Rr] />', ' ', titolo).strip()
    
    titoloorig = diz['Titolooriginale']
    if titoloorig == '':
        titoloorig = diz['titolooriginale']
    titoloorig = re.sub('\n', '', titoloorig).strip()
    titoloorig = re.sub('<[Bb][Rr]/>', ' ', titoloorig).strip()
    titoloorig = re.sub('<[Bb][Rr]>', ' ', titoloorig).strip()
    titoloorig = re.sub('<[Bb][Rr] />', ' ', titoloorig).strip()    
    if titolo:
        if titolo == nomepagina:
            barra=''
            link=''            
        else:
            barra = u'|'
            link = titolo
    else:
        barra=''
        link=''
    titolodef= u"[["+nomepagina+barra+link+"]]"
    lingualink = linguaLink(diz['Linguaoriginale'])
    if lingualink == '':
        lingua=''
        
        lingualink = linguaLink(diz['linguaoriginale'])
        if lingualink == '':
            lingua=''
    else:
        lingua=lingualink+' '
        
    if  titoloorig :
        titoloorig=u" ("+lingua+"\'\'"+titoloorig+"'\')"
    else:
        titoloorig=''        
    #AUTORE
    aut1=''
    aut2=''
    aut3=''
    autore=''
    autore = autoreLink(diz['Nome'], diz['Cognome'])
    if autore:
        stringaautore=' di '+autore
    else:
        stringaautore=''
    if stringaautore=='':
        stringaautore = ' - sceneggiatura di '+diz['nomesceneggiatore']
    if stringaautore == ' - sceneggiatura di ':
        stringaautore = ''
        
    if stringaautore=='':
        stringaautore = ' - soggetto di '+diz['nomesoggetto']
    if stringaautore == ' - soggetto di ':
        stringaautore = ''
    #EVENTUALI ALTRI AUTORI
    autore2 = autoreLink(diz['Nome2'], diz['Cognome2'])
    if autore2:
        aut2=', '+autore2
    else:
        aut2=''
    autore3 = autoreLink(diz['Nome3'], diz['Cognome3'])
    if autore3:
        aut3=', '+autore3
    else:
        aut3=''
    musica = diz['musica'] 
    libretto = diz['libretto']
    soggetto = diz['soggetto']
    if len(musica) > 4:
        musica = trattino+'Musica: '+musica
    if len(libretto) > 4:
        libretto = trattino+'Libretto: '+libretto
    if len(soggetto) > 4:
        soggetto = trattino+'Soggetto: '+soggetto
    autorem=musica+libretto+soggetto    
    # EPOCA
    epoca = diz['Epocacomposizione']
    epoca2 = diz['epocacomposizione']
    prima = diz['Primarappresentazione']
    pubblicata = diz['Primapubblicazione']
    teatro = diz['Teatro']
    if epoca:
        epoca = re.sub(r'<.*>', '', epoca).strip()
        epoca=trattino+epoca
    elif epoca2:
        epoca2 = re.sub(r'<.*>', '', epoca2).strip()
        epoca=trattino+epoca2
    else:
        epoca=''               
    if prima:
        prima = re.sub(r'<.*>', '', prima).strip()        
        prima=trattino+'Prima: '+prima
        if teatro:
            teatro = re.sub(r'<.*>', '', teatro).strip()
            prima=prima+', '+teatro+'.'                    
    if pubblicata:
        pubblicata = re.sub(r'<.*>', '', pubblicata).strip()
        pubblicata=trattino+'Pubblicata: '+pubblicata
    #tipo di dramma
    dr=diz['Dramma']
    post=diz['PostDramma']
    if dr:
        dram=' - '+dr+' '+post
    else:
        dram=''
    stringa = pretesto+titolodef+titoloorig+dram+stringaautore+aut2+aut3+autorem+epoca+prima+pubblicata
    stringa = re.sub('\n', ' ', stringa).strip()
    stringa = re.sub(r'<[Bb][Rr] ?/?>', '', stringa).strip()
    return stringa

def intestazione():       
    riga1=u'{| style="font-size:100%;margin:0 auto; background: #EFEFEF" align=center width=100% id=toc\n'
    riga2=u'|Questa pagina contiene informazioni ricavate automaticamente dalle voci di opere teatrali con l\'ausilio del \'\'\'[[Template:Dramma]]\'\'\' e di un [[Utente:YuBot|bot]]. L\'aggiornamento è periodico e automatico.\n'
    riga3=u'|-\n|align="left"|Se manca un\'opera in questa lista, accertati che la sua voce contenga il template [[template:Dramma|dramma]]. Se i dati riportati sono sbagliati, \'\'\'correggi direttamente la voce dell\'opera teatrale:\'\'\' '
    riga4=u'le modifiche saranno visibili in questa lista al prossimo aggiornamento. Per chiarimenti domanda pure al [[Utente:Yuma|manovratore]].\n'
    riga5=u'|-\n|\'\'\'N.B.:\'\'\' \'\'Non si garantisce l\'accuratezza delle info riguardanti voci con altri template sinottici: alcune fra tali voci sono segnalate qui solo a scopo di verifica. Non sono incluse in questa lista le voci di opere teatrali [[:Categoria:Da verificare per enciclopedicità - teatro|da verificare per enciclopedicità]]\'\'.</small>'
    testata=riga1+riga2+riga3+riga4+'\n|}'
    return testata

def main():
    testata=intestazione()    
    indiceinizio=u'\n__NOTOC__\n{| border="1" cellpadding="3" cellspacing="0" style="clear:center; float:center; margin:auto; margin-top:.5em; margin-bottom:.5em; background:#FAFAFA; border:1px solid #CCC; border-collapse:collapse; text-align:center; font-family: Helvetica, Frutiger 45 Light, Arial"\n|\'\'\'{{MediaWiki:Toc}}\'\'\' <br />'
    indicelettere=''
    indicefine=u'\n|}\n'       
    newtext=''    
    sezione=''
    autore=''
    nomepagina=''    
    warning=''
    barra=''
    link=''
    epoca=''
    voci=[]
    voci = gestorelista()
    count=0
    for nomepagina in voci:
        if nomepagina:
            wikipedia.output('\n>>> %s <<<' % nomepagina)
            contenuto=leggifile(nomepagina)
            if contenuto == '' or contenuto == 'errore':
                pagina=wikipedia.Page('it', nomepagina)
                try:
                    contenuto=pagina.get()
                    scrivifile(nomepagina, contenuto)
                    testo=leggifile(nomepagina)
                except:
                    voci.remove(nomepagina)
                    time.sleep(4)
                    continue
            else:
                testo=contenuto
        else:
            continue       
        titor=False
        titoloorig=''
        diz= {}
        dizOpera= {}
        autore=''
        titolodef=''
        titoloorig=''
        epoca=''
        warning=''
        stringa=''
        listaparametri=templatesWithParams(nomepagina, testo)
        stringa = '* \'\'\'[['+nomepagina+']]\'\'\''
        warning = u' <small>\'\'\'N.B.:\'\'\' Non è presente un template sinottico, oppure vi sono errori di compilazione.</small>'
        for parametri in listaparametri:
            if re.search(r'[Dd]ramma', parametri[0]):
                avviso='trovato tl. dramma'
                wikipedia.output( avviso )
                stringa=stringaDramma(parametri[1], nomepagina)
                warning=''
                break
            elif re.search(r'[Oo]pera', parametri[0]):
                avviso='trovato tl. opera'
                wikipedia.output( avviso )
                stringa=stringaDramma(parametri[1], nomepagina)
                warning = u' <small>\'\'\'N.B.:\'\'\' in questa voce è in uso il [[Template:Opera]]</small>'
                break
            elif re.search(r'[Ss]pettacolo', parametri[0]):
                avviso='trovato tl. spettacolo teatrale'
                wikipedia.output( avviso )
                stringa=stringaDramma(parametri[1], nomepagina)
                warning = u' <small>\'\'\'N.B.:\'\'\' in questa voce è in uso il [[Template:Spettacolo teatrale]].</small>'
                break
            else:
                continue
        if stringa == '':
            continue
        titolopersezione=titoloLink(nomepagina)
        letteranuovasezione=titolopersezione[0]
        if sezione:
            if titolopersezione.startswith(sezione):
                nuovasezione=''
            else:
                sezione=titolopersezione[0]
                nuovasezione=u'=='+sezione+'==\n'
                indicelettera=u' [[#'+sezione+'|'+sezione+']]'
                indicelettere=indicelettere+indicelettera
        else:
            sezione=titolopersezione[0]
            nuovasezione=u'=='+sezione+'==\n'
            indicelettera=u' [[#'+sezione+'|'+sezione+']]'
            indicelettere=indicelettere+indicelettera
        stringa= nuovasezione+stringa+warning 
        wikipedia.output(stringa)
        newtext=newtext+stringa+"\n"

    wikipedia.output(u'*************************************************')
    wikipedia.output(u'*                                               *')
    wikipedia.output(u'*      Elaborazione dei dati completata         *')
    wikipedia.output(u'*                                               *')
    wikipedia.output(u'*************************************************')

    inizio=testata+indiceinizio+indicelettere+indicefine
    fine='\n==Note==\n<references/>'
    lista=pagina_output
    nuovotesto = inizio + newtext + fine
    vecchiotesto=pagina_input.get() 
    wikipedia.showDiff(vecchiotesto, nuovotesto)
    choice = wikipedia.inputChoice(u"Aggiorno?",  ['Yes', 'No'], ['y', 'N'], 'N')
    if choice in ['Y', 'y']:
        wikipedia.setAction('opere teatrali.py 2.0: aggiorno')
        lista.put(nuovotesto)
        testolog_new= '*{{subst:LOCALDAY}} {{subst:LOCALMONTHNAME}} {{subst:LOCALYEAR}}, {{subst:LOCALTIME}} - Aggiornato l\'elenco  [[Progetto:Teatro/Opere teatrali]]\n'
        testolog_old=pagina_log.get()
        testolog = testolog_new+testolog_old
        pagina_log.put(testolog)
    else:
        wikipedia.stopme()        
        
if __name__ == "__main__":
        try:
                main()
        finally:
                wikipedia.stopme()

monitinsert.py

# -*- coding: utf-8 -*-

"""
Questo script serve per inserire il template monitoraggio.
Si richiede di specificare un parametro di progetto.

***ATTENZIONE**** Sarebbe bene evitare l'inserimento automatico
del monitoraggio nel caso in cui la cosa comporti la creazione
massiccia di pagine di discussione senza info rilevanti (meglio
inserirne poche alla volta e compilare i template).
"""

import wikipedia, sys, re, catlib

def workon(lista, varp):
    template= '{{Monitoraggio\n|progetto= '+varp+'\n|progetto2= '+'\n|accuratezza= ' +  '\n|scrittura= ' + '\n|fonti= ' + '\n|immagini= ' + '\n|note= ' + '\n|utente= ' + '\n|data= ' + '\n}}\n'
      
    for voce in lista:
        oldtext=''
        print voce.namespace()
        if voce.namespace() == 0:
            nomediscu='Discussione:'+voce.title()
            discussione=wikipedia.Page('it', nomediscu)       
            
            wikipedia.output(u'\n>>> %s <<<' % discussione.title())
        
            if discussione.exists():
                try:
                    oldtext=discussione.get()
                except discussione.isRedirectPage() or discussione.isDisambig():
                    wikipedia.output(u'Redirect o disambigua.')
                    continue
                
                else:
                    wikipedia.output(u'La pagina %s esiste.' %discussione.title())
                    
                    if re.search(r'\{\{[Mm]onitoraggio', oldtext):
                            wikipedia.output(u'Monitoraggio presente, proseguo.')
                    else:
                        newtext= template + oldtext
                        wikipedia.showDiff(oldtext, newtext)
                        choice = wikipedia.inputChoice(u"Conferma la modifica" ,  ['Si', 'No'], ['s', 'N'], 'N')
                        if choice in ['S', 's']:
                            wikipedia.output (u'Inserisco il template monitoraggio.')
                            wikipedia.setAction(u'Bot: monitoraggio %s' % varp)
                            discussione.put(newtext)
                
            else:
                wikipedia.output(u'Non esiste una pagina di discussione per la voce %s' % voce.title())
                choice = wikipedia.inputChoice(u"Vuoi creare la pagina (sconsigliato)?" ,  ['Si', 'No'], ['s', 'N'], 'N')
                if choice in ['S', 's']:
                    newtext= template + oldtext
                    wikipedia.showDiff(oldtext, newtext)
                    choice = wikipedia.inputChoice(u"Conferma la modifica" ,  ['Si', 'No'], ['s', 'N'], 'N')
                    if choice in ['S', 's']:
                        wikipedia.output (u'Inserisco il template monitoraggio.')
                        wikipedia.setAction(u'Bot: monitoraggio %s' % varp)
                        discussione.put(newtext)        
def main():
    
    lista=[]
    varp=''

    
    varp=wikipedia.input(u'Mi serve la variabile \'progetto\' da inserire:')
    if varp:
        choice = wikipedia.inputChoice(u"Scegli il metodo di creazione dell'elenco di voci: 'categoria' o 'puntanoQui?",  ['categoria', 'puntanoQui'], ['c', 'p'], '')
        if choice in ['C', 'c']:
            nomecat=wikipedia.input(u"Specifica una categoria")
            cat=catlib.Category('it', 'Categoria:'+nomecat)
            lista=[page for page in cat.articlesList()]
            
        if choice in ['P', 'p']:
            portale=wikipedia.Page('it', 'Portale:'+varp)
            if portale.exists():
                choice = wikipedia.inputChoice(u"Cerco i collegamenti a %s?"  % portale.title(),  ['Si', 'No per inserire un\'altra pagina'], ['s', 'N'], 'N')
                if choice in ['S', 's']:
                    lista=[page for page in portale.getReferences()]
                elif choice in ['N', 'n']:
                    nomepagina=wikipedia.input(u'Inserire il nome completo della pagina o del template: ')
                    pagina=wikipedia.Page('it', nomepagina)                    
                    lista=[page for page in pagina.getReferences()]
    if lista:
        workon(lista, varp)
    else:
        choice = wikipedia.inputChoice(u"Termino il programma?",  ['Si', 'No'], ['s', 'N'], 'S')
        if choice in ['N', 'n']:
            main()
        
    
if __name__ == "__main__":

    print __doc__
    
    try:
        main()
    finally:
        wikipedia.stopme()