# -*- coding: utf-8 -*-
# Programa per posar la plantilla commonscat.
# El programa mira si a l'article hi ha Commonscat
# Si no hi és busca la plantilla Commonscat a Wikidata
# i la posa.
# Si l'article té la plantilla Commons, Projectes germans
# o una altra de semblant aleshores no fa res.
# PER FER:
# Si hi és, comprova que existeixi la categoria a Commons i
# si no existeix esborra o substitueix la plantilla.
import sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib,urllib2
import re
# Funció que comprova si una categoria existeix a Commons
# L'argument és el nom de la categoria (sense "category:")
# Retorna True o False
# Necessita la variable global sitecommons=wikipedia.getSite('commons','commons')
def catexisteix(nomcat):
if len(nomcat)>1:
titcat=u"Category:"+nomcat
pagcat=wikipedia.Page(sitecommons, titcat)
try:
return pagcat.exists()
except wikipedia.BadTitle:
print u"Error: Mal títol"
return False
except wikipedia.InvalidTitle:
print u"Error: Títol invàlid"
return False
except wikipedia.MaxTriesExceededError:
print u"Error: Temps excedit"
return False
except urllib2.HTTPError:
print u"Error HTTP (no deu funcionar el web)"
return False
else:
print nomcat,u"és massa curt per ser un nom de categoria"
return False
# Funció que treu la plantilla Commonscat d'una pàgina.
# Vegeu insertaccat per les instruccions.
def treuccat(page):
if page.isRedirectPage():
page=page.getRedirectTarget()
text=page.get()
text=re.sub(u"\{\{ *[Cc]ommonscat *\|*.*\}\}\n?",u"",text)
return text
# Funció que canvia el paràmetre de la plantilla Commonscat en una pàgina.
# Els arguments són la pàgina i el nou paràmetre (no la plantilla sencera).
# Vegeu insertaccat per les instruccions.
def canviaccat(page,param):
if page.isRedirectPage():
page=page.getRedirectTarget()
text=page.get()
text=re.sub(u"\{\{ *[Cc]ommonscat *\|*.*\}\}",u"{{Commonscat|"+param+u"}}",text)
return text
# Funció que inserta la plantilla Commonscat (o un altre text) en una pàgina.
# Mira de posar-la davant de la plantilla Viquiespècies i si no hi és va buscant
# més llocs fins que al final la posa davant de les categories.
# Els arguments són la pàgina i el text a afegir (habitualment la plantilla amb
# el seu paràmetre.
# Retorna el text amb la plantilla (o sense, si no ha trobat on posar-la).
# És una adaptació de la del programa ccat monuments (l'argument és l'objecte pàgina i no el text).
#
def insertaccat(page,afegit):
if page.isRedirectPage():
page=page.getRedirectTarget()
text=page.get()
if re.search(u"\{\{([Ww]ikie?spezieak|[Ww]ikispecies)",text):
text=re.sub(u"\{\{([Ww]ikie?spezieak|[Ww]ikispecies)",afegit+u"\n{{Wikispezieak",text)
print u"Text afegit davant de la plantilla Viquiespècies"
elif re.search(u"\{\{[Ww]ikiztegia",text):
text=re.sub(u"\{\{[Ww]ikiztegia",afegit+u"\n{{Wikiztegia",text)
print u"Text afegit davant de la plantilla Wikiztegia"
elif re.search(u"== ?Kanpo loturak ?==",text):
text=re.sub(u"(===? ?Kanpo loturak ?===?)",u"== Kanpo loturak ==\n"+afegit,text,count=1)
print u"Text afegit a la secció Enllaços externs"
elif re.search(u"== ?Kanpoko loturak ?==",text):
text=re.sub(u"(===? ?Kanpoko loturak ?===?)",u"== Kanpoko loturak ==\n"+afegit,text,count=1)
print u"Text afegit a la secció Enllaços externs"
elif re.search(u"== ?Ikus, gainera ?==",text):
text=re.sub(u"== ?Ikus, gainera ?==",u"== Ikus, gainera ==\n"+afegit,text,count=1)
print u"Text afegit a la secció Ikus, gainera"
elif re.search(u"== ?Ikus gainera ?==",text):
text=re.sub(u"== ?Ikus gainera ?==",u"== Ikus gainera ==\n"+afegit,text,count=1)
print u"Text afegit a la secció Ikus gainera"
elif re.search(u"== ?Erreferentziak ?==",text):
text=re.sub(u"== ?Erreferentziak ?==",u"== Erreferentziak ==\n"+afegit,text,count=1)
print u"Text afegit a la secció Referències"
elif re.search(u"\{\{(.* ?)zirriborroa(\|?.*?)\}\}",text):
text=re.sub(u"\{\{(.* ?)zirriborroa(\|?.*?)\}\}",afegit+ur"{{\1zirriborroa\2}}",text,count=1)
print u"Text afegit davant de la plantilla esborrany"
elif re.search(u"\{\{DEFAULTSORT",text):
text=re.sub(u"\{\{DEFAULTSORT",afegit+u"\n{{DEFAULTSORT",text,count=1)
print u"Text afegit davant de l'ORDENA"
elif re.search(u"\[\[ ?[Kk]ategoria:",text):
text=re.sub(u"\[\[ ?[Kk]ategoria:",afegit+u"\n[[Kategoria:",text,count=1)
print u"Text afegit davant de les categories"
else:
print u"No he trobat on afegir el text a [["+page.title()+u"]]"
return text
# 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=categories+noucats
articles=articles+nouarts
else:
print u"No es llegeix", scat
else:
print u"Aquesta ja la tinc vista"
categories=catlib.unique(categories)
articles=catlib.unique(articles)
print u"Llegits",len(categories),u"categories i",len(articles),u"articles a",cat
return categories, articles
# Recupera la propietat "categoria de Commons" a Wikidata
# L'argument és una pàgina de wikidata (objecte pàgina)
# Retorna una cadena.
# Si no hi ha la propietat, retorna una cadena buida.
def dataccat(data):
ccat=u""
try:
dict = data.get()
claims=dict[u'claims']
for el in claims:
m=el[u'm']
num=m[1]
if num==373:
ccat=m[3]
except IndexError:
print u"Error: paràmetre sense contingut a wikidata"
ccat=u""
except wikipedia.NoPage:
print u"Error: no hi ha pàgina a wikidata"
except wikipedia.MaxTriesExceededError:
print u"Error: Temps excedit"
except urllib2.HTTPError:
print u"Error HTTP (no deu funcionar el web)"
return ccat
#El programa comença aquí
site=wikipedia.getSite('eu') #Canviar aquí per canviar de viquipèdia
catbuscar=u"Euskal Herria" #Posar aquí la categoria que es revisarà
missatge=u"" #Missatge promocional. Normalment "" (cap missatge).
categoria = catlib.Category(site,catbuscar)
filtrecats=u"Kategoria:(Carnivora|Canidae|(Baix Llobregat|Maresme|Vallès" # categories grans que ja estan fetes i no cal repetir
filtrecats=filtrecats+u"|Katal(un|an)|Andorra|Valentzi|Midi-Pyrénées).*"
filtrecats=filtrecats+u"|.*([Tt]xakur|Pirinio|Balear).*)" # categories grans que ja estan fetes i no cal repetir
mirasubcategories=True #False per no mirar subcategories; True per mirar-les
if mirasubcategories:
cats, asc = miracatfiltre(categoria,filtre=filtrecats)
asc=cats+asc
else:
asc=categoria.articlesList(recurse=False)
comptapotencial=len(asc)
print "Articles a la categoria",comptapotencial
#asc=asc[21500:] #Per fer només un grapat d'articles a la vegada. TREURE SI NO CAL.
#asc.reverse()
comptarevisar=len(asc)
sitecommons=wikipedia.getSite('commons','commons')
pagprova=wikipedia.Page(site,u"User:PereBot/proba")
informeno=""
comptaarticles=0
comptajaentenen=0
comptaposoplant=0
comptanoiw=0
comptatrec=0
comptacanvio=0
for pag in asc:
comptaarticles=comptaarticles+1
print comptaarticles,"/",comptarevisar,":",pag
if pag.isRedirectPage():
pag=pag.getRedirectTarget()
if pag.exists():
# print u"ARTICLE "+nom+u" EXISTEIX"
plantarticle=pag.templates()
treure=False
nhiha=False
posada=False
# print plantarticle
# canviar la línia següent per canviar de viquipèdia
if u'Commonskat' in plantarticle or u'Commonscat' in plantarticle or u'Commons' in plantarticle or u'Commons category' in plantarticle or u'Commonscat-inline' in plantarticle or u'Commons cat' in plantarticle or u'Wikimedia' in plantarticle:
nhiha=True
treure=False
print pag, u"té la plantilla Commonscat, projectes germans, o similar"
else:
try:
data=wikipedia.DataPage(pag)
except wikipedia.NoPage:
data=False
print u"Error: no hi ha pàgina a wikidata"
except wikipedia.MaxTriesExceededError:
data=False
print u"Error: Temps excedit"
except urllib2.HTTPError:
data=False
print u"Error HTTP (no deu funcionar el web)"
if data!=False:
paramdata=dataccat(data)
if paramdata==u"":
print u"No hi ha categoria a Commons segons Wikidata"
else:
print u"Categoria segons wikidata:",paramdata
catdata=wikipedia.Page(sitecommons,u"Category:"+paramdata)
if catdata.exists():
print u"la categoria",paramdata,u"existeix a Commons"
# textoriginal=pag.get() # nomès per proves a l'espai d'usuari
# pagprova.put(textoriginal,u"Robot copiant pàgina per fer proves") # nomès per proves a l'espai d'usuari
try:
noutext=insertaccat(pag,u"{{commonskat}}\n") # el paràmetre {{#property:P373}} no és necessari a eu.wiki ni ca.wiki perquè és el comportament per defecte de la plantilla
pag.put(noutext,u"Robotak {{Commonskat}} gehitu du. Txantiloiak [[commons:category:"+paramdata+u"]] lotu du, Wikidataren arabera.") # per fer proves posar pagprova, sinó pag
except wikipedia.LockedPage:
print u"Error: Pàgina blocada"
except wikipedia.MaxTriesExceededError:
print u"Error: Temps excedit"
else:
print u"la categoria Commons:category:"+paramdata,u"NO existeix a Commons"
wikipedia.stopme()