Vés al contingut

Usuari:PereBot/robot puja monuments a Wikidata

De la Viquipèdia, l'enciclopèdia lliure

Versió puja i baixa

[modifica]

Versió que copia dades de les llistes a Wikidata a les llistes i de les llistes a Wikidata. Fa servir mwparserfromhell per llegir i editar les plantilles filera de les llistes de monuments (i altres llistes).

# -*- coding: utf-8 -*-
# Programa per pujar a Wikidata les dades dels monuments
# a partir de les llistes. Només puja les dades dels monuments amb
# article a cawiki.
# Puja commonscat, coordenades, foto, municipi (si el troba),
# estatus patrimonial i números de registre (si a Wikidata hi ha la propietat).
# El resultat es un codi per posar al quickstatements.
# A la vegada actualitza les llistes amb les dades de Wikidata.

import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,urllib,urllib2,json,pickle,math
import mwparserfromhell

# Elimina duplicats d'una llista
def unic(llista):
    llistanova=[]
    for el in llista:
        if not el in llistanova:
            llistanova.append(el)
    return llistanova

# Elimina l'enllaç d'un text. Funciona bé si hi ha un sol enllaç.
# Deixa el text que mostra l'enllaç (no on apunta)
def eliminaenllac(nom):
    nom=re.sub(u"\[\[.*\|","",nom)
    nom=nom.replace("[[","")
    nom=nom.replace("]]","")
    return nom

def plant(tit):
    return pywikibot.Page(site,u"Plantilla:{}".format(tit))

def actuallista(pllista,pagprova=False):
    resultat=u""
    origen=pllista.title()
    text=pllista.get()
    text0=text
    code = mwparserfromhell.parse(text)
    t=code.filter_templates();
    # Comença a buscar els articles enllaçats a 2 o més fileres per no actualtzar-les
    evistos=[]
    erepe=[]
    #print t
    for template in t:
        enllac=u""
        if template.has("nom"):
            nom=unicode(template.get("nom").value)
            nom=re.sub(u" *?nom *?= *?","",nom)
            nom=re.sub(u"<ref name.*>.*<.*>","",nom)
            nom=re.sub(u"<ref ?>.*<.*>","",nom)
            nom=re.sub(u"<.*>","",nom)
            nom=nom.strip()
            #print u"nom:",nom
            if len(re.findall(u"\[\[",nom))>1:
                print u"PERILL: 2 enllaços a",nom
            if re.search(u"\[\[.*\]\]",nom):
                enllac=re.sub(u"^.*?\[\[","",nom)
                enllac=re.sub(u"\]\].*?$","",enllac)
                enllac=re.sub(u"\|.*?$","",enllac)
                nomnet=eliminaenllac(nom)
                #print u"enllaç:",enllac
            else:
                nomnet=nom
            if enllac.lower() in evistos:
                erepe.append(enllac.lower())
            else:
                evistos.append(enllac.lower())
    print "enllaços repetits:",erepe
    #print "enllaços vistos:",evistos
    diccesp={}
    diccmunicipis={}
    diccprot={u"BIC":u"Q23712",u"BRL":u"Q11910247",u"BCIN":u"Q1019352",u"BCIL":u"Q11910250"}
    diccprot[u"BCIN-ZA"]=u"Q1019352"
    diccprot[u"PH.BCIN"]=u"Q1019352"
    diccprot[u"Inv."]=u"Q10387575"
    diccprot[u"Cat."]=u"Q10387684"
    diccprotand={u"BIC":u"Q5004973",u"BI":u"Q21095081"}
    classe0=u""
    for template in t:
        if  template.name.matches((u'Filera art públic',)):
            classe0=u"art"
        elif  template.name.matches((u'Filera IPA',u'Filera MH',u'Filera BIC',u'Filera BIC Val',u'Filera BIC And',u'filera BC Sard',u'filera BIC-ZA')):
            classe0=u"monument"
        elif  template.name.matches((u'Filera patrimoni natural',)):
            classe0=u"natural"
        else:
            continue
        if classe0!=u"":
            classe=classe0
            proposta=""
            nom=u""
            enllac=u""
            if template.has("nom"):
                nom=unicode(template.get("nom").value)
                nom=re.sub(u" *?nom *?= *?","",nom)
                nom=re.sub(u"<ref name.*>.*<.*>","",nom)
                nom=re.sub(u"<ref ?>.*<.*>","",nom)
                nom=re.sub(u"<.*>","",nom)
                nom=nom.strip()
                print nom
                if len(re.findall(u"\[\[",nom))>1:
                    print u"PERILL: 2 enllaços a",nom
                if re.search(u"\[\[.*\]\]",nom):
                    enllac=re.sub(u"^.*?\[\[","",nom)
                    enllac=re.sub(u"\]\].*?$","",enllac)
                    enllac=re.sub(u"\|.*?$","",enllac)
                    nomnet=eliminaenllac(nom)
#                   print enllac
                else:
                    nomnet=nom
            else:
                continue
            if enllac==u"":
                continue
            elif enllac.lower() in erepe:
                print nom,u"ignorat per enllac",enllac,u"repetit"
                continue
            elif u"#" in enllac:
                print nom,u"enllaçat a secció",enllac
                continue
            pag=pywikibot.Page(site,enllac)
            try:
                text=pag.get()
            except pywikibot.NoPage:
                continue
            except pywikibot.IsRedirectPage:
                pag=pag.getRedirectTarget()
                if pag.title().lower() in erepe:
                    print nom,u"ignorat per redirecció",enllac,u"a enllaç repetit"
                    continue
                elif u"#" in pag.title():
                    print nom,u"enllaçat a secció",enllac
                    continue
                try:
                    textnul=pag.get()
                except pywikibot.NoPage:
                    continue
                except pywikibot.IsRedirectPage:
                    print pag,u"doble redirecció"
                    continue
            except pywikibot.InvalidTitle:
                print u"títol invàlid"
                continue
            cats=pag.categories()
            print pag
            esmon=False
            esart=False
            esnat=False
            for cat in cats:
                ticat=cat.title()
                #print ticat
                if re.search(u"Categoria:(Monuments|Patrimoni monumental|Béns (Culturals|d'Interès)|Edificis|Castells|Esglésies|Ermites|Catedrals|Ponts)",ticat) and not re.search(u"Categoria:Llistes",ticat):
                    esmon=True
                if re.search(u"Categoria:(Escultures)",ticat) and not re.search(u"Categoria:Llistes",ticat):
                    esart=True
                if re.search(u"Categoria:(Muntanyes|Arbres|Platges|Estanys|Hàbitats|Parc|Volcans|Espais|Reserves|Rius|Rieres|Boscs|Zones humides|Illes|Illots|Coves|Jaciment|Arxipèlags|Paratges|.* individuals)",ticat) and not re.search(u"Categoria:Llistes",ticat):
                    esnat=True
            if esmon==False and classe==u"monument":
                print pag,u"monument sense categories de monuments"
                continue
            if esart==False and esmon==False and classe==u"art":
                print pag,u"art públic sense categories de monuments ni d'art"
                continue
            if esnat==False and classe==u"natural":
                print pag,u"natural sense categories de natural"
                continue
            #plants=pag.templates()
            #print plants
            #if plant(u"commonscat") in plants:
            #    print u"ja hi ha Commonscat"
            #if plant (u"coord") in plants:
            #    print u"ja hi ha Coord"
            try:
                pagdata=pywikibot.ItemPage.fromPage(pag)
                cont=pagdata.get()
            except NotImplementedError:
                print u"NotImplementedError: (possiblement detecta unitats)"
                continue                
            except pywikibot.NoPage:
                print u"No hi ha pàgina a Wikidata"
                continue
            qitem=pagdata.title()
            print u"id de Wikidata:",qitem
            ccatt=u""
            if template.has("commonscat"):
                ccatt=template.get("commonscat").value
                ccatt=ccatt.strip(u"\n").strip()
                if len(ccatt)<3:
                    ccatt=u""
            if "P373" in pagdata.claims:
                ccatd=pagdata.claims['P373'][0].getTarget()
                ccatd=ccatd.replace(u"\n",u"").strip()
                if ccatt<>u"":
                    print u"Commonscat a tot arreu"
                    print unicode(ccatd),unicode(ccatt)
                    if ccatd<>ccatt:
                        print u"PROBLEMA: ccat SÓN DIFERENTS",len(ccatd.strip()),len(ccatt.strip())
                else:
                    print "copiar commonscat a la llista"
                    print unicode(ccatd)
                    template.add("commonscat",ccatd+u"\n")                    
            else:
                if ccatt<>u"":
                    print u"pujar commonscat a Wikidata"
                    linia=u'{}\tP373\t"{}"\tS143\tQ199693'.format(qitem,ccatt)#commonscat
                    print linia
                    resultat=resultat+u"\n"+linia
                else:
                    print "commonscat enlloc"
            imgt=u""
            if template.has("imatge"):
                imgt=template.get("imatge").value
                imgt=imgt.strip().strip(u"\n").replace(u"_",u" ")
                if len(imgt)<4:
                    imgt=u""
            if "P18" in pagdata.claims:
                imgd=pagdata.claims['P18'][0].getTarget()
                print imgd
                imgd=imgd.title().strip().strip(u"\n").replace(u"File:",u"")
                print imgd
                if imgt<>u"":
                    print u"imatge a tot arreu"
                    print unicode(imgd),unicode(imgt)
                    if imgd<>imgt:
                        print u"PROBLEMA: imatges SÓN DIFERENTS",len(imgd),len(imgt)
                else:
                    print "copiar imatge a la llista"
                    print unicode(imgd)
                    if imgd.lower() in text0.lower():
                        print u"la imatge ja és en algun lloc de la llista"
                    else:
                        if template.has("imatge"):
                            template.get("imatge").value.replace(template.get("imatge").value,imgd+u"\n")
                        else:
                            template.add("imatge",imgd+u"\n")                    
            else:
                if imgt<>u"":
                    print u"pujar commonscat a Wikidata"
                    linia=u'{}\tP18\t"{}"\tS143\tQ199693'.format(qitem,imgt)#commonscat
                    print linia
                    resultat=resultat+u"\n"+linia
                else:
                    print "imatge enlloc"
            latt=u""
            lont=u""
            if template.has("lat") and template.has("lon"):
                latt=template.get("lat").value
                latt=latt.strip().strip(u"\n").replace(u"_",u" ")
                if len(latt)<2:
                    latt=u""
                lont=template.get("lon").value
                lont=lont.strip().strip(u"\n").replace(u"_",u" ")
                lont=re.sub(u"<!--.*",u"",lont)
                #lont=re.sub(lont #aquí treure el comentari
                if len(lont)<2:
                    lont=u""
            if "P625" in pagdata.claims:
                coord=pagdata.claims['P625'][0].getTarget()
                #print unicode(coord)
                #print coord.lat,coord.lon
                latd=unicode(coord.lat)
                lond=unicode(coord.lon)
                if latt<>u"" and lont<>u"":
                    print u"coordenades a tot arreu.",unicode(coord),unicode(latt),unicode(lont)
                else:
                    print "copiar coordenades a la llista"
                    print unicode(coord)
                    if latd.lower() in text0.lower() or lond.lower() in text0.lower():
                        print u"aquestes coordenades ja són en algun element de la llista"
                    else:
                        if template.has("lat"):
                            template.get("lat").value.replace(template.get("lat").value,latd)
                        else:
                            template.add("lat",latd)                    
                        if template.has("lon"):
                            template.get("lon").value.replace(template.get("lon").value,lond+u"\n")
                        else:
                            template.add("lon",lond+u"\n")                    
            else:
                if latt<>u"" and lont<>u"":
                    print u"pujar coordenades a Wikidata"
                    linia=u"{}\tP625\t@{}/{}\tS143\tQ199693".format(qitem,latt,lont)
                    print linia
                    resultat=resultat+u"\n"+linia
                else:
                    print "coordenades enlloc"
            if template.has("municipi"): #Per fer: ignorar els casos amb més d'un enllaç
                municipi=template.get("municipi").value
                municipi=municipi.strip().replace(u"\n",u"")
                municipi=re.sub(u"^.*?\[\[","",municipi)
                municipi=re.sub(u"\]\].*?$","",municipi)
                municipi=re.sub(u"\|.*?$","",municipi)
                if len(municipi)>1:
                    if municipi in diccmunicipis.keys():
                        qmun=diccmunicipis[municipi]
                        datamun=pywikibot.ItemPage(repo,qmun)
                    else:
                        textmunicipi=u""
                        artmun=pywikibot.Page(site,municipi)
                        try:
                            try:
                                textmunicipi=artmun.get()
                            except pywikibot.IsRedirectPage:
                                artmun=artmun.getRedirectTarget()
                                textmunicipi=artmun.get()
                            except pywikibot.NoPage:
                                print u"Error municipi:",municipi,u"no existeix"
                                qmun=u""
                            except pywikibot.InvalidTitle:
                                print u"Error municipi:",municipi,u"títol invàlid"
                                qmun=u""
                            if re.search(u"\{\{[Ii]nfotaula( del?)? (municipi|parròquia)",textmunicipi):
                                datamun=pywikibot.ItemPage.fromPage(artmun)
                                qmun=datamun.title()
                                print u"id de Wikidata:",qmun
                                diccmunicipis[municipi]=qmun
                                #print diccmunicipis
                            else:
                                print u"Error municipi:",municipi,u"no té infotaula de municipi"
                                qmun=u""
                        except pywikibot.NoPage:
                            print u"Error municipi:",municipi,u"no existeix"
                            qmun=u""
                        except pywikibot.InvalidTitle:
                            print u"Error municipi:",municipi,u"títol invàlid"
                            qmun=u""
                    if "P131" in pagdata.claims and len(qmun)>1:
                        #print u"hi ha entitat administrativa"
                        llistaadm=[]
                        for clam in pagdata.claims['P131']:
                            llistaadm.append(clam.getTarget())
                        #print u"municipi:",datamun,qmun
                        #print u"a Wikidata:",llistaadm
                        if datamun in llistaadm:
                            hihamundata=True
                            #print u"ja hi ha aquest municipi"
                        else:
                            hihamundata=False
                    else:
                        hihamundata=False
                    if len(qmun)>1 and hihamundata==False and qitem<>qmun:
                        print municipi,qmun
                        linia=u"{}\tP131\t{}\tS143\tQ199693".format(qitem,qmun)
                        print linia
                        resultat=resultat+u"\n"+linia
            if template.has(u"tipus"):
                tipus=template.get("tipus").value
                tipus=tipus.strip().replace(u"\n",u"")
                if re.search(u"\[\[.*\]\]",tipus):
                    enllactipus=re.sub(u"^.*?\[\[","",tipus)
                    enllactipus=re.sub(u"\]\].*?$","",enllactipus)
                    enllactipus=re.sub(u"\|.*?$","",enllactipus)
        #                    print enllactipus
                else:
                    enllactipus=u""
            else:
                tipus=u""
                enllactipus=u""
            if template.has(u"material"):
                material=template.get("material").value
                material=material.strip().replace(u"\n",u"")
                if re.search(u"\[\[.*\]\]",material):
                    enllacmaterial=re.sub(u"^.*?\[\[","",material)
                    enllacmaterial=re.sub(u"\]\].*?$","",enllacmaterial)
                    enllacmaterial=re.sub(u"\|.*?$","",enllacmaterial)
        #                    print enllacmaterial
                else:
                    enllacmaterial=u""
            else:
                material=u""
                enllacmaterial=u""
            if len(enllactipus+enllacmaterial)>0 and u"arbres" in origen: #espècies
                if len(enllactipus)==0:
                    especie=enllacmaterial
                else:
                    especie=enllactipus
                if especie in diccesp.keys():
                    qesp=diccesp[especie]
                    dataesp=pywikibot.ItemPage(repo,qesp)
                else:
                    artesp=pywikibot.Page(site,especie)
                    try:
                        if artesp.isRedirectPage():
                            print artesp,u"redirecció"
                            artesp=artesp.getRedirectTarget()
                            print u"redirigida a",artesp
                        dataesp=pywikibot.ItemPage.fromPage(artesp)
                        qesp=dataesp.title()
                        print u"id de Wikidata:",qesp
                        diccesp[especie]=qesp
                        print diccesp
                    except pywikibot.NoPage:
                        print especie,u"no existeix"
                        qesp=u""
                    except pywikibot.InvalidTitle:
                        print especie,u"títol invàlid"
                        qesp=u""
                esesp=False
                if len(qesp)>1:
                    text=artesp.get()
                    if re.search(u"\{\{[Tt]axo(caixa|box)",text):
                        esesp=True
                    else:
                        esesp=False
                        print artesp,u"no té taxocaixa"
                if "P31" in pagdata.claims and len(qesp)>1 and esesp:
                    print u"hi ha instància"
                    llistainst=[]
                    for clam in pagdata.claims['P31']:
                        llistainst.append(clam.getTarget())
                    #print u"municipi:",datamun,qmun
                    #print u"a Wikidata:",llistaadm
                    if dataesp in llistainst:
                        hihaespdata=True
                        #print u"ja hi ha aquesta espècie"
                    else:
                        hihaespdata=False
                else:
                    hihaespdata=False
                if len(qesp)>1 and hihaespdata==False and qitem<>qesp:
                    print especie,qesp
                    linia=u"{}\tP31\t{}\tS143\tQ199693".format(qitem,qesp)
                    print linia
                    resultat=resultat+u"\n"+linia
            if template.has(u"prot"):
                try:
                    prot=unicode(template.get("prot").value)
                    if len(prot)>1:
                        prot=prot.replace(u"\n",u"").strip()
                    else:
                        prot=u""
                except AttributeError:
                    prot=u""
            else:
                prot=u""
            if template.has(u"idprot"):
                idprot=unicode(template.get("idprot").value)
                try:
                    if len(idprot)>1:
                         idprot=idprot.replace(u"\n",u"").strip()
                    else:
                        idprot=u""
                except AttributeError:
                    prot=u""
            else:
                idprot=u""
            if template.has(u"idipa"):
                idipa=unicode(template.get("idipa").value)
                try:
                    if len(idprot)>1:
                         idipa=idipa.replace(u"\n",u"").strip()
                    else:
                        idipa=u""
                except AttributeError:
                    idipa=u""
            else:
                idipa=u""
            if template.has(u"bic"):
                bic=unicode(template.get("bic").value)
                try:
                    if len(bic)>1:
                         bic=bic.replace(u"\n",u"").strip()
                    else:
                        bic=u""
                except AttributeError:
                    bic=u""
            else:
                bic=u""
            if template.has(u"id"):
                idd=unicode(template.get("id").value)
                try:
                    if len(idd)>1:
                         idd=idd.replace(u"\n",u"").strip()
                    else:
                        idd=u""
                except AttributeError:
                    idd=u""
            else:
                idd=u""
            if classe==u"monument":
                if len(prot)>1 and prot in diccprot.keys() and not u"Andorra" in origen and "P1435" not in pagdata.claims:
                    qprot=diccprot[prot]
                    print prot,qprot
                    linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
                    print linia
                    resultat=resultat+u"\n"+linia
                elif len(prot)>1 and prot in diccprotand.keys() and u"Andorra" in origen and "P1435" not in pagdata.claims:
                    qprot=diccprotand[prot]
                    print prot,qprot
                    linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
                    print linia
                    resultat=resultat+u"\n"+linia
                elif u"BIC:" in prot and not u"Andorra" in origen and "P1435" not in pagdata.claims:
                    qprot=u"Q23712"
                    print prot,qprot
                    linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
                    print linia
                    resultat=resultat+u"\n"+linia
                if "P380" not in pagdata.claims and (prot==u"Cat." or prot==u"Inv.") and len(idd)>2:
                    if idd[:2]==u"PA":
                        linia=u'{}\tP380\t"{}"\tS143\tQ199693'.format(qitem,idd)
                        print linia
                        resultat=resultat+u"\n"+linia
                if "P1600" not in pagdata.claims and len(idd)>4:
                    if idd[:4]==u"IPA-":
                        idipa=idd[4:]
                        linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idipa)
                        print linia
                        resultat=resultat+u"\n"+linia
                        hihaipadata=True
                if "P1600" not in pagdata.claims and template.name.matches((u"Plantilla:Filera IPA",)):
                    if len(idurl)>2:
                        linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idurl)
                        print linia
                        resultat=resultat+u"\n"+linia
                if "P808" not in pagdata.claims and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot) and len(idd)>5 and not u"Andorra" in origen:
                    if idd[:3]==u"RI-":
                        linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,idd)
                        print linia
                        resultat=resultat+u"\n"+linia
                if "P808" not in pagdata.claims and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot or prot==u"") and len(bic)>5 and not u"Andorra" in origen:
                    if bic[:3]==u"RI-" and len(bic)>5:
                        linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,bic)
                        print linia
                        resultat=resultat+u"\n"+linia
                if "P1586" not in pagdata.claims and prot==u"BCIN" and len(idprot)>3 and not u"Andorra" in origen:
                    if idprot[-3:]==u"-MH":
                        linia=u'{}\tP1586\t"{}"\tS143\tQ199693'.format(qitem,idprot)
                        print linia
                        resultat=resultat+u"\n"+linia
                    
                
    text=unicode(code)
    if text<>text0:
        text=text.replace(u"\n\n}}","\n}}")
        if pagprova<>False:
            desti=pagprova
            sumaricopia=u"Robot copia [[{}]] per fer proves".format(pllista.title())
            pagprova.put(text0,sumaricopia)
        else:
            desti=pllista
        desti.put(text,u"Robot actualitza la llista a partir de Wikidata")
    return resultat


# El programa comença aquí.
# Comença a llegir articles de les llistes
lloc=u"Llistes de patrimoni natural de Catalunya" #Llista o categoria a mirar
paginaunica=(u"Llista d" in lloc)  #Ho endevina sol, però si no va, s'hi posa True si lloc és una llista de monuments, False si és una categoria de llistes
site=pywikibot.getSite('ca')
sitecommons=pywikibot.getSite('commons','commons')
repo = site.data_repository()
pagprova=False #pywikibot.Page(site,u"Usuari:PereBot/proves")
if paginaunica:
    llista=pywikibot.Page(site,lloc)
    print llista
    l=[llista]
else:
    l=catlib.Category(site,lloc).articlesList(recurse=True) #Canviar True/False segons convingui
    #print l
vistos=[]
resum=u""
resumwiki=u""
comptador=0
comptatotal=len(l)
for llista in pagegenerators.PreloadingGenerator(l):
    comptador=comptador+1
    print comptador,u"/",comptatotal,llista
    if llista.namespace()==0 and not llista in vistos:
        vistos.append(llista)
        infquick=actuallista(llista,pagprova)
        #diccllegit=llegeixllista(llista)
        #print diccllegit
        #infquick,infwiki=comprova(diccllegit,llista.title())
        #print infquick
        resum=resum+infquick
        #resumwiki=resumwiki+infwiki
print u"\nPer la wiki:"
#print resumwiki+u"\n"
print u"\nRESULTAT:"
print resum
pywikibot.stopme()

Versió que només puja

[modifica]

Versió més antiga que només copia les dades de les llistes a Wikidata i que fa servir expressions regulars per llegir les llistes.

# -*- coding: utf-8 -*-
# Programa per pujar a Wikidata les dades dels monuments
# a partir de les llistes. Només puja les dades dels monuments amb
# article a cawiki.
# Puja commonscat, coordenades, foto, municipi (si el troba),
# estatus patrimonial i números de registre (si a Wikidata hi ha la propietat).
# El resultat es un codi per posar al quickstatements.

import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,urllib,urllib2,json,pickle,math

# Elimina duplicats d'una llista
def unic(llista):
    llistanova=[]
    for el in llista:
        if not el in llistanova:
            llistanova.append(el)
    return llistanova

# Elimina l'enllaç d'un text. Funciona bé si hi ha un sol enllaç.
# Deixa el text que mostra l'enllaç (no on apunta)
def eliminaenllac(nom):
    nom=re.sub(u"\[\[.*\|","",nom)
    nom=nom.replace("[[","")
    nom=nom.replace("]]","")
    return nom

def plant(tit):
    return pywikibot.Page(site,u"Plantilla:{}".format(tit))

# Llegeix la llista de monuments sencera i retorna un diccionari
def llegeixllista(pag): ##,llistafotos,minfotos
    origen=pag.title()
    tottemp=pag.templatesWithParams()
    llistatits=[]
    informe=u""         # Descripcions de les categories a crear.
    resumllista=u""     # Resum estadístic de les categories a crear per una llista.
    numcats=0           # Comptador pel nombre de categories en una llista.
    ccatllista=u""      # Categoria de Commons que correspon a la llista d'acord amb la plantilla Commonscat.
    classe=u""
    dicc={}
    if False: #Codi anul·lat
        if re.search("Catalunya Nord|Pirineus Orientals",origen):
            regio=u"_region:FR-66"
        elif re.search("Catalunya|Osona|Pallars|Terres de l'Ebre|Costa (Brava|Daurada)|Barcelon",origen):
            regio=u"_region:ES-CT"
        elif re.search("Val[eè]nci[aà]|Alacant|[Pp]rovíncia de Castelló|Costa (dels Tarongers|Blanca)",origen):
            regio=u"_region:ES-CV"
        elif re.search("Balears|Mallorca|Menorca|Eivissa|Formentera",origen):
            regio=u"_region:ES-IB"
        elif re.search("Andorra",origen):
            regio=u"_region:AD"
        else:
            regio=u""
    for i in range(0, len(tottemp)):
        plantactual=tottemp[i][0].title()
        #print plantactual
        classe0=u""
        if tottemp[i][0]==plant(u'Filera art públic'):
            classe0=u"art"
        if tottemp[i][0]==plant(u'Filera IPA') or tottemp[i][0]==plant(u'Filera MH') or tottemp[i][0]==plant(u'Filera BIC') or tottemp[i][0]==plant(u'Filera BIC Val') or tottemp[i][0]==plant(u'Filera BIC And') or tottemp[i][0]==plant(u'filera BC Sard') or tottemp[i][0]==plant(u'filera BIC-ZA'):
            classe0=u"monument"
#            print u"MONUMENT"
        if tottemp[i][0]==plant(u'Filera patrimoni natural'):
            classe0=u"natural"
        if classe0!=u"":
            classe=classe0
#            print u"classe:",classe
    #        print tottemp[i][1]
            proposta=""
            nom=""
            nomcoor=""
            nomnet=""
            lloc=""
            municipi=""
            lat=""
            lon=""
            prot=""
            idd=""
            idprot=""
            codi=""
            idurl=""
            bic=""
            imatge=""
            autor=""
            data=""
            descripcio=""
            material=""
            enllacmaterial=""
            commonscat=""
            enllac=""
            tipus=""
            enllactipus=""
            dimensions=""
            coorddim=""
            coordtype=""
            #print tottemp[i][1]
            for j in range(0,len(tottemp[i][1])):       # llegeix la taula i n'extreu els camps
                camp=tottemp[i][1][j].replace(u"\n","")
                camp=camp.replace("<br/>",". ")
                camp=camp.replace("<br />",". ")
                camp=re.sub(u"<ref name.*>.*<.*>","",camp)
                camp=re.sub(u"<ref ?>.*<.*>","",camp)
                camp=re.sub(u"<.*>","",camp)
                #print camp
                if re.search(u"coord-nom *?=",camp):
                    nomcoor=re.sub(u"^ *?coord-nom *?= *?","",camp)
                    nomcoor=nomcoor.strip()
    #                print nomcoor
                elif re.search(u"nom *?=",camp):
                    nom=re.sub(u" *?nom *?= *?","",camp)
                    nom=re.sub(u"<ref name.*>.*<.*>","",nom)
                    nom=re.sub(u"<ref ?>.*<.*>","",nom)
                    nom=re.sub(u"<.*>","",nom)
                    nom=nom.strip()
                    #print nom
                    if len(re.findall(u"\[\[",nom))>1:
                        print u"PERILL: 2 enllaços a",nom
                    if re.search(u"\[\[.*\]\]",nom):
                        enllac=re.sub(u"^.*?\[\[","",nom)
                        enllac=re.sub(u"\]\].*?$","",enllac)
                        enllac=re.sub(u"\|.*?$","",enllac)
                        nomnet=eliminaenllac(nom)
    #                    print enllac
                    else:
                        nomnet=nom
                elif re.search(u"nomcoor *?=",camp):
                    nomcoor=re.sub(u"^ *?nomcoor *?= *?","",camp)
                    nomcoor=nomcoor.strip()
    #                print nomcoor
                elif re.search(u"municipi *?=",camp): #Compte que torna l'enllaç al municipi i no el text com altres versions de la funció
                    municipi=re.sub(u"^ *?municipi *?= *?","",camp)
                    municipi=municipi.strip()
                    #print municipi
                    if u"[[" in municipi:
                        if re.search(u"\[\[.*\]\]",municipi):
                            municipi=re.sub(u"^.*?\[\[","",municipi)
                            municipi=re.sub(u"\]\].*?$","",municipi)
                            municipi=re.sub(u"\|.*?$","",municipi)
                            municipi=eliminaenllac(municipi)
                            #print municipi                        
                elif re.search(u"lloc *?=",camp):
                    lloc=re.sub(u"^ *?lloc *?= *?","",camp)
                    lloc=eliminaenllac(lloc)
                    lloc=lloc.strip()
    #                print lloc
                elif re.search(u"lat *?=",camp):
                    lat=re.sub(u"^ *?lat *?= *?","",camp)
                    lat=lat.replace(" ","")
    #                print lat
                elif re.search(u"lon *?=",camp):
                    lon=re.sub(u"^ *?lon *?= *?","",camp)
                    lon=lon.replace(" ","")
    #                print lon
                elif re.search(u"idurl *?=",camp):
                    idurl=re.sub(u"^ *?idurl *?= *?","",camp)
                    idurl=idurl.replace(" ","")
    #                print idurl
                elif re.search(u"id *?=",camp):
                    idd=re.sub(u"^ *?id *?= *?","",camp)
                    idd=idd.replace(" ","")
                    #print idd
                elif re.search(u"prot *?=",camp) and not re.search(u"idprot *?=",camp):
                    prot=re.sub(u"^ *?prot *?= *?","",camp)
                    prot=prot.replace(" ","")
                    #print prot
                elif re.search(u"idprot *?=",camp):
                    idprot=re.sub(u"^ *?idprot *?= *?","",camp)
                    idprot=idprot.replace(" ","")
                    #print idprot
                elif re.search(u"bic *?=",camp):
                    bic=re.sub(u"^ *?bic *?= *?","",camp)
                    bic=bic.replace(" ","")
                    #print bic
                elif re.search(u"descripció *?=",camp):
                    descripcio=re.sub(u"^ *?descripció *?= *?","",camp)
                    descripcio=descripcio.strip()
    #                print descripcio
                elif re.search(u"codi *?=",camp):
                    codi=re.sub(u"^ *?codi *?= *?","",camp)
                    codi=codi.replace(" ","")
    #                print codi
                elif re.search(u"data *?=",camp):
                    data=re.sub(u"^ *?data *?= *?","",camp)
                    data=data.strip()
    #                print data
                elif re.search(u"material *?=",camp):
                    material=re.sub(u"^ *?material *?= *?","",camp)
                    material=eliminaenllac(material)
                    material=material.strip()
    #                print material
                    if len(re.findall(u"\[\[",material))>1:
                        print u"PERILL: 2 enllaços a",material
                    if re.search(u"\[\[.*\]\]",tipus):
                        enllacmaterial=re.sub(u"^.*?\[\[","",material)
                        enllacmaterial=re.sub(u"\]\].*?$","",enllacmaterial)
                        enllacmaterial=re.sub(u"\|.*?$","",enllacmaterial)
    #                    print enllacmaterial
                elif re.search(u"autor *?=",camp):
                    autor=re.sub(u"^ *?autor *?= *?","",camp)
                    autor=eliminaenllac(autor)
                    autor=autor.strip()
    #                print autor
                elif re.search(u"imatge *?=",camp):
                    imatge=re.sub(u"^ *?imatge *?= *?","",camp)
                    imatge=imatge.strip()
                    if not(re.search(u"..",imatge)):
                        imatge=""
    #                print imatge
                elif re.search(u"commonscat *?=",camp):
                    commonscat=re.sub(u"^ *?commonscat *?= *?","",camp)
                    commonscat=commonscat.strip()
                    if not(re.search(u"..",commonscat)):
                        commonscat=""
    #                print commonscat
                elif re.search(u"tipus *?=",camp):
                    tipus=re.sub(u"^ *?tipus *?= *?","",camp)
                    tipus=tipus.strip()
                    if not(re.search(u"..",tipus)):
                        tipus=""
    #                print tipus
                    if len(re.findall(u"\[\[",tipus))>1:
                        print u"PERILL: 2 enllaços a",tipus
                    if re.search(u"\[\[.*\]\]",tipus):
                        enllactipus=re.sub(u"^.*?\[\[","",tipus)
                        enllactipus=re.sub(u"\]\].*?$","",enllactipus)
                        enllactipus=re.sub(u"\|.*?$","",enllactipus)
    #                    print enllactipus
                elif re.search(u"coord-dim *?=",camp):
                    coorddim=re.sub(u"^ *?coord-dim *?= *?","",camp)
                    coorddim=coorddim.strip()
                    if not(re.search(u"..",coorddim)):
                        coorddim=""
    #                print coorddim
                elif re.search(u"coord-type *?=",camp):
                    coordtype=re.sub(u"^ *?coord-type *?= *?","",camp)
                    coordtype=coordtype.strip()
                    if not(re.search(u"..",coordtype)):
                        coordtype=""
    #                print coordtype
                if (classe0=="art" or classe0=="monument") and coordtype=="":
                    coordtype="landmark"
##            numfotos=llistafotos.count(idd)
#            print nomcoor ##+": "+'{:}'.format(numfotos)+" fotos"
            if u"#" in enllac:
                #enllac=re.split(u"#",enllac)[0]
                print u"Ignorat enllaç",enllac
                enllac=u""
            if enllac<>u"":
                #enllac=enllac[0].upper()+enllac[1:] #Anul·lat perquè ja normalitzarà l'API
                llistatits.append(enllac)
                dicc[enllac]={"classe":classe,"lat":lat,"lon":lon,"ccat":commonscat,"municipi":municipi,"prot":prot,u"idd":idd,u"idprot":idprot,"bic":bic,"idurl":idurl,"imatge":imatge,"enllactipus":enllactipus,"enllacmaterial":enllacmaterial,"filera":plantactual}
            #print dicc
    #print llistatits
    #print dicc
    return dicc

def comprova(dicc,origen=u""):
    diccprot={u"BIC":u"Q23712",u"BRL":u"Q11910247",u"BCIN":u"Q1019352",u"BCIL":u"Q11910250"}
    diccprot[u"BCIN-ZA"]=u"Q1019352"
    diccprot[u"PH.BCIN"]=u"Q1019352"
    diccprot[u"Inv."]=u"Q10387575"
    diccprot[u"Cat."]=u"Q10387684"
    diccprotand={u"BIC":u"Q5004973",u"BI":u"Q21095081"}
    resultat=u""
    diccmunicipis={}
    diccesp={}
    for enllac in dicc.keys():
        classe=dicc[enllac]["classe"]
        lat=dicc[enllac]["lat"]
        lon=dicc[enllac]["lon"]
        ccat=dicc[enllac]["ccat"]
        prot=dicc[enllac]["prot"]
        municipi=dicc[enllac]["municipi"]
        idd=dicc[enllac]["idd"]
        idprot=dicc[enllac]["idprot"]
        bic=dicc[enllac]["bic"]
        idurl=dicc[enllac]["idurl"]
        imatge=dicc[enllac]["imatge"]
        enllactipus=dicc[enllac]["enllactipus"]
        enllacmaterial=dicc[enllac]["enllacmaterial"]
        filera=dicc[enllac]["filera"]
        pag=pywikibot.Page(site,enllac)
        try:
            text=pag.get()
        except pywikibot.NoPage:
            continue
        except pywikibot.IsRedirectPage:
            pag=pag.getRedirectTarget()
            try:
                text=pag.get()
            except pywikibot.NoPage:
                continue
            except pywikibot.IsRedirectPage:
                print pag,u"doble redirecció"
                continue
        except pywikibot.InvalidTitle:
            print u"títol invàlid"
            continue
        cats=pag.categories()
        print pag
        esmon=False
        esart=False
        esnat=False
        for cat in cats:
            ticat=cat.title()
            #print ticat
            if re.search(u"Categoria:(Monuments|Patrimoni monumental|Béns (Culturals|d'Interès))",ticat) and not re.search(u"Categoria:Llistes",ticat):
                esmon=True
            if re.search(u"Categoria:(Escultures)",ticat) and not re.search(u"Categoria:Llistes",ticat):
                esart=True
            if re.search(u"Categoria:(Muntanyes|Arbres|Platges|Estanys|Hàbitats|Parc|Volcans|Espais|Reserves|Rius|Rieres|Boscs|Zones humides|Illes|Illots|Coves|Jaciment|Arxipèlags|Paratges|.* individuals)",ticat) and not re.search(u"Categoria:Llistes",ticat):
                esnat=True
        if esmon==False and classe==u"monument":
            print pag,u"monument sense categories de monuments"
            continue
        if esart==False and esmon==False and classe==u"art":
            print pag,u"art públic sense categories de monuments ni d'art"
            continue
        if esnat==False and classe==u"natural":
            print pag,u"natural sense categories de natural"
            continue
        #plants=pag.templates()
        #print plants
        #if plant(u"commonscat") in plants:
        #    print u"ja hi ha Commonscat"
        #if plant (u"coord") in plants:
        #    print u"ja hi ha Coord"
        try:
            pagdata=pywikibot.ItemPage.fromPage(pag)
            cont=pagdata.get()
        except NotImplementedError:
            print u"NotImplementedError: (possiblement detecta unitats)"
            continue                
        except pywikibot.NoPage:
            print u"No hi ha pàgina a Wikidata"
            continue
        qitem=pagdata.title()
        print u"id de Wikidata:",qitem
        hihaccatdata=False
        hihacoordata=False
        hihapatrdata=False
        hihamerimdata=False
        hihaipadata=False
        hihabcindata=False
        hihabicdata=False
        hihamundata=False
        hihaespdata=False
        hihaimatgedata=False
        qmun=u""
        for prop in cont["claims"]:
            #print u"PROP:",prop
            if prop=="P373":
                #print u"ja hi ha commonscat"
                hihaccatdata=True
            elif prop=="P625":
                #print u"ja hi ha coordenades"
                hihacoordata=True
            elif prop=="P1435":
                #print u"ja hi ha status patrimonial"
                hihapatrdata=True
            elif prop=="P380":
                #print u"ja hi ha identificador Merimée"
                hihamerimdata=True
            elif prop=="P1600":
                #print u"ja hi ha identificador IPAC"
                hihaipadata=True
            elif prop=="P1586":
                #print u"ja hi ha identificador BCIN"
                hihabcindata=True
            elif prop=="P808":
                #print u"ja hi ha identificador BIC"
                hihabicdata=True
            elif prop=="P18":
                #print u"ja hi ha imatge"
                hihaimatgedata=True
        nocommons=False
        if len(ccat)>0 and hihaccatdata==False:
            titccat=u"Category:{}".format(ccat)
            try:
                catcommons=pywikibot.Page(sitecommons,titccat) #catlib.Category(sitecommons,ccat)
            except ValueError:
                print u"value error"
                nocommons=True
                continue
            except pywikibot.InvalidTitle:
                print u"títol invàlid"
                nocommons=True
                continue
            if nocommons==False:
                try:
                    text=catcommons.get()
                except pywikibot.NoPage:
                    nocommons=True
            if nocommons==False:
                linia=u'{}\tP373\t"{}"\tS143\tQ199693'.format(qitem,ccat)#commonscat
                print linia
                resultat=resultat+u"\n"+linia
        if len(lat)>0 and len(lon)>0 and hihacoordata==False:
            linia=u"{}\tP625\t@{}/{}\tS143\tQ199693".format(qitem,lat,lon)
            print linia
            resultat=resultat+u"\n"+linia
        textmunicipi=u""
        if len(municipi)>0:
            if municipi in diccmunicipis.keys():
                qmun=diccmunicipis[municipi]
                datamun=pywikibot.ItemPage(repo,qmun)
            else:
                artmun=pywikibot.Page(site,municipi)
                try:
                    try:
                        textmunicipi=artmun.get()
                    except pywikibot.IsRedirectPage:
                        artmun=artmun.getRedirectTarget()
                        textmunicipi=artmun.get()
                    except pywikibot.NoPage:
                        print u"Error municipi:",municipi,u"no existeix"
                        qmun=u""
                    except pywikibot.InvalidTitle:
                        print u"Error municipi:",municipi,u"títol invàlid"
                        qmun=u""
                    if re.search(u"\{\{[Ii]nfotaula( del?)? (municipi|parròquia)",textmunicipi):
                        datamun=pywikibot.ItemPage.fromPage(artmun)
                        qmun=datamun.title()
                        print u"id de Wikidata:",qmun
                        diccmunicipis[municipi]=qmun
                        #print diccmunicipis
                    else:
                        print u"Error municipi:",municipi,u"no té infotaula de municipi"
                        qmun=u""
                except pywikibot.NoPage:
                    print u"Error municipi:",municipi,u"no existeix"
                    qmun=u""
                except pywikibot.InvalidTitle:
                    print u"Error municipi:",municipi,u"títol invàlid"
                    qmun=u""
            if "P131" in pagdata.claims and len(qmun)>1:
                #print u"hi ha entitat administrativa"
                llistaadm=[]
                for clam in pagdata.claims['P131']:
                    llistaadm.append(clam.getTarget())
                #print u"municipi:",datamun,qmun
                #print u"a Wikidata:",llistaadm
                if datamun in llistaadm:
                    hihamundata=True
                    #print u"ja hi ha aquest municipi"
                else:
                    hihamundata=False
            else:
                hihamundata=False
            if len(qmun)>1 and hihamundata==False and qitem<>qmun:
                print municipi,qmun
                linia=u"{}\tP131\t{}\tS143\tQ199693".format(qitem,qmun)
                print linia
                resultat=resultat+u"\n"+linia
        if len(enllactipus+enllacmaterial)>0 and u"arbres" in origen: #espècies
            if len(enllactipus)==0:
                especie=enllacmaterial
            else:
                especie=enllactipus
            if especie in diccesp.keys():
                qesp=diccesp[especie]
                dataesp=pywikibot.ItemPage(repo,qesp)
            else:
                artesp=pywikibot.Page(site,especie)
                try:
                    if artesp.isRedirectPage():
                        print artesp,u"redirecció"
                        artesp=artesp.getRedirectTarget()
                        print u"redirigida a",artesp
                    dataesp=pywikibot.ItemPage.fromPage(artesp)
                    qesp=dataesp.title()
                    print u"id de Wikidata:",qesp
                    diccesp[especie]=qesp
                    print diccesp
                except pywikibot.NoPage:
                    print especie,u"no existeix"
                    qesp=u""
                except pywikibot.InvalidTitle:
                    print especie,u"títol invàlid"
                    qesp=u""
            esesp=False
            if len(qesp)>1:
                text=artesp.get()
                if re.search(u"\{\{[Tt]axo(caixa|box)",text):
                    esesp=True
                else:
                    esesp=False
                    print artesp,u"no té taxocaixa"
            if "P31" in pagdata.claims and len(qesp)>1 and esesp:
                print u"hi ha instància"
                llistainst=[]
                for clam in pagdata.claims['P31']:
                    llistainst.append(clam.getTarget())
                #print u"municipi:",datamun,qmun
                #print u"a Wikidata:",llistaadm
                if dataesp in llistainst:
                    hihaespdata=True
                    #print u"ja hi ha aquesta espècie"
                else:
                    hihaespdata=False
            else:
                hihaespdata=False
            if len(qesp)>1 and hihaespdata==False and qitem<>qesp:
                print especie,qesp
                linia=u"{}\tP31\t{}\tS143\tQ199693".format(qitem,qesp)
                print linia
                resultat=resultat+u"\n"+linia
        if hihaimatgedata==False and len(imatge)>4:
            linia=u'{}\tP18\t"{}"\tS143\tQ199693'.format(qitem,imatge)
            print linia
            resultat=resultat+u"\n"+linia
        if classe==u"monument":
            if len(prot)>1 and prot in diccprot.keys() and not u"Andorra" in origen and hihapatrdata==False:
                qprot=diccprot[prot]
                print prot,qprot
                linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
                print linia
                resultat=resultat+u"\n"+linia
            elif len(prot)>1 and prot in diccprotand.keys() and u"Andorra" in origen and hihapatrdata==False:
                qprot=diccprotand[prot]
                print prot,qprot
                linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
                print linia
                resultat=resultat+u"\n"+linia
            elif u"BIC:" in prot and not u"Andorra" in origen and hihapatrdata==False:
                qprot=u"Q23712"
                print prot,qprot
                linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
                print linia
                resultat=resultat+u"\n"+linia
            if hihamerimdata==False and (prot==u"Cat." or prot==u"Inv.") and len(idd)>2:
                if idd[:2]==u"PA":
                    linia=u'{}\tP380\t"{}"\tS143\tQ199693'.format(qitem,idd)
                    print linia
                    resultat=resultat+u"\n"+linia
            if hihaipadata==False and len(idd)>4:
                if idd[:4]==u"IPA-":
                    idipa=idd[4:]
                    linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idipa)
                    print linia
                    resultat=resultat+u"\n"+linia
                    hihaipadata=True
            if hihaipadata==False and filera==u"Plantilla:Filera IPA":
                if len(idurl)>2:
                    linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idurl)
                    print linia
                    resultat=resultat+u"\n"+linia
            if hihabicdata==False and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot) and len(idd)>5 and not u"Andorra" in origen:
                if idd[:3]==u"RI-":
                    linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,idd)
                    print linia
                    resultat=resultat+u"\n"+linia
            if hihabicdata==False and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot or prot==u"") and len(bic)>5 and not u"Andorra" in origen:
                if bic[:3]==u"RI-" and len(bic)>5:
                    linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,bic)
                    print linia
                    resultat=resultat+u"\n"+linia
            if hihabcindata==False and prot==u"BCIN" and len(idprot)>3 and not u"Andorra" in origen:
                if idprot[-3:]==u"-MH":
                    linia=u'{}\tP1586\t"{}"\tS143\tQ199693'.format(qitem,idprot)
                    print linia
                    resultat=resultat+u"\n"+linia
    return resultat

# El programa comença aquí.
# Comença a llegir articles de les llistes
lloc=u"Llistes de monuments de les Terres de l'Ebre" #Llista o categoria a mirar
paginaunica=(u"Llista d" in lloc)  #Ho endevina sol, però si no va, s'hi posa True si lloc és una llista de monuments, False si és una categoria de llistes
site=pywikibot.getSite('ca')
sitecommons=pywikibot.getSite('commons','commons')
repo = site.data_repository()
if paginaunica:
    llista=pywikibot.Page(site,lloc)
    print llista
    l=[llista]
else:
    l=catlib.Category(site,lloc).articlesList(recurse=True) #Canviar True/False segons convingui
    #print l
vistos=[]
resum=u""
comptador=0
comptatotal=len(l)
for llista in pagegenerators.PreloadingGenerator(l):
    comptador=comptador+1
    print comptador,u"/",comptatotal,llista
    if llista.namespace()==0 and not llista in vistos:
        vistos.append(llista)
        diccllegit=llegeixllista(llista)
        #print diccllegit
        infquick=comprova(diccllegit,llista.title())
        print infquick
        resum=resum+infquick
print u"\nRESULTAT:"
print resum
pywikibot.stopme()