Usuari:PereBot/robot interseca categories

# -*- coding: utf-8 -*-
# Programa per intersecar categories.
# Feu servir les funcions totcat, interseca i neteja
# per efectuar operacions amb categories.

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

# 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 %s" % scat
                noucats, nouarts = miracatfiltre(scat, catprevies+categories, filtre)
                categories += noucats
                articles += nouarts
            else:
                print u"No es llegeix %s" % scat
        else:
            print u"Aquesta ja la tinc vista"
    articles = catlib.unique(articles)  
    return categories, articles

# Transforma el caràcter inicial [Xx] (per fer expressions regulars acceptant
# majúscula i minúscula)
def inicialcaixa(text):
    inicial = text[0]
    inicial = u"[{}{}]".format(inicial.upper(),inicial.lower())
    return inicial+text[1:]

# Patró per a l'expressió regular del codi per una categoria
def catreg(nom):
    return u"\[\[ *[Cc]ategoria *: *%s *(]]|\|)" % inicialcaixa(nom)

# Patró per a l'expressió regular del codi per una categoria
def catregesborra(nom):
    return u"\[\[ *[Cc]ategoria *: *%s *(\|.*)?]]\n?" % inicialcaixa(nom)

# Treu en una pàgina les categories c1 i c2 i hi posa la cd
# Els arguments són el text de la pàgina i els noms de les categories
# (sense "Categoria:").
def canviacat(text, c1, c2, cd):
    cr1 = catreg(c1)
    cr2 = catreg(c2)
#    cr1c=cr1+u"\n?"
#    cr2c=cr2+u"\n?"
    cr1e = catregesborra(c1)
    cr2e = catregesborra(c2)
    texcatd = u"[[Categoria:%s]]" % cd
    texcatds = ur"[[Categoria:%s\1" % cd
    if re.search(cr1, text):
        text = re.sub(cr1, texcatds, text)
        text = re.sub(cr2e, "", text)
    else:
        text = re.sub(cr1e, "",text)
        if re.search(cr2,text):
            text = re.sub(cr2,texcatds,text)
        elif re.search(u"\[\[ *[Cc]ategoria *:", text):
            text = re.sub(u"\[\[ *[Cc]ategoria *:", u"%s\n[[Categoria:" % texcatd, text, count=1)
        else:
            print u"No trobo on posar la categoria i la poso al final"
            text += u"\n%s" % textcatd
    return text

# Treu en una pàgina la categoria c1
# Els arguments són el text de la pàgina i el nom de la categoria
# (sense "Categoria:").
def treucat(text, c1):
    cr1 = catreg(c1)
    cr1c = u"%s\n?" % catregesborra(c1)
    if re.search(cr1, text):
        text = re.sub(cr1c, u"", text)
    else:
        print u"No trobo la categoria %s que he de treure" % c1
    return text

# Recull dades d'una categoria en una tupla
def totcat(titol, filtre=u"", recurse=True):
    print "Llegint la categoria", titol
    categoria = catlib.Category(site, titol)
    contingut0 = categoria.articlesList(recurse=False)
    if recurse:
        subcategories, contingut = miracatfiltre(categoria, filtre=filtre)
    else:
        contingut = contingut0
        subcategories = categoria.subcategoriesList(recurse=False)
    return (titol, categoria, contingut0, contingut, subcategories)

# Interseca categories (editant els articles)
# Si treu=False no treu la categoria segon
# Les dades són les tuples de les categories a intersecar
# i la categoria resultat.
def interseca(primer, segon, tercer, treu=True):
    tit1, cat1, cont01, cont1, subc1 = primer
    tit2, cat2, cont02, cont2, subc2 = segon
    tit3, cat3, cont03, cont3, subc3 = tercer
    scont1 = set(cont1)
    scont2 = set(cont2)
    scont3 = set(cont3)
    sconti = (scont1 & scont2) - scont3
#    print cat1,scont1
#    print cat2,scont2
#    print cat3,scont3
    print u"Resultat:",sconti
    for el in sconti:
        print el
        text = el.get(force=True)
        if treu:
            noutext = canviacat(text, tit1, tit2, tit3)
        else:
            noutext = canviacat(text, tit1, tit1, tit3)           
    #    print noutext
        if noutext != text:
            sumari = u"Robot posa [[Categoria:{}]] intersecant [[Categoria:{}]] i [[Categoria:{}]]".format(tit3, tit1, tit2)
            el.put(noutext, sumari)
        else:
            print u"No ha canviat res"
    return    

# Treu categories redundants.
# Les dades són les tuples de la categoria redundant i la categoria a conservar.
def neteja(redundant, conserva):
    tit1, cat1, cont01, cont1, subc1 = redundant
    tit2, cat2, cont02, cont2, subc2 = conserva
    scont01 = set(cont01)
    scont02 = set(cont02)
    streure = scont01 & scont02
    if len(streure) > 0:
        print u"Començo a treure la categoria redundant %s" % tit1
    else:
        print u"No és redundant %s" % tit1
    for el in streure:
        print el
        text = el.get(force=True)
        noutext = treucat(text, tit1)
        if noutext != text:
            sumari = u"Robot treu [[Categoria:{}]] redundant amb [[Categoria:{}]]".format(tit1, tit2)
            el.put(noutext, sumari)
        else:
            print u"No ha canviat res"
    return

#El programa comença aquí
def principal():
    #cienb=totcat(u"Científics barcelonins contemporanis")
    #ciencc=totcat(u"Científics catalans del sud contemporanis",recurse=False)
    #neteja(ciencc,cienb)
    bcnc = totcat(u"Barcelonins contemporanis",recurse=True,filtre=u"històrics|Obres d|Quadres")
    advc = totcat(u"Advocats catalans",filtre=u"Advocats barcelonins contemporanis")
    advbc = totcat(u"Advocats barcelonins contemporanis")
    interseca(bcnc,advc,advbc)
    advb = totcat(u"Advocats barcelonins",filtre=u"Advocats barcelonins contemporanis")
    interseca(bcnc, advb, advbc)
    bcn=totcat(u"Barcelonins", recurse=True, filtrec=u"històrics|Obres d|Quadres|contemporanis|cinema|televisió")
    #pv=totcat(u"Persones vives",recurse=False)
    #interseca(bcn,pv,bcnc,treu=False)
    #medalla=totcat(u"Medalles d'Honor de Barcelona",filtrec=u"Universitat de Barcelona")
    #interseca(bcn,medalla,bcnc,treu=False)
    premis=totcat(u"Premis de Catalunya", filtrec=u"Universitat de (Barcelona|València)|Montserat|Poblet|Mèxic")
    interseca(bcn, premis, bcnc, treu=False)
    #cienc=totcat(u"Científics catalans")
    #interseca(bcnc,cienc,cienb)
    neteja(bcn, bcnc)
    
    #neteja(macb,mc2)
    #neteja(macb2,mc2)
    #neteja(macb3,mc3)
    #neteja(macb4,mc4)
    #neteja(macb5,mc5)
    #neteja(macb6,mc6)
    #neteja(macb7,mc7)
    #interseca(macb,mc1,macb2)
    #interseca(macb,mc1,mc2)
    #mpirc=totcat(u"Muntanyes del Pirineu català",recurse=False)
    #mpirf=totcat(u"Muntanyes del Pirineu francès",recurse=False)
    #mfontp=totcat(u"Muntanyes de Fontpedrosa")
    #mvall=totcat(u"Muntanyes del Vallespir")
    #mconf=totcat(u"Muntanyes del Conflent")
    #mpalls=totcat(u"Muntanyes del Pallars Sobirà")
    #mac=totcat(u"Muntanyes de l'Alta Cerdanya")
    #mpineda=totcat(u"Patrimoni monumental de Manresa")
    #masies=totcat(u"Masies")
    #mbaix=totcat(u"Masies del Baix Llobregat")
    #mcorb=totcat(u"Masies de Corbera de Llobregat")
    #corbera=totcat(u"Corbera de Llobregat")
    #interseca(mbaix,corbera,mcorb)
    #interseca(masies,corbera,mcorb)
    #stjust=totcat(u"Sant Just Desvern")
    #mstjust=totcat(u"masies de Sant Just Desvern")
    #interseca(mbaix,stjust,mstjust)
    #interseca(masies,stjust,mstjust)
    #estjust=totcat(u"edificis de Sant Just Desvern")
    #neteja(estjust,mstjust)
    #espl=totcat(u"Esplugues de Llobregat")
    #mespl=totcat(u"Masies d'Esplugues de Llobregat")
    #interseca(mbaix,espl,mespl)
    #interseca(masies,espl,mespl)
    #mlbaix=totcat(u"Monuments d'interès local del Baix Llobregat")
    #mlcat=totcat(u"Monuments d'interès local de Catalunya")
    #pcorb=totcat(u"Patrimoni monumental de Corbera de Llobregat")
    #mlcorb=totcat(u"Monuments d'interès local de Corbera de Llobregat")
    #interseca(mlbaix,pcorb,mlcorb)
    #interseca(mlcat,pcorb,mlcorb)
    #interseca(mlcat,corb,mlcorb)
    #pmaresme=totcat(u"patrimoni monumental del Maresme")
    #dosrius=totcat(u"Dosrius")
    #pdosrius=totcat(u"patrimoni monumental de Dosrius")
    #pineda=totcat(u"Pineda de Mar")
    #ppineda=totcat(u"patrimoni monumental de Pineda de Mar")
    #tordera=totcat(u"Tordera")
    #ptordera=totcat(u"patrimoni monumental de Tordera")
    #malgrat=totcat(u"Malgrat de Mar")
    #pmalgrat=totcat(u"patrimoni monumental de Malgrat de Mar")
    #neteja(advocatsc,advocatsm)
    #neteja(manresans,advocatsm)

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