Usuari:Anskarbot/codi
Aparença
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wikipedia, codecs, re, catlib
import os
import subprocess
import sys
import pywikibot
import string
import time
import logging
import mwparserfromhell
import urllib
from gi.repository import Gtk
path = os.path.dirname(sys.argv[0])
logging.basicConfig()
class Finestra:
def finestra(self):
self.escull = 0
self.final = 0
idiomes = {'en':'Anglès',
'es':'Castellà',
'fr':'Francès',
'pt':'Portuguès',
'oc':'Occità',
'it':'Italià'}
win = Gtk.Builder()
win.add_from_file('frame.glade')
self.prog = win.get_object('window1')
self.prog.connect('destroy',self.destroy)
cancella = win.get_object('button1')
cancella.connect('clicked',self.cancella)
desfes = win.get_object('button2')
desfes.connect('clicked',self.desfes)
aplica = win.get_object('button3')
aplica.connect('clicked',self.aplica)
self.boto_desa = win.get_object('button4')
self.boto_desa.connect('clicked',self.desa)
idioma = win.get_object('label1')
idioma.set_text(idiomes[self.idioma_original])
titol_plantilla_ori = win.get_object('label3')
titol_plantilla_ori.set_text(self.tupla_ori[0])
titol_plantilla_ca = win.get_object('label4')
titol_plantilla_ca.set_text(self.tupla_ca[0])
self.marca_ori = win.get_object('cellrenderertoggle1')
self.marca_ori.connect('toggled',self.escull_ori)
self.amaga_ori = win.get_object('cellrenderertoggle4')
self.amaga_ori.connect('toggled', self.vista_ori)
self.marca_ca = win.get_object('cellrenderertoggle2')
self.marca_ca.connect('toggled',self.escull_ca)
self.amaga_ca = win.get_object('cellrenderertoggle5')
self.amaga_ca.connect('toggled', self.vista_ca)
self.marca_final = win.get_object('cellrenderertoggle3')
self.marca_final.connect('toggled',self.marca)
self.conta_par_ori = win.get_object('label5')
self.conta_par_ca = win.get_object('label6')
self.llista_tria = win.get_object('treestore1')
self.llista_original = win.get_object('liststore1')
self.cons_ori()
self.llista_catala = win.get_object('liststore2')
self.cons_ca()
self.ordre_ori = win.get_object('ordre-ori')
self.ordre_ca = win.get_object('ordre-ca')
self.par_ori = win.get_object('par-ori')
self.par_ca = win.get_object('par-ca')
self.prog.show()
Gtk.main()
def vista_ori(self, path, cell_toggled):
print "S'amaga?"
iter_amaga = self.llista_original.get_iter(cell_toggled)
self.llista_original.set_value(iter_amaga,1,False)
self.llista_original.set_value(iter_amaga,0,'z')
def vista_ca(self, path, cell_toggled):
iter_amaga = self.llista_catala.get_iter(cell_toggled)
self.llista_catala.set_value(iter_amaga,1,False)
self.llista_catala.set_value(iter_amaga,0,'z')
def marca(self,path,cell_toggled):
iter_marca = self.llista_tria.get_iter(Gtk.TreePath(cell_toggled))
bol = self.llista_tria.get_value(iter_marca,2)
self.llista_tria.set_value(iter_marca,2,not bol)
marca_fill = not bol
print self.llista_tria.iter_has_child(iter_marca)
if self.llista_tria.iter_has_child(iter_marca) == True:
iter_fill = self.llista_tria.iter_children(iter_marca)
while iter_fill:
self.llista_tria.set_value(iter_fill,2,marca_fill)
iter_fill = self.llista_tria.iter_next(iter_fill)
print cell_toggled
print len(cell_toggled)
def cons_ori(self):
count = 0
self.conta_par_ori.set_text(str(self.escull)+u':'+str(len(self.tupla_ori[1])))
self.llista_original.clear()
for parametre in self.tupla_ori[1]:
count += 1
plantilla_original = self.llista_original.append([parametre,True,count,False])
def cons_ca(self):
count = 0
self.conta_par_ca.set_text(str(len(self.llista_tria))+u':'+str(len(self.tupla_ca[1])))
self.llista_catala.clear()
for parametre in self.tupla_ca[1]:
count += 1
plantilla_ca = self.llista_catala.append([parametre,True,count,False])
def escull_ori(self,path, cell_toggled):
path = Gtk.TreePath(cell_toggled)
iter_marca = self.llista_original.get_iter(path)
bol = self.llista_original.get_value(iter_marca,3)
print self.llista_original.get_value(iter_marca,0)
self.llista_original.set_value(iter_marca,3,not bol)
if not bol == False: self.escull -= 1
else: self.escull += 1
def escull_ca(self,path, cell_toggled):
self.cons_ca()
path = Gtk.TreePath(cell_toggled)
iter_marca = self.llista_catala.get_iter(path)
bol = self.llista_catala.get_value(iter_marca,3)
print self.llista_catala.get_value(iter_marca,0)
self.llista_catala.set_value(iter_marca,3,not bol)
def desa(self,*args):
text = u''
pagina = 'Usuari:Anskarbot/'+self.idioma_original+'/Plantilles'
pagina = wikipedia.Page('ca',pagina)
try:
text = pagina.get()
except:
pass
text += u"\n=="+self.tupla_ca[0]+u"=="
for x in range(len(self.llista_tria)):
iter_pare = self.llista_tria.get_iter(x)
parametre_ca = self.llista_tria.get_value(iter_pare,0)
iter_fill = self.llista_tria.iter_children(iter_pare)
while iter_fill:
parametre_ori = self.llista_tria.get_value(iter_fill,1)
iter_fill = self.llista_tria.iter_next(iter_fill)
text += u'\n'+unicode(parametre_ori.decode('utf-8'))+u';'+unicode(parametre_ca.decode('utf-8'))
pagina.put(text,u"Anskarbot traduïnt els paràmetres d'una nova plantilla")
self.plantilla_ca_plant = text
self.prog.destroy()
def aplica(self, *args):
self.ordre_ori.clicked()
self.ordre_ca.clicked()
parametre = [self.llista_catala.get_iter(Gtk.TreePath(x)) for x in range(len(self.llista_catala)) if self.llista_catala.get_value(self.llista_catala.get_iter(Gtk.TreePath(x)),3) == True][0]
print self.tupla_ca[1][self.llista_catala.get_value(parametre,2)-1]
del self.tupla_ca[1][self.llista_catala.get_value(parametre,2)-1]
parametre = self.llista_catala.get_value(parametre,0)
self.llista_tria.append(None,[parametre,None,False,True])
parametres_ori = [self.llista_original.get_iter(Gtk.TreePath(x)) for x in range(len(self.llista_original)) if self.llista_original.get_value(self.llista_original.get_iter(Gtk.TreePath(x)),3) == True]
for parametre in parametres_ori:
del self.tupla_ori[1][self.llista_original.get_value(parametre,2)-1]
parametre = self.llista_original.get_value(parametre,0)
self.llista_tria.append(self.llista_tria.get_iter(Gtk.TreePath(len(self.llista_tria)-1)),[None,parametre, False,False])
self.cons_ori()
self.cons_ca()
self.conta_par_ori.set_text(str(self.escull)+u':'+str(len(self.tupla_ori[1])))
self.conta_par_ca.set_text(str(len(self.llista_tria))+u':'+str(len(self.tupla_ca[1])))
self.final += 1
self.par_ca.clicked()
self.par_ori.clicked()
def desfes(self, *args):
esborra_pares = [self.llista_tria.get_iter(Gtk.TreePath(x)) for x in range(len(self.llista_tria)) if self.llista_tria.get_value(self.llista_tria.get_iter(Gtk.TreePath(x)),2) == True]
print esborra_pares
pass
def cancella(self, *args):
llista_ca = []
llista_ori = []
for x in range(len(self.llista_tria)):
iter_pare = self.llista_tria.get_iter(Gtk.TreePath(x))
llista_ca.append(self.llista_tria.get_value(iter_pare,0))
iter_fill = self.llista_tria.iter_children(iter_pare)
print llista_ca
while iter_fill:
llista_ori.append(self.llista_tria.get_value(iter_fill,1))
iter_fill = self.llista_tria.iter_next(iter_fill)
print llista_ori
self.tupla_ca[1].extend(llista_ca)
self.tupla_ori[1].extend(llista_ori)
self.llista_tria.clear()
self.escull = 0
self.final = 0
self.cons_ori()
self.cons_ca()
def destroy(self,widget):
Gtk.main_quit()
class Proves:
"""
Aquesta classe hauria de classificar les proves que es volen fer per no haver de
córrer tot el programa. S'hauria de voler especificar sobre quin apartat es volen fer les proves
i s'ha de poder escollir més d'un. En cas de que fos cap no té sentit demanar proves.
Maquillatge
Wiki
"""
def apartat(self):
self.prova_maquillatge = self.pregunta(u"Volem fer proves de canvis d'expressions regulars en el text?",False)
self.prova_plantilles = self.pregunta(u"Volem fer proves amb plantilles?",False)
self.prova_enllacos = self.pregunta(u"Volem fer proves amb enllacos?",False)
self.prova_categories = self.pregunta(u"Volem fer proves amb les categories?",False)
self.prova_taules = self.pregunta(u"Volem fer proves amb les taules?",False)
self.prova_code = self.pregunta(u"Volem fer proves amb els codis?",False)
self.prova_mates = self.pregunta(u"Volem fer proves amb el codi LaTex?",False)
self.prova_imatges = self.pregunta(u"Volem fer proves amb les imatges?",False)
self.prova_webs = self.pregunta(u"Volem fer proves amb els enllacos web?",False)
self.prova_traduccio = self.pregunta(u"Volem fer proves amb la traduccio?",False)
self.prova_interviqui = self.pregunta(u"Volem fer proves amb els enllacos interviqui?",True)
class Maquillatge:
def romans(self, nombre,divisio_anterior=0):
"""Canvia un nombre àrab a nombres romans.
No pot ser major de 3999"""
try:
nombre = int(nombre)
except:
return nombre
if nombre > 3999:
print 'No pot ser més gran de 3999.... encara'
return nombre
dicc = {0 : '',
1 : u'I',
5 : u'V',
10 : u'X',
50 : u'L',
100 : u'C',
500 : u'D',
1000 : u'M'}
romans = dicc[0]
ordre = sorted(dicc.keys(),reverse = True)
portem = -1
for marca in ordre:
portem +=1
if marca == 0 or marca >5000:
continue
divisio = nombre/marca
if divisio == 4:
if divisio_anterior == 1:
romans = romans[:-1]+unicode(dicc[ordre[portem]]+dicc[ordre[portem-2]])
else:
romans += unicode(dicc[ordre[portem]]+dicc[ordre[portem-1]])
nombre = nombre - (divisio*marca)
continue
divisio_anterior = divisio
nombre = nombre - (divisio*marca)
romans += unicode(divisio*dicc[marca])
return romans
def segles(self,text):
segles_pas = 0
print "* PROCESSANT ELS SEGLES TROBATS AL TEXT *"
dicc_temporal = {u"early" : u" principis del ",
u"mid" : u" mitjans del ",
u"late" : u" finals del ",
u"by" : u" durant el ",
u"to" : u" fins ",
u"and" : u" i ",
u"the" : u" el ",
u"in" : u" en "}
text = text
ref = u" [REFSEG%s] "
for segles in re.finditer('(\w*) (\d*)(\w*).?(\d*)(\w*)[ |-](centur[y|ies])\s(\w*)', text):
print segles.group()
# raw_input()
zero0 = segles.group(1)
zero1 = segles.group(3)
primer = segles.group(2)
segon = segles.group(4)
tercer = segles.group(7)
if tercer == 'AD':
crist = ' d.C.'
elif tercer == 'BC':
crist = ' a.C.'
else:
crist = ' '+tercer
if primer == '':
if segon == '':
segon = segles.group(5)
durant = ''
else:
durant = self.paginaRe(zero1,dicc_temporal)
text_trad = durant+' segle '+self.romans(segon)+crist
elif primer != '' and segon != '':
durant = self.paginaRe(zero0,dicc_temporal)
text_trad = durant+' segles '+self.romans(primer)+u'-'+self.romans(segon)+crist
else:
continue
segles_pas = str(segles_pas).zfill(4)
self.refs[ref %(segles_pas)] = text_trad
text = text.replace(segles.group(), ref %(segles_pas),1)
segles_pas = int(segles_pas)
segles_pas += 1
print text
return text
def errorsPre(self,text):
text = text
if self.prova_maquillatge == False: return text
print "* PROCESSANT ELS ERRORS CONEGUTS ABANS DE LA TRADUCCIÓ *"
if self.idioma_original == 'en': text = self.segles(text)
text = self.paginaRe(text,self.canvis_pre)
return text
def paginaRe(self, text, dicc):
"""Reemplazo múltiple de cadenas en Python."""
if text == "":
return text
if dicc == {}:
return text
regex = re.compile("(%s)" % "|".join(map(re.escape, dicc.keys())))
text = regex.sub(lambda x: unicode(dicc[x.string[x.start() :x.end()]]), text)
return text
def errorsPost(self,text):
print "* PROCESSANT ELS ERRORS CONEGUTS DESPRÉS DE LA TRADUCCIÓ *"
text = self.paginaRe(text,self.canvis_post)
return text
class Wiki:
def article(self,text,peticio,ns=0):
print u"PROCËS DE GRAVAR EL TEXT A LA WIKI"
if self.prova_gravar_viqui == False:
traduccio = codecs.open(u'traduccions/'+self.titol_original,'w',"utf-8")
traduccio.write(text)
traduccio.close()
self.wikinotrad()
return
if self.pagina_discussio_usuari == '':
print 'l´Usuari no ha signat?'
falta = u" --~~~~\n*Recorda de signar les peticions de traducció, ja que si no, és impossible que una màquina com jo sàpiga qui demana la traducció. Gràcies."
self.pagina_discussio_usuari = re.search(r'\[\[.+\]\]',peticio)
else:
print u"Sembla que l'usuari ha signat'"
falta = ''
print "* GRAVANT L'ARTICLE A LA VIQUI *"
if self.titol_escollit:
if u'Usuari' in self.titol_escollit:
pagina = self.titol_escollit
pagina_traduitde = pagina.replace(u'Usuari',u'Usuari Discussió')
else:
pagina = u'Usuari:Anskarbot/Traduccions/'+self.titol_escollit
pagina_traduitde = u"Usuari Discussió:Anskarbot/Traduccions/"+self.titol_escollit
else:
pagina = u'Usuari:Anskarbot/Traduccions/'+self.titol_original
pagina_traduitde = u"Usuari Discussió:Anskarbot/Traduccions/"+self.titol_original
enllac_pagina = u"[["+pagina+u"|aquesta pàgina de proves]]"
pagina_final = wikipedia.Page('ca',pagina)
pagina_final.put(text,u"Anskarbot editant un article traduït",minorEdit=False,force=True)
print "* DEIXANT L'AVÍS A LA PÀGINA DE L'USUARI *"
missatge = u"\n== Petició de traducció ==\n*La vostra petició de traducció de l'article '''" + self.titol_original + u"''' es troba en " + enllac_pagina + u".Fixeu-vos bé '''que no és la mateixa pàgina on havíeu posat la petició de traducció'''. Quan repasseu la traducció podeu fer suggeriments de millora a [[Usuari:Anskarbot/Errors|la pàgina de millores del bot]] per anar polint la traducció. Gràcies."+falta+u" --~~~~\n"
pagina_usuari = wikipedia.Page('ca',unicode(self.pagina_discussio_usuari))
p = re.compile(u'\n== Petició de traducció ==\n')
pagina_discusio = pagina_usuari.get()
if p.search(pagina_discusio):
pagina_discusio = p.sub(missatge,pagina_discusio,1)
else:
pagina_discusio = pagina_discusio+missatge
pagina_usuari.put(pagina_discusio,u"Anscarbot deixant un missatge a la pàgina de discussió de l'usuari.",minorEdit=False, force=True)
print "* POSANT LA PLANTILLA {{Traduït de}} A LA PÀGINA DE DISCUSSIÓ DE L'ARTICLE TRADUÏT *"
urlversio =wikipedia.Page(self.idioma_original,self.titol_original).permalink()
versio = re.findall(r'oldid=(\d+)',urlversio)
pagina_traduitde = wikipedia.Page('ca', pagina_traduitde)
pagina_traduitde.put(u'{{Traduït de|'+self.idioma_original+u'|'+self.titol_original+u'|{{subst:CURRENTDAY}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTYEAR}}|'+versio[0]+u'}}\n--~~~~', u'Anskarbot incorporant la plantilla {{traduït de}} a la pàgina de discussió',minorEdit=False, force=True)
print u"* AFEGINT LA TRADUCCIÓ A L'ÍNDEX DE TRADUCCIONS *"
index = u'Usuari:Anskarbot/Traduccions'
index = wikipedia.Page(u'ca',index)
contingut_index = index.get()
if self.titol_escollit:
titol = self.titol_escollit
else:
titol = self.titol_original
contingut_index = contingut_index.replace(u"|}",u'|-\n|* [['+pagina+'|'+titol+']]||{{ud|'+self.usuari_peticio+u'}}||{{subst:CURRENTDAY}}/{{subst:CURRENTMONTH}}/{{subst:CURRENTYEAR}}||{{subst:PAGESIZE:'+pagina+'|R}}||{{PAGESIZE:'+pagina+'|R}}\n|}')
index.put(contingut_index, u"Anskarbot afegint la traducció a l'índex de les traduccions fetes", minorEdit=False, force=True)
self.wikinotrad()
def wikinotrad(self):
traduccio = codecs.open(u'traduccions/paraules-'+self.titol_original,'w',"utf-8")
traduccio.write("\n".join(self.no_trad))
traduccio.close()
if self.prova_gravar_viqui == False:
return
print u"* AFEGINT LES PARAULES NO TRADUIDES *"
pagina_dicc = u"Usuari:Anskarbot/"+self.idioma_original
pagina = wikipedia.Page('ca',pagina_dicc)
text = pagina.get()
print self.no_trad
for x in self.no_trad:
text += u"\n"+x
pagina.put(text,u"Anskarbot afegint les paraules no traduïdes",minorEdit=False, force=True)
class Apertium:
def traductor(self, text):
"""Crida al programa Apertium"""
text = text
if self.prova_traduccio == False:
return text
try:
text_val = int(text)
return text
except:
pass
print "* TRADUÏNT *"
print '=== ORIGINAL===\n' + text
original = open('traduccions/original.txt', 'w')
text = text.encode('utf-8')
original.write(text)
original.close()
if self.idioma_original == 'en':
text_trad = subprocess.call(['apertium en-ca traduccions/original.txt traduccions/traduccio.txt'], shell = True)
elif self.idioma_original == 'es':
text_trad = subprocess.call(['apertium es-ca traduccions/original.txt traduccions/traduccio.txt'], shell = True)
elif self.idioma_original == 'fr':
text_trad = subprocess.call(['apertium fr-ca traduccions/original.txt traduccions/traduccio.txt'], shell = True)
elif self.idioma_original == 'pt':
text_trad = subprocess.call(['apertium pt-ca traduccions/original.txt traduccions/traduccio.txt'], shell = True)
elif self.idioma_original == 'oc':
text_trad = subprocess.call(['apertium oc-ca traduccions/original.txt traduccions/traduccio.txt'], shell = True)
elif self.idioma_original == 'it':
text_trad = subprocess.call(['apertium it-ca traduccions/original.txt traduccions/traduccio.txt'], shell = True)
# print text_trad
arxiu_traduit = open('traduccions/traduccio.txt', 'r')
text_traduit = arxiu_traduit.read()
print '=== TRADUCCIÓ ===\n' + text_traduit
arxiu_traduit.close()
text_traduit = unicode(text_traduit.decode('utf-8'))
no_trad = re.findall(ur'\*\w+\s',text_traduit)
for paraula in no_trad:
if paraula.startswith('*REF') \
or paraula in self.no_trad \
or paraula.isupper() \
or paraula.istitle():
pass
else:
self.no_trad.append(paraula)
return text_traduit
class Plantilles:
def muntaPlantillesProcessades(self):
pagina = wikipedia.Page('ca',u'Usuari:Anskarbot/'+self.idioma_original+u'/Plantilles')
print u'* GESTIONANT ELS PARÀMETRES DE LA PLANTILLA *'
text = pagina.get()
self.seccions = pagina.getSections()
self.plantilles_wiki = text[text.find(u'\n=='):]
# print self.plantilles_wiki
def parametres(self,plant_ori,plant_ca):
n = 0
text = self.plantilles_wiki
self.plantilla_ca_plant = ''
seccio = [seccio for seccio in self.seccions if plant_ca in seccio[3]]
if seccio == []:
print u"La plantilla no es troba en les plantilles dictades"
plant_ori = plant_ori.strip()
plantilla_ori = self.titol_plantilles[self.idioma_original]+plant_ori+self.us_plantilles[self.idioma_original]
plantilla_ca = u'Plantilla:'+plant_ca
print plantilla_ca
try:
text_ori = wikipedia.Page(self.idioma_original,plantilla_ori).get()
print u'* EXTRAIENT EL TEXT DE LA PLANTILLA*'
except:
print '¿?¿? ALGUNA COSA HA FALLAT ¿?¿?'
return
parametres_ori = re.findall(r'\| *(\w+ ?-?\w* ?\w*) *=',text_ori, re.UNICODE)
llista_parametres = list(set(x.strip() for x in parametres_ori if unicode(x).isdigit() == False))
if llista_parametres == []:
print 'potser no ha trobat els paràmetres originals'
return
self.tupla_ori = (plant_ori,llista_parametres)
try:
print "O potser no troba la pàgina d'ús en català?"
text_ca = wikipedia.Page('ca',plantilla_ca).get()
except:
print 'Cagada pastoret'
return
parametres_ca = re.findall(r'\| *(\w+ ?-?\w* ?\w*) *=',text_ca, re.UNICODE)
llista_parametres = list(set(x.strip() for x in parametres_ca if unicode(x).isdigit() == False))
if llista_parametres == []:
return
self.tupla_ca = (plant_ca,llista_parametres)
self.finestra()
time.sleep(2)
self.muntaPlantillesProcessades()
plantilla_gestionada = self.plantilla_ca_plant
else:
print u"La plantilla ja s'ha processat en alguna altra traducció"
inici = text.find(u"\n=="+plant_ca+u"==")
print inici
final = text.find(u"\n==",inici+len(u'\n=='+plant_ca+u"=="))
print final
if final == -1:
plantilla_gestionada = text[inici+len(u'\n=='+plant_ca+u"=="):]
else:
plantilla_gestionada = text[inici+len(u'\n=='+plant_ca+u"=="):final]
print plantilla_gestionada
plantilla_wiki_ret = self.muntaPlantilla(plantilla_gestionada)
print 'EUREKA'
return plantilla_wiki_ret
def gestionaPlantilles(self,plantillatxt,j=-1):
if u'{{#' in plantillatxt: return plantillatxt
plantillatxt = plantillatxt.replace('=',' = ')
plantillatxt = plantillatxt.replace('|',' | ')
if self.prova_plantilles == False: return plantillatxt
print u'** GESTIONANT PLANTILLA **'
plantilla = self.textATupla(plantillatxt)
llista_parametres = []
parametres_ca = []
plantilla_txt_ca = ''
# print plantilla[0]
try:
plantilla_ca = self.cercaInterviquis(wikipedia.Page(self.idioma_original, self.titol_plantilles[self.idioma_original]+plantilla[0].strip()))
except:
self.pregunta('¿?¿? HA SORGIT UN PROBLEMA AMB ELS ENLLAÇOS INTERWIKI ¿?¿?',False)
return plantillatxt
if plantilla_ca:
prova = self.parametres(plantilla[0],plantilla_ca.titleWithoutNamespace())
if not prova:
return plantillatxt.replace(plantilla[0],plantilla_ca.titleWithoutNamespace())
plantilla_a1 = self.paginaRe(plantillatxt,prova)
# print plantilla_a1
plantilla = self.textATupla(plantilla_a1)
if plantilla == None:
return plantillatxt
parametres_ori = [y for y in plantilla[1] if plantilla[1] != []]
# print parametres_ori
plantilla_wiki_ges = {}
while j < len(parametres_ori)-1:
j+=1
# print str(j+1)+':'+str(len(parametres_ori))
try: nom,valor = parametres_ori[j].split(u'=',1)
except: llista_parametres.append(self.traductor(parametres_ori[j]));continue
nom = nom.strip()
valor_trad = self.traductor(valor).replace('*','')
# print nom
llista_parametres.append(nom.strip()+u' = '+valor_trad)
parametres_ca = llista_parametres
parametres_ca = [x.strip() for x in parametres_ca if x.endswith('= ') == False]
plant_ca = (plantilla_ca.titleWithoutNamespace(),parametres_ca)
plantilla_txt_ca = self.plantillaAText(plant_ca)
else:
print 'Sembla que la plantilla en catala no existeix'
plantilla_txt_ca = self.plantillaAText(plantilla)
return plantilla_txt_ca
plantilla_txt_ca = self.paginaRe(plantilla_txt_ca,prova)
plantilla_txt_ori = plantillatxt
print u"Plantilla original:\n"+plantilla_txt_ori
print u"Plantilla en català:\n"+plantilla_txt_ca
return plantilla_txt_ca
def plantillaAText(self,plantilla):
plantilla_txt = u"{{"+plantilla[0]
# print plantilla
for parametre in plantilla[1]:
parametre = parametre.replace('\n','')
plantilla_txt += u"\n|"+parametre
plantilla_txt += u"}}"
return plantilla_txt
def textATupla(self,plantilla):
print "****\n",plantilla,"\n****"
if plantilla == None:
return
plantilla = plantilla[2:-2]
plantilla = plantilla.replace('\n','')
llista = plantilla.split(u'|')
tupla = (llista[0],llista[1:])
return tupla
class Gestio:
def gestiona_commons(self, enllac):
"""Gestiona els fitxers de commons"""
print u'* PROCESSANT UN FITXER DE COMMONS *'
text_a_trad = re.search(r'[|]([^|]+)\]\]',enllac, re.UNICODE)
if text_a_trad:
text_traduit = self.traductor(text_a_trad.group(1))
text_traduit = text_traduit.replace('*', '')
enllac = enllac.replace(text_a_trad.group(1),text_traduit)
return enllac
def gestiona_enllac(self, enllac):
"""Gestiona els enllaços de text"""
enllac = enllac
if self.prova_enllacos == False: return enllac
print u'** PROCESSANT UN ENLLAÇ DE TEXT **'
print enllac
if u':' in enllac:
print 'És un enllaç especial, el mantindrem'
return enllac
enllac = enllac[2:-2]
if u'|' in enllac:
marca = enllac.split(u'|')
enllac_ori = marca[0]
text = marca[1]
text_trad = self.traductor(text).strip()
else:
text = enllac
enllac_ori = enllac
text_trad = self.traductor(enllac).strip()
if enllac_ori.startswith(u'#'): return text_trad
iws = wikipedia.Page(self.idioma_original,enllac_ori)
pagina_ca = self.cercaInterviquis(iws)
if text.islower():
text_trad = text_trad.lower()
elif text.isupper():
text_trad = text_trad.upper()
elif text.istitle():
text_trad = text_trad.title()
if pagina_ca:
text_trad = text_trad.replace("*","")
if text_trad.lower() == pagina_ca.titleWithoutNamespace().lower():
enllac_final = u'[['+text_trad+u']]'
else:
enllac_final = u'[['+pagina_ca.titleWithoutNamespace()+u'|'+text_trad+u']]'
else:
if self.tria_enllacos == True:
enllac_final = u'[[:'+self.idioma_original+u':'+enllac_ori+u'|'+text_trad+u']]'
else:
enllac_final = text_trad
print enllac_final
return enllac_final
def gestiona_taules(self, taula):
"""Gestiona les taules"""
print u'* GESTIONANT TAULA *'
taula = taula.replace(u'{|', u' INICI ')
taula = taula.replace(u'|}', u' FINALMENT ')
taula = taula.replace(u'|+', u' CAPÇALERA ')
taula = taula.replace(u'|-', u' CANVI ')
taula = taula.replace(u'|', u' BARRUERAMENT ')
taula = taula.replace(u'!', u' ADMIRACIO ')
taula = self.traductor(taula)
taula = taula.replace(u'*' , u'')
marca = re.findall(r' REF\w+[\S]', taula)
for ref in marca:
ref = ref+u' '
if ref.startswith(u' REFEA'):
canvi = self.gestiona_enllac(self.refs[ref])
taula = taula.replace(ref, canvi)
elif ref.startswith(u' REFEC'):
canvi = self.gestiona_commons(self.refs[ref])
taula = taula.replace(ref, canvi)
elif ref.startswith(u' REFEW'):
u'* PROCESSANT ENLLAÇ WEB *'
nou_text = self.refs[ref]
inici = nou_text.find(u' ')
nou_text = nou_text.replace(nou_text[inici:], self.traductor(nou_text[inici:]))
taula = taula.replace(ref, nou_text)
elif ref.startswith(u' REFR'):
print u'* PROCESSANT REFERÈNCIES *'
nou_text = self.refs[ref]
inici = nou_text.find(u'>')
final = nou_text.find(u'</')
nou_text = nou_text.replace(nou_text[inici+1:final], self.traductor(nou_text[inici+1:final]))
taula = taula.replace(ref, nou_text)
elif ref.startswith(u' REFPL'):
canvi = self.gestionaPlantilles(self.refs[ref], ref)
taula = taula.replace(ref, canvi)
elif ref.startswith(u' REFCO'):
print u'* PROCESSANT UN COMENTARI *'
nou_text = self.refs[ref]
nou_text = self.traductor(nou_text[4:-3])
taula = taula.replace(ref, nou_text)
taula = taula.replace(u' INICI ' , u'{|')
taula = taula.replace(u' FINALMENT ' , u'|}')
taula = taula.replace(u' CAPÇALERA ' , u'|+')
taula = taula.replace(u' CANVI ' , u'|-')
taula = taula.replace(u' BARRUERAMENT ' , u'|')
taula = taula.replace(u' ADMIRACIO ' , u'!')
return taula
class Diccionaris:
def ordena_diccionari(self, dicc, count=0,finalc=0):
"""Repassa el diccionari self.refs per gestional el codi.
Cada codi té una marca que es troba en el diccionari de tuples self.marques"""
print u'*** PROCESSANT EL DICCIONARI DE REFERÈNCIES ***'
claus = sorted(dicc.keys(), reverse=True)
self.count = count
for valor in claus:
nou_text = dicc[valor]
print valor, nou_text
if valor.startswith(self.cerques[0][-1][:-4]): # Comentaris
print u'* PROCESSANT COMENTARI *'
nou_text = u'<!--' + self.traductor(nou_text[4:-3]) + u'-->'
dicc[valor] = nou_text
elif valor.startswith(self.cerques[1][-1][:-4]): # Enllaços web
print u'* PROCESSANT ENLLAÇ WEB *'
inici = nou_text.find(u' ')
nou_text = nou_text.replace(nou_text[inici:-1], self.traductor(nou_text[inici:-1]))
dicc[valor] = nou_text
elif valor.startswith(self.cerques[2][-1][:-4]): # Enllaços de text
nou_enllac = self.gestiona_enllac(nou_text)
dicc[valor] = nou_enllac
elif valor.startswith(self.cerques[3][-1][:-4]): # Plantilles
nou_text = self.gestionaPlantilles(nou_text)
dicc[valor] = nou_text
elif valor.startswith(self.cerques[4][-1][:-4]): #Codi entre <gallery></gallery>
print u'* PROCESSANT FITXERS DE COMMONS DINS <gallery> *'
print nou_text
llista = nou_text.split('\n')
text_final = u'<gallery'
print llista
# raw_input()
for llista_text in llista:
if u'|' in llista_text:
veg = llista_text.count(u"|")
print veg
for a in range(veg):
print range(veg)
print a
if a != veg:
continue
inicic = llista_text.find(u'|')
text_peu = self.traductor(llista_text[inicic+1:])
text_final += llista_text.replace(llista_text[inicic+1:],text_peu+u"\n")
text_final += u'</gallery>'
dicc[valor] = text_final
elif valor.startswith(self.cerques[5][-1][:-4]): # Referències úniques
print u'* PROCESSANT REFERÈNCIES *'
inici = nou_text.find(u'>')
final = nou_text.find(u'</')
nou_text = nou_text.replace(nou_text[inici+2:final-1], self.traductor(nou_text[inici+2:final-1]))
dicc[valor] = nou_text
elif valor.startswith(self.cerques[6][-1][:-4]): # Referències de grup (name o altres)
print u'* PROCESSANT REFERÈNCIES DE GRUP *'
inici = nou_text.find(u'>')
final = nou_text.find(u'</')
nou_text = nou_text.replace(nou_text[inici+2:final-1], self.traductor(nou_text[inici+2:final-1]))
dicc[valor] = nou_text
elif valor.startswith(self.cerques[7][-1][:-4]): # Següents ref name
print u'* PROCESSANT REFERÈNCIES DE GRUP NAME *'
dicc[valor] = nou_text
elif valor.startswith(self.cerques[8][-1][:-4]): # Altre codi
print u'* PROCESSANT ALTRE CODI *'
elif valor.startswith(self.cerques[9][-1][:-4]): # Taules
print u'*** PROCESSANT TAULES ***'
nou_text = self.gestiona_taules(nou_text)
dicc[valor] = nou_text
elif valor.startswith(u' [REFZZ'): # Codi d'estils
print u'* PROCESSANT ESTILS *'
elif valor.startswith(u' [REFWM'): #Codi LaTex
print u'* PROCESSANT CODI LaTex *'
elif valor.startswith(u' [REFWY'): #Pàgines web
print u'* PROCESSANT URLs *'
elif valor.startswith(u' [REFWZ'): #Codi entre <code></code>
print u'* PROCESSANT CODI *'
elif valor.startswith(u' [REFRR'): #Caràcters estranys
print u'* PROCESSANT CARÂCTERS ESTRANYS *'
elif valor.startswith(u' [REFEC'): # Enllaços de commons
nou_text = self.gestiona_commons(dicc[valor])
dicc[valor] = nou_text
elif valor.startswith(u" [REFSEG"): # segles en text anglès
print u"* PROCESSANT SEGLES DINS EL TEXT EN ANGLÈS *"
else:
print u"Aqui no hauria d'arribar"
print valor
def muntaPlantilla(self, text):
plantilla_wiki_ges = {}
# print u'*****\n'+text+u'\n*****'
text = text.replace(self.missatge_plantilla,u"")
llista = text.split(u'\n')
# print llista
if '' in llista: llista.remove('')
for x in llista:
# print x
if u';' not in x: continue
diccionari = x.split(u';')
# print diccionari
valor,parametre = u" "+diccionari[0]+u" ",u" "+diccionari[1]+u" "
plantilla_wiki_ges[valor] = parametre
print plantilla_wiki_ges
return plantilla_wiki_ges
def muntaPaginaRE(self, re_en_pagina, idioma):
pagina = u"Usuari:Anskarbot/"+idioma+u"/"+re_en_pagina
titol = wikipedia.Page(u'ca',pagina)
try: text = titol.get()
except:
print 'No hi ha pàgina regex a la wiki'
return
text = re.sub(r'','',text,flags=re.MULTILINE)
llista = text.split(u'\n')
# print llista
if '' in llista: llista.remove('')
for x in llista:
if ';' not in x: continue
diccionari = x.split(u';')
# print diccionari
valor,parametre = diccionari[0],diccionari[1]
self.canvis_post[valor] = parametre
# print self.canvis_post
class PreCercaSubst:
def cerca(self, text, par=0, inici=0, comm=0):
"""Cerca les marques de codi i les substitueix per REF"""
print u'*\n================================================================'
dicc_refs = self.refs
for cerca in self.cerques:
inici_m = cerca[0]
final_m = cerca[1]
ref = cerca[2]
par = 0
print U'Cercant ',inici_m, final_m, u'per substituir-ho per la referència',ref
while text.find(inici_m) != -1:
ref = cerca[2]
par = str(par).zfill(4)
inici = text.find(inici_m)
final = text.find(final_m, inici)
while text.count(inici_m,inici,final+len(final_m)) != text.count(final_m,inici,final+len(final_m)):
inici2 = text.find(inici_m,inici+len(inici_m),final)
valor = text[inici2:final+len(final_m)]
text = text.replace(valor, ref %(par))
dicc_refs[ref %(par)] = valor
final = text.find(final_m,final+len(final_m))
final = text.find(final_m)
par = int(par)
par += 1
par = str(par).zfill(4)
valor = text[inici:final+len(final_m)]
y = [x for x in self.commons.iterkeys() if x in valor]
if y != [] and valor.startswith(u'[['):
ref = u' [REFEC%s] '
comm = str(comm).zfill(4)
text = text.replace(valor, ref %(comm))
dicc_refs[ref %(comm)] = valor
comm = int(comm)
comm += 1
continue
elif valor is u'':
print u'Què passa aqui?', ref
print inici, final+len(final_m)
print text[inici-40:inici+80]
break
else:
print valor
text = text.replace(valor, ref %(par), 1)
dicc_refs[ref %(par)] = valor
par = int(par)
par += 1
print u'================================================================\n*'
if dicc_refs != {}:
print 40*"*"
print 40*"*"
print u"* DICCIONARI DE REFERÊNCIES *"
for a in dicc_refs.keys():
print 40*"*"
print a , ":", dicc_refs[a]
print 40*"*"
print 40*"*"
else:
pass
# raw_input()
return text
class Interviqui:
def cercaInterviquis(self,pagina,ca=True):
print u"* CERCANT ELS ENLLAÇOS INTERVIQUI *"
print 40 * '%'
if " " in pagina.title():
pagina = pagina.title().replace(" ","_")
pagina = wikipedia.Page(self.idioma_original,pagina)
if u'#' in pagina.title():
pagina = wikipedia.Page(self.idioma_original,pagina.titleWithoutNamespace())
try:
print u"Primer intent"
iws_pagina = pagina.interwiki()
if iws_pagina == []:
print u"no pot ser que no tingui enllaços"
pagina = pagina.getRedirectTarget()
iws_pagina = pagina.interwiki()
print u"A la primera"
except wikipedia.IsRedirectPage, arg:
print u'És una redirecció'
pagina = wikipedia.Page(self.idioma_original,arg[0])
print pagina
if u'#' in pagina.title():
try: iws_pagina = wikipedia.Page(self.idioma_original,pagina.titleWithoutNamespace()).interwiki()
except: pass
else:
iws_pagina = wikipedia.Page(self.idioma_original,arg[0]).interwiki()
except:
print u'Ja no sé què fer'
print 40 * '%'
return
if iws_pagina == [] or iws_pagina == None:
print u'Per ara no ha trobat enllaços'
if self.titol_plantilles[self.idioma_original] in pagina.title():
print u'És una plantilla'
print pagina
pagina_doc = wikipedia.Page(self.idioma_original,pagina.title()+self.us_plantilles[self.idioma_original])
try:
text_pagina = pagina_doc.get()
except wikipedia.IsRedirectPage, arg:
pagina_doc = wikipedia.Page(self.idioma,arg[0])
text_pagina = pagina_doc.get()
except:
text_pagina = ''
iws = re.search('\[\[ca:(.+)\]\]',text_pagina)
if iws:
print u'No sé què fa aquí ?='
print 40 * '%'
return wikipedia.Page('ca',iws.group(1))
else:
pass
else:
pass
else:
for iw in iws_pagina:
if ca:
if iw.site().language() == 'ca':
print iw
print 40 * '%'
return iw
try:
iws_pagina = wikipedia.DataPage(pagina).interwiki()
except wikipedia.IsRedirectPage, arg:
iws_pagina = wikipedia.DataPage(self.idioma,arg[0]).interwiki()
except:
print u'Escaquejada'
print 40 * '%'
return
'''
except:
print "Ha passat alguna cosa"
print pagina.title()
print sys.exc_info()[0]
iws_pagina = self.interwikiLang2Lang(pagina)
return
'''
for iw in iws_pagina:
if ca:
if iw.site().language() == 'ca':
print iw
print 40 * '%'
return iw
print u"No s'ha trobat la pàgina en català"
print 40 * '%'
return
def treuInterviquis(self,pagina,text,llista_iw=''):
text = text
if self.prova_interviqui == False: return text
print "* NETEJANT INTERVIQUIS *"
iws = pagina.interwiki()
for iw in iws:
iw = unicode(iw)
text = text.replace(iw,'')
llista_iw += iw+u"\n"
llista_iw = llista_iw.split(u'\n')
llista_iw.sort()
self.llista_iw = u'\n'.join(llista_iw)
print u"Interviquis trovades al text:\n"+self.llista_iw
return text
def interwikiLang2Lang(self,pagina):
lang_origin=self.idioma_original
lang_to='ca'
urlData = 'http://www.wikidata.org/w/api.php?action=wbgetentities&format=json&props=sitelinks%2Furls&dir=ascending'
variable = '&sites='+lang_origin+'wiki&titles='+pagina.title()
dicc = urllib.urlopen(urlData+variable).read()
site_origin = wikipedia.getSite(lang_origin,'wikipedia')
site_to = wikipedia.getSite(lang_to,'wikipedia')
item = json.JSONDecoder().raw_decode(dicc)[0]['entities'].keys()
pagina = wikipedia.Page(site_origin,title)
repo = pagina.data_repository()
#iw = wikipedia.DataPage(repo,item[0]).interwiki()
iw = [x for x in wikipedia.DataPage(repo,item[0]).interwiki() if x.site() == site_to]
return iw[0]
class Text:
def preTrad(self, pagina,text_final='',capi=0,refrep=0):
llista_net = []
capitol_trad = []
llista_notrad = []
text_final = u"{{Avís de traducció|plantilles}}\n{{Notes de traducció}}\n\n"
print "* GESTIONANT EL TEXT ABANS DE LA TRADUCCIÓ *"
pagina = wikipedia.Page(self.idioma_original,self.titol_original)
try:
text = pagina.get()
except wikipedia.IsRedirectPage, arg:
pagina_red = wikipedia.Page(pagina.site(),arg[0])
pagina = pagina_red
self.titol_original = pagina_red.title()
text = pagina.get()
except wikipedia.NoPage, arg:
return u"No he sabut trobar la pàgina demanada. Sembla que "\
+self.titol_original+u" no existeix en la viqui demanada. --~~~~"
text = self.treuInterviquis(pagina,text)
text = self.treuCategories(pagina,text)
text = re.sub(r'%s.+\}\}\n' %self.dicc_ordena[self.idioma_original],'',text)
while u'\n\n\n' in text:
text = text.replace(u'\n\n\n',u'\n\n')
text = text.replace(u"==\n",u"==\n\n")
text = text.replace(u"\n==",u"\n\n==")
capitols = re.split(r'\n\n', text)
if '' in capitols:
capitols.remove('')
for capitol in capitols:
if capitol == '' or capitol == u'\n':
print u'**************************\n* Aquest capítol és buit *\n**************************'
continue
if self.prova_gravar_viqui == False:
self.pregunta('Seguim?',False)
capitol_ori = capitol
capi += 1
# if capi != 1: # Opció de passar capítols quan
# continue # es vol fer alguna prova sobre un capítol concret
print u"********************\n********************\n* Capítol "+str(capi)+u"/"+str(len(capitols))+u" *\n********************\n********************"
if capitol == '' or capitol == u'\n':
print u'**************************\n* Aquest capítol és buit *\n**************************'
continue
print "&&&&&&&&&&&&&&&&&&&\n&& TEXT ORIGINAL &&\n&&&&&&&&&&&&&&&&&&&"
print capitol
print '&&&&&&&&&&&&&&&&&&&'
cap = self.errorsPre(capitol)
cap = re.sub(ur'\n\*', u'\n[*] ',cap) # La llista no numerada ha de contenir un espai entre l'asterisc i la frase...
cap = re.sub(ur"'{3}", u"[''']", cap)
cap = re.sub(u"(?<![\['])'{2}(?![\]'])", u"['']", cap)
cap = re.sub(ur'\n#',u'\n[#] ', cap)
cap = re.sub(ur'\$', u'[$]', cap)
cap = re.sub(ur'(&\w+;)',ur'[\1]',cap)
cap = cap.replace(u'<', u'[<')
cap = cap.replace(u'>', u'>]')
codi = re.findall(r'[\w]+=".+?"',cap)
ncodi = 0
for estil in codi:
print '* CERCANT ESTILS DE TEXT *'
ncodi = str(ncodi).zfill(4)
valor = u' [REFZZ%s] ' %(ncodi)
cap = cap.replace(estil, valor)
print estil
self.refs[valor] = estil
ncodi = int(ncodi) + 1
codi = re.findall(r'<[Mm]ath>.+?</[Mm]ath>',cap,flags=re.MULTILINE)
ncodi = 0
for mates in codi:
print '* CERCANT CODI LaTex *'
ncodi = str(ncodi).zfill(4)
valor = u' [REFWM%s] ' %(ncodi)
cap = cap.replace(mates, valor)
print mates
self.refs[valor] = mates
ncodi = int(ncodi) + 1
codi = re.findall(r'[^[](http://[\w./\~\+\-&=\?\d\#\%]+)',cap)
ncodi = 0
for webs in codi:
print "* CERCANT URL's *"
print webs
# raw_input("No acaben d'estar be les webs")
ncodi = str(ncodi).zfill(4)
valor = u' [REFWY%s] ' %(ncodi)
cap = cap.replace(webs, valor)
self.refs[valor] = webs
ncodi = int(ncodi) + 1
if self.idioma_original == u'en' and cap.find(u'entur') != -1:
cap = self.segles(cap)
print "TEXT PRE_TRAD"
print cap
self.text_trad = self.cerca(cap)
# print self.text_trad
self.ordena_diccionari(self.refs)
self.text_trad = self.text_trad.replace(u'{', u' [{] ' )
self.text_trad = self.text_trad.replace(u'}', u' [}] ' )
text_trad = self.traductor(self.text_trad)
print u"* TEXT POST APERTIUM *"
print self.text_trad
text_trad = text_trad.replace(u'*REF',u'REF')
text_trad = text_trad.replace(u'\n REF',u'\nREF')
# print "TEXT POST_TRAD"
# print text_trad
no_trad = re.findall(r'\*\w+\s',text_trad)
for paraula in no_trad:
if paraula[1:].isupper:
pass
else:
if paraula not in self.no_trad and paraula not in self.llista_marques:
self.no_trad.append(paraula)
if u'REF' in text_trad:
text = self.referText(text_trad)
else:
print u"* NO S'HAN TROBAT REF PER CANVIAR *"
text = text_trad
while u'REF' in text:
refrep += 1
text = text.replace(u'*', u' ')
print '*** ENCARA HI HA REF PER CANVIAR ***'
text = self.referText(text)
if refrep > len(self.refs.keys()):
break
text = text.replace(u'\n[*] ', u'\n*')
text = text.replace(u'\n ', u'\n')
text = text.replace(u'[ http:', u'[http:')
text = text.replace(u'[$]', u'$')
text = text.replace(u'[#]', u'\n#')
text = text.replace(u"[#'#']", u"''")
text = text.replace(u"[#'#'#']",u"'''")
text = text.replace(u"['']", u"''")
text = text.replace(u"[''']",u"'''")
text = text.replace(u' ,', u',')
text = text.replace(u' CLAUDATOROBERT ', u'{')
text = text.replace(u' CLAUDATORTANCAT ', u'}')
text = re.sub(ur'(\[&\w+;\])',ur'\1',text)
text = text.replace(u'[ <',u'<')
text = text.replace(u'> ]',u'>')
text = text.replace(u'[<',u'<')
text = text.replace(u'>]',u'>')
text = text.replace(u'[{]',u'{')
text = text.replace(u'[}]',u'}')
text = text.lstrip()
while u' ' in text:
text = text.replace(u' ', u' ')
text = self.postTrad(text)
text_final += text + u'\n\n' + capitol_ori + u"\n\n"
self.refs = {}
self.dicc_enllac = {}
print '**************\n*** ACABAT ***\n**************'
print u'888888888888888888\n 88 Original 88 \n888888888888888888\n'+capitol_ori
print u'8888888888888888888\n 88 Traducció 88 \n8888888888888888888\n'+text
try:
registre = open('registres/registre-%s.txt' %self.titol_original,'a')
print u"Registre normal"
# raw_input (u"Enter per seguir")
except:
registre = open('/registres/registre-001.txt', 'a')
print u"Registre a 001"
# raw_input (u"Enter per seguir")
registre.write(text_final.encode('utf-8'))
registre.close()
while text_final.find(u' ') != -1:
text_final = text_final.replace(u' ', u' ')
categories = self.cercaCategories(pagina,text)
text_final += self.cat_original+u"\n\n"+categories+u"\n\n"+self.llista_iw
while text_final.find(u'\n\n\n') != -1:
text_final = text_final.replace(u'\n\n\n',u'\n\n')
text_final = text_final.replace(u'==\n\n',u'==\n')
text_final = text_final+\
u"\n\n==Notes de traducció==\n*Les plantilles en vermell són les \
que no s'han pogut trobar la corresponent plantilla en català. \
Això no vol dir que no existeixi, sino que no s'ha pogut trobar \
automàticament, ja sigui per que no hi ha el corresponent enllaç \
interviqui, o per que, realment, no existeix la plantilla en català. \
En cas que trobeu la plantilla corresponent us agrairia que li \
posesiu el seu enllaç interviqui a la plantilla en l'idioma original \
per poder trobar-la en properes traduccions. Gràcies. --~~~~\n\
*Podeu comentar possibles millores en el bot de traducció en \
[[Usuari:Anskarbot/Errors|aquesta pàgina]]. --~~~~\n\
*Les paraules que el programa [[Apertium]] encara no tradueix \
queden registrades automàticament. Si trobeu alguna millora en \
la traducció podeu expresar-ho a la mateixa \
[[Usuari:Anskarbot/Errors|pàgina d'errors]]. --~~~~"
try:
registre = open('registres/registre-%s.txt' %self.titol_original,'a')
print u"Registre normal"
# raw_input (u"Enter per seguir")
except:
registre = open('/registres/registre-001.txt', 'a')
print u"Registre a 001"
# raw_input (u"Enter per seguir")
registre.write(text_final.encode('utf-8'))
registre.close()
return text_final
def referText(self, text):
"""Canvia les referències de codi REF...... pel valor corresponent del diccionari self.refs"""
print u'*** REFENT EL TEXT ***'
marca = re.findall(r'\[REF\w+\d+\]', text)
print text
for ref in marca:
print ref
text = text.replace(ref, self.refs[u' '+ref+u' '])
return text
def postTrad(self,text):
print "* GESTIONANT EL TEXT DESPRÉS DE LA TRADUCCIÓ *"
enxel = re.findall(r'[eE]n (\d{1,4})',text)
print enxel
for data in enxel:
text = text.replace(' en %s' %data, ' el %s' %data)
text = text.replace(' En %s' %data, ' El %s' %data)
text = text.replace('\nEn %s' %data, '\nEl %s' %data)
text = text.replace('En %s' %data, 'El %s' %data)
if self.canvis_post != {}:
text = self.errorsPost(text)
text = self.paginaRe(text,self.commons)
return text
class Categories:
def treuCategories(self,pagina,text):
text = text
if self.prova_categories == False: return text
print "* NETEJANT CATEGORIES *"
llista_cat = u"<!-- Categories trobades en el text original. Amagades per no tenir categories en vermell"
categories = pagina.categories()
for categoria in categories:
print categoria.title()
text = re.sub(r'\[\['+categoria.title()+r'(.+)?\]\]' , u'',text,flags=re.DOTALL|re.UNICODE)
categoria = u"\n[["+categoria.title()+u"]]"
llista_cat += categoria
llista_cat += u' -->'
self.cat_original = llista_cat
return text
def cercaCategories(self,pagina,text,n=1,p=1,limit=3):
cat_ca=''
categories_ca=[]
parents=[]
categories_pare=[]
text = text
if self.prova_categories == False:
self.cat_original = ''
return text
print "* CERCANT CATEGORIES *"
wiki_ca = wikipedia.Site(u'ca')
categories = pagina.categories()
for categoria in categories:
print str(n)+':'+str(limit)+'/'+str(p)+'-'+str(len(categories))
y = self.cercaInterviquis(categoria)
if y:
if u"[["+y.title()+u']]\n' not in categories_ca:
if y.title() not in self.llista_parents:
if y.title().find(u' per ') == -1:
parents.append(y)
self.cercaCategoriesPare(parents)
categoria_print = u"** "+unicode(y)+u" **"
print 60*u"*"+u"\n***** S'afegirà la següent categoria en català *****\n*"+categoria_print.center(58)+u"*\n"+60*u"*"
categories_ca.append(u"[["+y.title()+u']]\n')
supercategories = categoria.categories()
if n <= limit:
categories_pare.extend(supercategories)
if p == len(categories):
categories.extend(categories_pare)
categories_pare = []
if n == limit:
if categories_ca != []:
break
else:
limit += 1
n += 1
p += 1
for x in categories_ca:
cat_ca += x
return cat_ca
def cercaCategoriesPare(self,llista_cat_ca,n=1,p=1,categories_pare=[]):
for cats in llista_cat_ca:
cats_ca = cats.categories()
self.llista_parents.append(cats.title())
for categoria in cats_ca:
if categoria not in llista_cat_ca:
self.llista_parents.append(categoria.title())
supercategories = cats.categories()
if n <4:
categories_pare.extend(supercategories)
if p == len(llista_cat_ca):
n += 1
for x in categories_pare:
if x not in llista_cat_ca:
llista_cat_ca.append(x)
categories_pare = []
p += 1
class Peticions:
def cercaPeticions(self,p=0):
print u'* COMENÇA EL PROCÉS DE CERCA DE PETICIONS DE TRADUCCIÓ *'
articles = catlib.Category(u'ca',u"Categoria:Peticions de còpia i preprocés per traducció automàtica").articles()
print u"* COMENÇA EL PROCÉS DE GESTIÓ DE LES PLANTILLES DE PETICIÓ DE TRADUCCIÓ *"
for pagina in articles:
# plantilles = pagina.templatesWithParams()
plana = mwparserfromhell.parse(pagina.get())
plantilles = plana.filter_templates()
for plant in plantilles:
if u'etició de traducció' in plant.name:
if unicode(plant) == u'{{Petició de traducció|idioma|títol original|--~~~~ (signatura)|paràmetres opcionals}}':
continue
print plant
clau = unicode(pagina)+str(p).zfill(2)
print clau
print pagina
self.peticions[clau] = plant
p += 1
if p > 1: peticions = u" peticions"
else: peticions = u" petició"
missatge = u"*** S'ha trobat "+str(p)+ peticions+u" de traducció ***"
print len(missatge)*u"*"+"\n"+missatge+u"\n"+len(missatge)*"*"
def treuPeticio(self, pagina):
if self.prova_gravar_viqui == False: return
print u"* COMENÇA EL PROCÉS PER TREURE LA PLANTILLA JA PROCESSADA *"
pagina_txt = re.findall(r'\[\[ca:(.+)\]\]',pagina)
print pagina_txt
print pagina
text = wikipedia.Page('ca',unicode(pagina_txt[0])).get()
plantilla = self.peticions[pagina]
plantilla = plantilla.replace('\n','')
print plantilla
# print 'afsklfasdljkasldkfhasdklf'
# text = text.replace(u'{{petició de traducció',u'{{Petició de traducció')
text = text.replace(plantilla,'')
wikipedia.Page('ca',unicode(pagina_txt[0])).put(text,u"Anskarbot traient la plantilla de traducció." ,minorEdit=False,force=True)
def paginesClau(self,pagina,missatge=''):
try:
print self.peticions[pagina]
parametres = self.peticions[pagina].params
self.titol_escollit=False
self.idioma_original = unicode(parametres[0])
print 56*u"*"+u"\nIdioma de traducció: \n* "+self.idioma_original
self.titol_original = unicode(parametres[1])
if self.idioma_original not in self.dicc_ordena.keys():
print u"Títol de la pàgina a traduir: \n* "+self.titol_original
try:
self.pagina_discussio_usuari = re.search(ur'Usuari Discussió:\w+[\s\w]+', unicode(parametres[2])).group()
except:
self.pagina_discussio_usuari = re.search(ur'Usuari_Discussió:\w+[\s\w]+', unicode(parametres[2])).group()
self.usuari_peticio = re.findall(ur'Usuari:(\w+)', unicode(parametres[2]))[0]
print u"Pàgina de discussió de l'usuari/a que demana la traducció: \n* "+self.pagina_discussio_usuari
for n in range(len(parametres[1])):
try:
parametres[n]
if u'títol=' in parametres[n]:
titol = unicode(parametres[n]).split('=')[1]
self.titol_escollit = titol.replace(titol[0],titol[0].upper())
missatge = u"S'ha demanat aquest títol de pàgina provisional: \n* "
elif u'enllaços=' in parametres[n]:
self.tria_enllacos = True
elif u"regex=" in parametres[n]:
self.pagina_regex = unicode(parametres[n]).split(u'=')[1]
print u"S'ha demanat aquesta pàgina regex: \n* "+self.pagina_regex
except: continue
if self.titol_escollit:
print missatge+self.titol_escollit
else:
print u"No s'ha demanat un títol específic"
print u"S'ha demanat conservar els enllaços originals?: \n* "+str(self.tria_enllacos)+u"\n"+56*u"*"
self.muntaPaginaRE(self.pagina_regex,u'ca')
self.muntaPaginaRE(u'regex',self.idioma_original)
if self.idioma_original not in self.idiomes_suportats:
return 'ERROR'
except:
return "FATAL"
class Pregunta:
def pregunta(self,pregunta,resposta):
passem = resposta
while resposta != 's' and resposta != 'n' and resposta != '' and resposta != True:
resposta = raw_input(pregunta)
if resposta == 's':
print 'True'
passem = True
elif resposta == 'n':
print 'False'
passem = False
elif resposta == '':
print 'False'
resposta = 'n'
passem = False
return passem
class Inici(Pregunta,Peticions,Text,Interviqui,PreCercaSubst,Diccionaris,Gestio,Categories,Apertium,Wiki,Maquillatge,Proves,Plantilles,Finestra):
def main(self):
print
print u'///////////////////////////////'.center(80)
print u'///*************************///'.center(80)
print u'///* ARRENCA AMICAL-BOT II *///'.center(80)
print u'///* ANSCARBOT ///'.center(80)
print u'///*************************///'.center(80)
print u'///////////////////////////////'.center(80)
print
self.variables()
self.prova_gravar_viqui = self.pregunta(u'Gravem a la viqui?',False)
if self.prova_gravar_viqui == False:
self.proves = self.pregunta(u'Volem fer proves?',False)
if self.proves == True:
self.apartat()
else:
self.prova_maquillatge = True
self.prova_plantilles = True
self.prova_enllacos = True
self.prova_categories = True
self.prova_taules = True
self.prova_code = True
self.prova_mates = True
self.prova_imatges = True
self.prova_webs = True
self.prova_traduccio = True
self.prova_interviqui = True
self.cercaPeticions()
print self.peticions
for peticio in self.peticions.keys():
print peticio
# resposta = self.pregunta(u"Saltem aquesta peticio?",False)
# if resposta == True:
# continue
self.netejaVariables()
endavant = self.paginesClau(peticio)
pagina_usuari = wikipedia.Page('ca',unicode(self.pagina_discussio_usuari))
pagina_discusio = pagina_usuari.get()
if endavant == 'ERROR':
print "* DEIXANT L'AVÍS D'ERROR D'IDIOMA A LA PÀGINA DE L'USUARI *"
missatge = u"[[Fitxer:Frog Bot - sad.gif]]\n* La vostra petició de traducció de l'article '''" + self.titol_original + u"''' no s'ha pogut dur a terme. Problemes amb el programa de traducció fa que de moment només es puguin fer traduccions de {{en}} i {{es}}. Perdoneu les molèsties. Gràcies."
if missatge in pagina_discusio:
print u"Ja s'ha avisat a l'usuari de l'error en la plantilla"
else:
pagina_discusio = pagina_discusio+u"\n== Problemes amb la traducció ==\n\n"+missatge+u" --~~~~\n"
pagina_usuari.put(pagina_discusio,u"Anscarbot deixant un missatge a la pàgina de discussió de l'usuari.",minorEdit=False, force=True)
print u'*****************************************'
print u'********** PETICIÓ CANCEL·LADA **********'
print u'*****************************************'
continue
elif endavant == 'FATAL':
print "* DEIXANT L'AVÍS D'ERROR D'IDIOMA A LA PÀGINA DE L'USUARI *"
missatge = u"[[Fitxer:Frog Bot - sad.gif]]\n* La vostra petició de traducció de l'article '''" + self.titol_original + u"''' no s'ha pogut dur a terme. Repasseu que els paràmetres de la plantilla siguin correctes. Perdoneu les molèsties. Gràcies."
if missatge in pagina_discusio:
print u"Ja s'ha avisat a l'usuari de l'error en la plantilla"
else:
pagina_discusio = pagina_discusio+u"\n== Problemes amb la traducció ==\n\n"+missatge+u" --~~~~\n"
pagina_usuari.put(pagina_discusio,u"Anscarbot deixant un missatge a la pàgina de discussió de l'usuari.",minorEdit=False, force=True)
print u'*****************************************'
print u'********** PETICIÓ CANCEL·LADA **********'
print u'*****************************************'
continue
else:
self.muntaPlantillesProcessades()
text = self.preTrad(peticio)
if u"otes de traducc" not in text:
print text
print "* DEIXANT L'AVÍS D'ERROR DE PLANTILLA A LA PÀGINA DE L'USUARI *"
missatge = u"[[Fitxer:Frog Bot - sad.gif]]\n* La vostra petició de traducció de l'article '''" + self.titol_original + u"''' no s'ha pogut realitzar perque hi ha algun error en la configuració de la plantilla. Mireu que els paràmetres obligatoris estiguin ben posats <nowiki>{{Petició de traducció|idioma|títol original|--~~~~ (signatura)|paràmetres opcionals}}</nowiki>. Comproveu també que el títol correspon exactament a una pàgina existent a la viquipèdia de l'idioma de traducció (accents, majúscules, espais, caràcters no ASCII...). Gràcies."
if missatge in pagina_discusio:
print u"Ja s'ha avisat a l'usuari de l'error en la plantilla"
else:
pagina_discusio = pagina_discusio+u"\n== Problemes amb la traducció ==\n\n"+missatge+u" --~~~~\n"
pagina_usuari.put(pagina_discusio,u"Anscarbot deixant un missatge a la pàgina de discussió de l'usuari.",minorEdit=False, force=True)
print u'*****************************************'
print u'********** PETICIÓ CANCEL·LADA **********'
print u'*****************************************'
continue
self.article(text,peticio)
self.treuPeticio(peticio)
print u'****************************************'
print u'********** ACABADA LA PETICIÓ **********'
print u'****************************************'
if self.prova_gravar_viqui == False:
self.pregunta(u'Seguim?',False)
print u'\nOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO'
print (u'OOOOO ACABADES LES TRADUCCIONS OOOOO').center(60)
print u'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO'
return 0
def netejaVariables(self):
self.llista_parents = []
self.llista_iw = ''
self.cat_original = []
self.no_trad = []
self.canvis_post = {u"Veu també":u'Vegeu també',
u'i.e.':u"per exemple",
u'NOTRADUIR002':u'Twentieth Century Fox',
u'NOTRADUIR001':u'The New York Times',
u" < ref":u"<ref",
u"< ref":u"<ref",
u" <ref ":u"<ref ",
u"( ":u"(",
u" )":u")",
u"{{Article de qualitat}}":u'',
u"{{Article bo}}":u'',
u"REFSOLA ":u"<references/>"}
self.canvis_pre = {u"New York Times":u" NOTRADUIR001 ",
u"Twentieth Century Fox":u" NOTRADUIR002 ",
u"<references/>":u" REFSOLA "}
def variables(self):
# DICCIONARIS
self.proves = False
self.refs = {}
self.peticions = {}
self.dicc_plantilles = {}
self.dicc_enllacos = {}
self.dicc_altres = {}
self.commons = {u'Image:' : u"Fitxer:",
u"Archivo:" : u"Fitxer:",
u"Imagen:" : u"Fitxer",
u"File:" : u"Fitxer:",
u"Arxiu:" : u"Fitxer:",
u"Fichier:" :u"Fitxer:",
u"Fichier:" :u"Fitxer:"}
self.dicc_ordena = {u"en" : u"{{DEFAULTSORT:",
u"fr" : u"{{DEFAULTSORT:",
u"es" : u"{{DEFAULTSORT:",
u"pt" : u"{{DEFAULTSORT:",
u"oc" : u"{{DEFAULTSORT:",
u"it" : u"{{DEFAULTSORT:",}
self.titol_plantilles = {u'en' : u'Template:',
u'fr' : u'Modèle:',
u'es' : u'Plantilla:',
u'pt' : u'Predefinição:',
u'oc' : u'Modèl:',
u'it' : u'Template:'}
self.us_plantilles = {u'en' : u"/doc",
u"fr" : u"/Documentation",
u"es" : u"/doc",
u"pt" : u"/doc",
u"oc" : u"/Documentacion",
u"it" : u"/man"}
self.dicc_categories = {u"en" : u"Category:",
u"fr" : u"Catégorie",
u"es" : u"Categoría",
u"pt" : u"Categoria",
u"oc" : u"Categoria",
u"it" : u"Categoria"}
# ALTRES VARIABLES
self.cops_k_passa = 1
self.tria_enllacos = False
self.pagina_regex = ''
self.plantilles_wiki = {}
self.missatge_plantilla = u"Aquí es van afegint les traduccions dels paràmetres de les plantilles. Cada idioma de traducció té una plana diferent. En principi s'afegeixen automàticament quan el bot troba una plantilla en l'idioma original que existeix en català i no la troba en aquesta pàgina. Si voleu afegir alguna traducció de plantilla ho podeu fer seguint les següents recomanacions.\n\nEs pot editar la pàgina de la següent manera:\n\
*S'ha de posar com a títol de secció el nom de la plantilla en català sense redireccions. És a dir: Si la plantilla {{tl|FR}} redirigeix a {{tl|Falten referències}} el títol de secció ha ser '''<nowiki>==Falten referències==</nowiki>''' i no <s>'''<nowiki> ==FR== </nowiki>'''</s>\
*Els paràmetres es posaran de la mateixa manera que la resta d'expressions regulars:\
**paraula/frase mal escrita(o bé paraula/frase en l'idioma original);paraula/frase ben escrita\
*Noteu que en aquest cas les paraules a escriure han de ser les mateixes que indiquen els paràmetres de la plantilla, si el paràmetre és '''enllaçautor''' no podem escriure <s> '''enllaç autor''' </s>.\
<!-- Si us plau, no varieu aquesta introducció, ha de ser igual per totes les pàgines per construir els diccionaris de plantilles -->"
# LLISTES
self.idiomes_suportats = ('es', 'en', 'fr', 'pt', 'oc', 'it')
self.cerques =[(u'<!--',u'-->', u' [REFCO%s] '), # Llista de tuples que ...
(u'[http:',u']', u' [REFEW%s] '), # ... estableix el caràcter de cerca ...
(u'[[',u']]', u' [REFEA%s] '), # ... i el relaciona amb la referència que substituirà.
(u'{{',u'}}', u' [REFPL%s] '), # La tupla consta de tres paràmetres:
(u"[<gallery", u"</gallery>]", u" [REFGC%s] "),
(u'[<ref>' , u'</ref>]', u' [REFRE%s] '), # 1: El primer terme de cerca, (p.e. {{ com a primer terme)
(u'[<ref', u'</ref>]', u' [REFRH%s] '), # 2: El darrer terme de cerca, (ha de trobar }} com a darrer terme)
(u'[<ref name' , u'/>]' , u' [REFSR%s] '), # 3: La referència que substitueix el codi trobat
# (u'<nowiki>' , u'</nowiki>' , u' REFSA%s '), # És important que la marca REFxx segueixi un ordre alfabètic
# (u'<div' , u'</div>' , u' REFSA%s '), # per gestionar el diccionari de referències en l'ordre correcte
(u'<' , u'>' , u' [REFWC%s] '), # de forma qualsevol codi inserit dins un altre codi es gestioni primer el que es troba dins un altre,
(u'{|',u'|}', u' [REFZT%s] ')] # per això el comentari <!-- --> és el primer en gestionar-se i les taules {| }| l'últim de tots.
self.marques = [u' ASTR ',u' SIMBOLDOLLAR ',u' SOSTINGUT ',u" CURSIVA ", u" NEGRETA ",u' CLAUDATOROBERT ',u' CLAUDATORTANCAT ',u' UNIÓMOTS ']
if __name__ == '__main__':
try:
app = Inici()
app.main()
finally:
wikipedia.stopme()