Usuari:PereBot/robot converteix plantilles

De la Viquipèdia, l'enciclopèdia lliure
# -*- coding: utf-8 -*-
"""
Descripció:
        migrar_variant fa una llista de cada paràmetre que no es troba (un sol cop)
        aquest fa per cada article, els paràmetres que no s'han trobat

"""
#
#  (C) Arnaugir 2014
#
# Distributed under the terms of the MIT license.
#
#   Modificacions Pere prlpz
#

import os, sys, re, codecs, time
sys.path.append('C:\core')
sys.path.append('C:\wikitools')
#import pywikibot
import wiki
import api
import page
import category
import pagelist
#from wikitools import wiki
#from wikitools import api
#from wikitools import page
#from wikitools import category
#from wikitools import pagelist
import mwparserfromhell

from datetime import datetime
from datetime import timedelta
import json
from pprint import pprint

def divideix(txt):
        if u"\u2013" in txt:
                trosss=re.split(u"\u2013",txt)
        elif u"<br/>" in txt:
                trosss=re.split(u"<br/>",txt)
        elif u"<br>" in txt:
                trosss=re.split(u"<br>",txt)
        elif u" - " in txt:
                trosss=re.split(u" - ",txt)
        elif u"-" in txt:
                trosss=re.split(u"-",txt)
        else:
                trosss=[txt]
        #print u"trosss:",trosss
        noutrossos=[]
        for tros in trosss:
                noutrossos.append(tros.strip())
        #print u"noutrossos:",noutrossos
        return noutrossos

# El programa comença aquí
site = wiki.Wiki("http://ca.wikipedia.org/w/api.php")
site.login("PereBot",password="...",remember=True)

params = {
'action'    :'query',
'list'      :'categorymembers',
'cmtype'    :'page',
'cmtitle'   :u'Categoria:Articles que utilitzen la plantilla obsoleta Infotaula Monarca',
'rawcontinue':'1'
}
request = api.APIRequest(site, params)
data = pagelist.listFromQuery(site,request.query()['query']['categorymembers'])

l=""
dictParams = {u"name":u"nom","nom complet":"nom de naixement","sobrenom":"altres noms","alias":"altres noms",
              u"altres_noms":"altres noms",
              "honorific prefix":u"prefix honorífic","honorifix-prefix":"tractament",
              "honorific_prefix":u"prefix honorífic","tractament":u"prefix honorífic",
              "honorifix suffix":u"sufix honorífic","honorific_suffix":u"sufix honorífic",
              u"encapçalat":u"sufix honorífic","residence":u"residència",
              "children":"fills","alma_mater":"alma mater",
              "data_de_naixement":"data de naixement","birth_date":"data de naixement",
              "lloc_de_naixement":"lloc de naixement","birth_place":"lloc de naixement",
              u"data de defunció":u"data de mort",u"data_de_defunció":u"data de mort",u"death_date":u"data de mort",
              u"lloc de defunció":u"lloc de mort",u"lloc_de_defunció":u"lloc de mort","death_place":"lloc de mort",
              u"death_cause":"causa de mort",u"causa defunció":"causa de mort",u"causa_defuncio":"causa de mort",
              "nationality":"nacionalitat","citizenship":"ciutadania","ethnicity":u"ètnia",
              "image":"imatge","imagesize":"mida","text imatge":"peu","caption":"peu",
              "burial":"sepultura","burial_place":"sepultura","enterrament":"sepultura",
              u"resting_place_coordinates":"coordenades lloc sepultura",u"coordenades_lloc_enterrat":"coordenades lloc sepultura",
              "spouse":u"cònjuge","relations":"pares","party":"partit","profession":u"professió",
              "religion":u"religió","education":u"educació",
              u"conegut_per":"conegut per",u"known":"conegut per",u"known_for":"conegut per",u"known for":"conegut per",
              "occupation":u"ocupació",u"professió":u"ocupació",u"profession":u"ocupació",
              u"etiqueta ocupació":u"etiqueta ocupació",
              u"years active":u"període en actiu",u"years_active":u"període en actiu",u"anys en actiu":u"període en actiu",
              u"anys_en_actiu":u"període en actiu",u"organization":u"organització",u"organizations":u"organització",
              u"organitzacions":u"organització","employer":"ocupador","empleat":"ocupador",
              u"altrestítols":u"títol",u"altres títols":u"títol",
              u"notable works":"obres notables",u"notable_works":"obres notables",u"obres destacades":"obres notables",
              u"height":u"alçada",u"weight":u"pes",u"color d'ulls":u"ulls",u"Color de cabell":u"cabell"
              ,u"genre":u"gènere",u"genere":u"gènere",u"movement":u"moviment",u"style":u"estil",
              u"salary":u"sou",u"salari":u"sou",u"net worth":u"valor net",u"net_worth":u"valor net",
              u"networth":u"valor net",u"valor_net":u"valor net","casa reiale":"casa reial","dinastia":"dinastia",
              "signature":"signatura","amplada signatura":"signatura_mida","footnotes":"notes",
              "website":"lloc_web","web":"lloc_web","office":u"càrrec","order":u"càrrec",
              "term_start":"inici","term_end":"final","president":"a_nom","monarca":"a_nom","monarch":"a_nom",
              "primeminister":"b_nom","prime_minister":"b_nom","vicepresident":"e_nom","deputy":"f_nom","constituency":"k_nom",
              "office2":u"càrrec2","order2":u"càrrec2","term_start2":"inici2","term_end2":"final2","president2":"a_nom2",
              "monarca2":"a_nom2","monarch2":"a_nom2","primeminister2":"b_nom2","prime_minister2":"b_nom2","vicepresident2":"e_nom2",
              "deputy2":"f_nom2","constituency2":"k_nom2",
              "office3":u"càrrec3","order3":u"càrrec3","term_start3":"inici3","term_end3":"final3","president3":"a_nom3",
              "monarca3":"a_nom3","monarch3":"a_nom3","primeminister3":"b_nom3","prime_minister3":"b_nom3","vicepresident3":"e_nom3",
              "deputy3":"f_nom3","constituency3":"k_nom3",
              "office4":u"càrrec4","order4":u"càrrec4","term_start4":"inici4","term_end4":"final4","president4":"a_nom4",
              "monarca4":"a_nom4","monarch4":"a_nom4","primeminister4":"b_nom4","prime_minister4":"b_nom4","vicepresident4":"e_nom4",
              "deputy4":"f_nom4","constituency4":"k_nom4",
              "office5":u"càrrec5","order5":u"càrrec5","term_start5":"inici5","term_end5":"final5","president5":"a_nom5",
              "monarca5":"a_nom5","monarch5":"a_nom5","primeminister5":"b_nom5","prime_minister5":"b_nom5","vicepresident5":"e_nom5",
              "deputy5":"f_nom5","constituency5":"k_nom5",
              "office6":u"càrrec6","order6":u"càrrec6","term_start6":"inici6","term_end6":"final6","president6":"a_nom6",
              "monarca6":"a_nom6","monarch6":"a_nom6","primeminister6":"b_nom6","prime_minister6":"b_nom6","vicepresident6":"e_nom6",
              "deputy6":"f_nom6","constituency6":"k_nom6",
              "office7":u"càrrec7","order7":u"càrrec7","term_start7":"inici7","term_end7":"final7","president7":"a_nom7","monarca7":"a_nom7",
              "monarch7":"a_nom7","primeminister7":"b_nom7","prime_minister7":"b_nom7","vicepresident7":"e_nom7",
              "deputy7":"f_nom7","constituency7":"k_nom7",
              "office8":u"càrrec8","order8":u"càrrec8","term_start8":"inici8","term_end8":"final8","president8":"a_nom8",
              "monarca8":"a_nom8","monarch8":"a_nom8","primeminister8":"b_nom8","prime_minister8":"b_nom8","vicepresident8":"e_nom8",
              "deputy8":"f_nom8","constituency8":"k_nom8",
              "office9":u"càrrec9","order9":u"càrrec9","term_start9":"inici9","term_end9":"final9","president9":"a_nom9",
              "monarca9":"a_nom9","monarch9":"a_nom9","primeminister9":"b_nom9","prime_minister9":"b_nom9","vicepresident9":"e_nom9",
              "deputy9":"f_nom9","constituency9":"k_nom9",
              "successor":"successor","predecessor":"predecessor","predecessor2":"predecessor2","successor2":"successor2",
              "predecessor3":"predecessor3","successor3":"successor3","predecessor4":"predecessor4","successor4":"successor4",
              "predecessor5":"predecessor5","successor5":"successor5","predecessor6":"predecessor6","successor6":"successor6",
              "predecessor7":"predecessor7","successor7":"successor7","predecessor8":"predecessor8","successor8":"successor8",
              "predecessor9":"predecessor9","successor9":"successor9",
              u"escut càrrec":u"escut càrrec",u"escut càrrec2":u"escut càrrec2", u"escut càrrec3":u"escut càrrec3",
              u"escut càrrec4":u"escut càrrec4", u"escut càrrec5":u"escut càrrec5", u"escut càrrec6":u"escut càrrec6",
              u"escut càrrec7":u"escut càrrec7", u"escut càrrec8":u"escut càrrec8", u"escut càrrec9":u"escut càrrec9",
              u"escut":u"escutpeu", u"escutpeu":u"escutpeu",
              u"descendència":u"fills", u"Descendència":u"fills", u"descendencia":u"fills", u"fills":u"fills",
              u"coronació":u"k_nom",u"k_nom":u"k_nom",u"k_etiqueta":u"k_etiqueta",
              u"títol":u"càrrec", u"títol1":u"càrrec1", u"títol2":u"càrrec2", u"títol3":u"càrrec3", u"títol4":u"càrrec4",
              u"títol5":u"càrrec5", u"títol6":u"càrrec6", 
              u"hereu":u"l_nom",u"l_nom":u"l_nom",
              u"coronació2":u"k_nom2",u"k_nom2":u"k_nom2",u"k_etiqueta2":u"k_etiqueta2",
              u"coronació3":u"k_nom3",u"k_nom3":u"k_nom3",u"k_etiqueta3":u"k_etiqueta3",
              u"nom original":u"nom original",u"llengua nom original":u"llengua nom original",
              }
dictParamsBr = {u"cònjuge":u"cònjuge",u"consort":u"cònjuge",u"spouse":u"cònjuge",u"reina":u"cònjuge",u"consortreign":u"cònjuge",
                u"esposa 1":u"cònjuge",u"esposa 2":u"cònjuge",u"esposa 3":u"cònjuge",u"esposa 4":u"cònjuge",
                u"pare":u"pares",u"mare":u"pares",u"padre":u"pares",u"madre":u"pares",
                }
dictParamsDividir = {u"regne":[u"inici",u"final"],u"regne1":[u"inici1",u"final1"],u"regne2":[u"inici2",u"final2"],
                     u"regne3":[u"inici3",u"final3"],u"regne4":[u"inici4",u"final4"],u"regne5":[u"inici5",u"final5"],
                     u"regne6":[u"inici6",u"final6"],
                     u"regnat":[u"inici",u"final"],
                     }
#falta: etiqueta_dinastia
# si hi ha parametres que vulguem mantenir encara que estiguin buits, cal afegirlos, encara que siguin ells mateixos (ex "successor":"successor")
i=0;
prova=False #canviar
desar=True #canviar
wikipageprova = page.Page(site, title="Usuari:PereBot/prova")
for item in data: #interval per proves
        i=i+1;
        wikipage = item
        print item
        nodesar=False
        notarticle=u""
        if (wikipage.exists):
                text0=wikipage.getWikiText()
                text = wikipage.getWikiText().decode('utf-8', 'replace')
                if prova and desar:
                        wikipageprova.edit(text=text0,bot="yes",summary=u"Robot copiant [[{}]] per fer proves".format(wikipage.title))
                #except HTTPError:
                #        print u"Salto article per HTTPError:"
                #        l=l+"# [["+item.title+"]]: HTTPError (article no llegit)\n"
                #        continue
                        wikipage=wikipageprova
                code = mwparserfromhell.parse(text)
                t=code.filter_templates();
                l=l+"# [["+item.title+"]]: "
                llistaManquen=[]
                for template in t:
                        llistaRemove=[]
                        llistaAdd=[]
                        if  template.name.matches((u"Monarca",u"Infotaula Monarca", u"Infotaula_Monarca", u"Infotaula de noble", u"Infotaula_de_noble")):
                                paramsBr={}
                                for param in template.params:
                                        p=param.name.strip()
                                        #print p
                                        if p in dictParams:
                                                param.name.replace(p, dictParams[p])
                                                if p=="dinastia":
                                                        llistaAdd.append(("etiqueta_dinastia","Dinastia","dinastia")) #nom paràmetre, contingut, before
                                                if p=="casa reial":
                                                        llistaAdd.append(("etiqueta_dinastia","Casa reial","casa reial"))
                                                if p==u"coronació":
                                                        llistaAdd.append(("k_etiqueta",u"Coronació",u"k_nom"))
                                                if p==u"coronació2":
                                                        llistaAdd.append(("k_etiqueta2",u"Coronació",u"k_nom2"))
                                                if p==u"coronació3":
                                                        llistaAdd.append(("k_etiqueta3",u"Coronació",u"k_nom3"))
                                                if p==u"hereu":
                                                        llistaAdd.append(("l_etiqueta",u"Hereu",u"l_nom"))
                                        elif p in dictParamsBr:
                                                pnou=dictParamsBr[p]
                                                if pnou in paramsBr.keys():
                                                    llistaRemove.append(p)
                                                    if param.value.strip()<>"":
                                                        if paramsBr[pnou]["valor"].strip()<>"":
                                                            paramsBr[pnou]["valor"]=paramsBr[pnou]["valor"].replace(u"\n",u"")+u"<br/>"+unicode(param.value)
                                                        else:
                                                            paramsBr[pnou]["valor"]=unicode(param.value)
                                                else:
                                                    paramsBr[pnou]={"subst":param,"valor":""}
                                                    paramsBr[pnou]["valor"]=unicode(param.value)
                                        elif p in dictParamsDividir:
                                                #print "p:",p
                                                nomobjectius=dictParamsDividir[p]
                                                valorcamp=unicode(param.value)
                                                #print u"valor a dividir:",valorcamp
                                                trossos=divideix(valorcamp.strip())
                                                if len(trossos)>len(nomobjectius):
                                                        notarticle=u"Excés de paràmetres en dividir "+p+u":"+unicode(param.value).strip()
                                                        print notarticle
                                                        continue
                                                for index in range(0,len(trossos)):
                                                        llistaAdd.append((nomobjectius[index],trossos[index]+u"\n",p))
                                                llistaRemove.append(param)
                                        else:
                                                if (p not in dictParams) and (p not in dictParams.values()):
                                                        if unicode(param.value).strip() == "": #si no té valor el paràmetre, ens el carreguem directament (aixi ho demana amador) i no el llistem pas
                                                                llistaRemove.append(param)
                                                        else:
                                                                if unicode(p) not in llistaManquen:
                                                                        llistaManquen.append(p)
                                for par in paramsBr.keys():
                                    subst=paramsBr[par]["subst"]
                                    subst.name.replace(subst.name,par)
                                    valor=paramsBr[par]["valor"]
                                    subst.value.replace(subst.value,valor)

                                template.name.replace(template.name.strip(), u"Infotaula de polític")
                                template.add("colorprofessio","monarca",before=template.params[0]) #afegir al principi

                                for tupla in llistaAdd:
                                        #print tupla
                                        nomparam,contingut,abans=tupla
                                        if not u"\n" in contingut:
                                                contingut=contingut+u"\n"
                                        template.add(nomparam,contingut,before=abans)
                                try:
                                        for k in range(0,len(llistaRemove)): #cal ferho aqui pq si no funciona malament el mwpfh
                                                if llistaRemove[k]<>u"":
                                                        template.remove(llistaRemove[k])
                                except ValueError:
                                        print u"Error value: Plantilla desorganitzada mentre treballa?"
                                        print u"llistaRemove:",llistaRemove
                                        print u"k:",k
                                        print u"llistaRemove[k]:",llistaRemove[k]
                                        l=l+" Value Error. Comprovar. "
                                        #nodesar=True
                                        continue
                                if template.has("1"): template.remove("1")
                                if template.has("dead"): template.remove("dead")
                                if template.has("width"): template.remove("width")
                                if template.has("height"): template.remove("height")
                                if template.has("mida d'imatge"): template.remove("mida d'imatge")
                                if template.has(u"tamaño de imagen"): template.remove(u"tamaño de imagen")

                for j in range(0,len(llistaManquen)):
                        l=l+"<tt>"+llistaManquen[j]+"</tt>, "
                l=l+notarticle+"\n"
                textmodif = unicode(code)
                if nodesar==False and desar==True:
                        try: #fem try-except per si la pàgina està protegida, llavors s'ho salta
                                wikipage.edit(text=textmodif,bot="yes",summary=u"Robot migra infotaula Monarca a infotaula Polític. Vegeu [[Viquiprojecte:Adaptació de plantilles a Wikidata/infotaules biogràfiques|VP:Adaptació plantilles]]",skipmd5=True)
                                time.sleep(3)
                        except:
                                time.sleep(1)
                        if i==10000:
                                break;  
                
                                
text="Per cada article, s'han trobat aquests parametres que no tenia contemplats:\n\n"+l
wikipage = page.Page(site, title="Usuari:PereBot/convertir infotaules/Infotaula Monarca")
textmodif = unicode(text)
wikipage.edit(text=textmodif,bot="yes",summary=u"Robot actualitza amb informació per l'amadalvarez",skipmd5=True)