Viquipèdia:Viquitrobada 2009/Taller de bots/Tradueix enllaços interns
Aparença
# -*- coding:latin2 -*-
'''
Bot per traduir enllaços interns d'un article emprant interwikis
El Bot cerca els enllaços interns, llegeix els articles a la viquipèdia
de l'idioma original, si els troba hi cerrca la interwiki cap al català
i si en té substituexi l'enllaç intern original per l'enllaç cap al article
català
Cal que hi hagi exactament els mateixos enllaços interns i exactament en el mateix ordre.
'''
#Carrega llibreries
import wikipedia
import re
#Demana nom de la pàgina en català i idioma d'origen
pagina_a_traduir = wikipedia.input(u"Pàgina a traduïr?")
pagina_traduida = wikipedia.input(u"Pàgina traduida?")
idioma = wikipedia.input(u"Idioma?")
#llegeix la pàgina original
pagina = wikipedia.Page( wikipedia.getSite(idioma,"wikipedia"), pagina_a_traduir)
text = pagina.get()
noutext = text
#llegeix la pàgina destí
paginadesti = wikipedia.Page( wikipedia.getSite("ca","wikipedia"), pagina_traduida)
text_desti = paginadesti.get()
noutext_desti = text_desti
#Prepara expressions regulars
'''p és una expressió regular per trobar enllaços interns comença per dos claudators,
segueix per una cadena de qualsevol caracter sense sense : per evitar agafar imatges,
categories i interwikis i acaba amb dos claudators es posa el ? per evitar que empalmi dos
enllaços interns diferents'''
p = re.compile('(\[\[[^:]*?]])')
#Espressións regulars per cercar parèntesis
parentesis=re.compile("[\(]")
tancaparentesis=re.compile("[\)]")
#per agafar la cadena amb el nom de l'article eliminant els claudators, el | i el #
cerca=re.compile("[^[#|\]]+")
#per agafar la cadena de la interwiki al catala
interwikicatala=re.compile("(?<=\[\[ca:)[^|\]]+")
#Trobar tots els elnllaços interns de la pagina a traduir
enllacos=p.findall(text)
maxim = len(enllacos)
print u"Enllaços a traduir:", maxim
#Trobar tots els elnllaços interns de la pagina destí
enllacos_desti=p.findall(text_desti)
maxim_desti = len(enllacos_desti)
print u"Enllaços a traduir:", maxim_desti
#Intenta traduir cada un dels enllaços
i=0
while i < maxim:
print u'Enllaços fets:', i, 'de:', maxim
#Li treu els claudators i el | es queda amb el nom de l'article
enllac=cerca.search(enllacos[i])
enllac_desti=cerca.search(enllacos_desti[i])
wikipedia.output(enllacos[i])
i=i+1
llegir=enllac.group(0)
llegir_desti=enllac_desti.group(0)
page = wikipedia.Page( wikipedia.getSite(idioma,"wikipedia"), llegir)
#Intenta llegir
try:
# Carrega la pàgina
enllacada = page.get(get_redirect = True)
except wikipedia.NoPage:
# L'enllaç en l'idioma original no existeix
wikipedia.output(u"Pàgina %s no existeix; se salta." % page.aslink())
continue
#cerca la interwiki al catala en la pàgina enllaçada
enllaccatala=interwikicatala.search(enllacada)
if enllaccatala:
enllacara=enllaccatala.group(0)
#posar la primera lletra en minúscules si l'enllaç original la tenia.
if llegir[0]==llegir[0].lower():
enllacara=enllacara[0].lower()+enllacara[1:]
#si en llegir hi ha parèntesis transformar-los en "[\(]" o "[\)]"
llegir_desti = parentesis.sub(r'[\\(]',llegir_desti)
llegir_desti = tancaparentesis.sub(r'[\\)]',llegir_desti)
canviar=re.compile("(?<=\[\[)"+llegir_desti)
#Substitueix el nom de l'artice enllçat en l'altre idioma pel nom en català
noutext_desti = canviar.sub(enllacara,noutext_desti)
#Grava la pàgina modificada
paginadesti.put(noutext_desti,u'bot traduint automaticament enllaços internes')