Vés al contingut

Viquipèdia:Viquitrobada 2009/Taller de bots/Tradueix enllaços interns

De la Viquipèdia, l'enciclopèdia lliure
# -*- 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')