Usuari:PereBot/robot canvia cal coor

# -*- coding: utf-8 -*-
# Programa per posar una plantilla {{cal coor}} més concreta.
# Intenta descartar primer els articles que no necessiten coordenades (biografies, llistes, etc)

import re, sys
sys.path.append('C:\pywikipedia')
import wikipedia, catlib

#Paraules amb les que comencen categories que tenen les pàgines que no necessiten coordenades (principalment biografies)
#PER FER: SEPARAR LES CATEGORIES ON NO BUSCAR ARTICLES DE LES CATEGORIES ON NO POSAR COORDENADES
def catsnocoord():
    cadena = u"Persones|Polítics|Escriptors|Pintors|Dibuixants"
    cadena += u"|Poetes|Dramaturgs|Novel·listes|Autors|Traductors"
    cadena += u"|Escultors|Arquitectes|Músics|Cantants|Actors|Compositors"
    cadena += u"|Artistes|Cuiners|Bandolers"
    cadena += u"|Esportistes|Jugadors|Entrenadors"
    cadena += u"|Futbolistes|Ciclistes|Nedadors|Tennistes|Golfistes|Pilotaires"
    cadena += u"|Medallistes|Campions|Guanyadors"
    cadena += u"|Emperadors|Reis|Ducs|Grans ducs|Comtes|Vescomtes|Virreis|Nobles"
    cadena += u"|Tsars|Electors|Prínceps|Infants|Barons|Diàdocs|Khans|Califes"
    cadena += u"|Reines|Consorts|Emperadrius|Primeres dames"
    cadena += u"|Cònsols|Tribuns|Pretors|Sàtrapes|Faraons|Tirans|Governants"
    cadena += u"|Governadors|Senyors|Marcgravis|Majordoms|Sobirans"
    cadena += u"|Exiliats|Militars|Comandants|Militars|Pilots"
    cadena += u"|Socialistes|Comunistes|Feministes|Militants|Feixistes|Nazis"
    cadena += u"|Activistes|Presidents|Ministres|Primers ministres"
    cadena += u"|Alcaldes|Consellers|Regidors|Diputats|Senadors"
    cadena += u"|Empresaris|Dirigents"
    cadena += u"|Periodistes|Directors|Advocats|Juristes"
    cadena += u"|Científics|Economistes|Físics|Químics|Matemàtics"
    cadena += u"|Historiadors|Arqueòlegs|Filòsofs"
    cadena += u"|Alumnes|Professors"
    cadena += u"|Papes|Religiosos|Bisbes|Monjos|Frares|Abats|Canonges|Sacerdots"
    cadena += u"|Sants|Heretges|Beats|Déus"
    cadena += u"|Jesuïtes|Benedictins|Dominics"
    cadena += u"|Catalans|Anglesos|Escocesos|Gal·lesos"
    cadena += u"|Víkings|Alemanys|Bavaresos|Prussians|Suïssos|Novaiorquesos"
    cadena += u"|Andalusins|Àrabs|Algerians|Egipcis"
    cadena += u"|Imams|Musulmans|Emirs|Sultans|Companys"
    cadena += u"|Discs|Cançons|Grups de música|Pel·lícules|Canals de televisió|Programes"
    cadena += u"|Obres literàries|Obres de literatura|Obres teatrals"
    cadena += u"|Llibres|Novel·les|Contes|Personatges|Programari|Videojocs|Consoles"
    cadena += u"|Dominis de primer|Monedes|Himnes|Banderes|Escuts|Tractats"
    cadena += u"|Seleccions|Clubs|Partits|Jocs|Campionat|Condecoracions|Open"
    cadena += u"|Plantilles|Llistes|Articles destacats|Articles bons"
    cadena += u"|Esport|Empreses|Economia|Música|Literatura"  #Provisional. Treure quan no calgui.
    cadena += u"|Ifranja|Corona d'Aragó|Sacre Imperi"  #Provisional. Treure quan no calgui.
    cadena += u"|Primera Guerra Mundial"  #Provisional. Treure quan no calgui.
    return cadena

# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat, catprevies=[], filtre=u""):
    articles = cat.articlesList(recurse=False)
    categories = cat.subcategoriesList(recurse=False)
    for scat in categories:
        print scat
#        print u"Títol",scat.title()
        if scat not in catprevies:
            catprevies.append(scat)
            if filtre == u"":
                nopassa = False
                print u"Filtre desactivat"
            else:
                nopassa = re.search(filtre,scat.title())                
            if not nopassa:
                print u"Sí que es llegeix", scat
                noucats, nouarts = miracatfiltre(scat, catprevies+categories, filtre)
                categories += noucats
                articles += nouarts
            else:
                print u"No es llegeix", scat
        else:
            print u"Aquesta ja la tinc vista"
    articles = catlib.unique(articles)         
    return categories, articles

# El programa comença aquí
def principal():
    tcatbuscar = u"Andorra" #Posar aquí la categoria que es revisarà
    missatge = "" #u" en el marc del [[Viquiprojecte:Unió Europea]]"  #Missatge promocional. Canviar per "" la resta de l'any.
    missatgeno = missatge # Missatge promocional per quan posa {{cal coor}}
    calcoortxt = u"{{cal coor and}}"
    categoria = catlib.Category(site,tcatbuscar)
    filtrecats = u"Categoria:(%s)" % catsnocoord()
    cats, artb = miracatfiltre(categoria, filtre=filtrecats)
    tcatnocoor = u"Articles mancats de coordenades"
    catnocoor = catlib.Category(site, tcatnocoor)
    artn = catnocoor.articlesList()
    sartb = set(artb)
    sartn = set(artn)
    sartbn = sartb.intersection(sartn)
    lartbn = list(sartbn)
    #lartbn=lartbn[0:3] #per fer proves
    print len(sartb), u"articles a ",tcatbuscar
    print len(lartbn), u"articles per revisar"
    for pag in lartbn:
        print pag
        text = pag.get()
        textnou = re.sub(u"\{\{ *[Cc]al coor *\}\}", calcoortxt, text)
        if text != textnou:
            pag.put(textnou, u"Bot canvia {{cal coor}} per %s" % calcoortxt)

if __name__ == '__main__':
    site=wikipedia.getSite('ca')
    principla()
    wikipedia.stopme()