# -*- coding: utf-8 -*-
#mirar [[Llave]]
#añadir wikicita
import codecs
import wikipedia
#import xmlreader
import re
#import webbrowser
#regexps (añadir según aparezcan o hacer una regla mejor)
#convertir a esta gente en algo que se pueda iterar
r_externos=re.compile(ur"==\s*[eE]nlaces externos\s*==")
r_notas=re.compile(ur"==\s*[nN]otas\s*==")
r_refs=re.compile(ur"==\s*[rR]eferencias\s*==")
r_cats=re.compile(ur"\[\[[cC]ategoría:.*]]")
r_esbozo=re.compile(ur"{{[eE]sbozo")
r_miniesbozo=re.compile(ur"{{[Mm]iniesbozo")
r_aviso=re.compile(ur"{{[aA]visomédico}}")
r_desam=re.compile(ur"{{[dD]esambiguación}}")
r_el=re.compile(ur"{{EL}}")
r_enlacillo=re.compile(ur"==\s*[eE]nlace externo\s*==")
#no pasar por estos
r_forbidden=re.compile(ur"(Usuario:)|(Ayuda:)|(Wikipedia:)")
r_commons=re.compile(ur"(?:{{[cC]ommons)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_commonscat=re.compile(ur"(?:{{[cC]ommonscat)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_source=re.compile(ur"(?:{{[wW]ikisource)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_source_autor=re.compile(ur"(?:{{[wW]ikisource autor)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_source_doc=re.compile(ur"(?:{{[wW]ikisource documento histórico)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_source_obra=re.compile(ur"(?:{{[wW]ikisource obra)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_books=re.compile(ur"(?:{{[wW]ikibooks)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_quote=re.compile(ur"(?:{{[wW]ikiquote)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_dict=re.compile(ur"(?:{{[wW]iktionary)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_dictpar=re.compile(ur"(?:{{[wW]ikcionariopar)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}")
r_species=re.compile(ur"(?:{{[wW]ikispecies)(\|(?P<link>[^}|]*))?(\|(?P<nombre>[^}]*))?}}\s*\n?\s*")
r_newline=re.compile(r"\s*\n\s*")
#sitios wiki
site = wikipedia.getSite()
#ficheros: la lista de artículos a revisar y un fichero de salida que contendrá los títulos de los artículos y la ipr que les toca. Los de salida son más que nada para debug.
file=codecs.open('lista', mode='rwb', errors='strict', encoding='utf-8', buffering=1)
salida=codecs.open('salida', mode='wb', errors='strict', encoding='utf-8', buffering=1)
nuevo_art=codecs.open('nart.wiki', mode='wb', errors='strict', encoding='utf-8', buffering=1)
#str.capitalize pasa a minúsculas las que no son iniciales, hacemos una nueva
def capital(str):
return str[0].upper()+str[1:]
#python no tiene funciones para insertar cadenas en otras cadenas??
def insert(original, new, pos):
return original[:pos] + new + original[pos:]
#utt: resultado de la búsqueda con regexp
#prefijo: el prefijo ipr del proyecto
#str_ipr: la cadena de llamada a {{ipr... que nos estamos montando paso a paso
#articulo: el título del artículo
def iprize(utt, prefijo, str_ipr, articulo, prep=None, objeto=None):
if utt:
str_ipr = str_ipr + "|" + prefijo
if utt.group("link") and capital(utt.group("link")):# != articulo:
str_ipr=str_ipr + u"=" + utt.group("link")
else:
str_ipr=str_ipr + u"=" + articulo
if utt.group("nombre") and capital(utt.group("nombre")):# != articulo:
str_ipr=str_ipr + u"|" +prefijo+"_etiqueta=" + utt.group("nombre")
if prep != None:
str_ipr=str_ipr + u"|" +prefijo +u"_preposicion=" + prep
if objeto != None:
str_ipr=str_ipr + u"|" +prefijo +u"_objeto=" + objeto
return str_ipr
#especial para wikcionario, que no tiene inicial en mayúsculas
def iprwikt(utt, str_ipr):
str_ipr = str_ipr + "|wiktionary"
if utt.group("link") and utt.group("link"):# != articulo:
str_ipr=str_ipr + u"=" + utt.group("link")
if utt.group("nombre") and utt.group("nombre"):# != articulo:
str_ipr=str_ipr + "|wiktionary_etiqueta=" + utt.group("nombre")
return str_ipr
#consulta si grabar o graba directamente
def consultagraba(articulo,nuevoart, consultar=None):
ap=wikipedia.Page(wikipedia.getSite(),articulo)
#TODO:sería estupendo ver el preview en un browser
#print nuevoart
if consultar != None:
key=wikipedia.input("Grabar?")
if key != "n":
ap.put(nuevoart,comment=u"+{{interproyecto}} Bot")
else:
try:
ap.put(nuevoart,comment=u"+{{interproyecto}} Bot")
except wikipedia.SpamfilterError:
print "no posible"
#busca donde poner start de acuerdo a una regexp
def busca(utt,start):
if utt:
if start == -1 or start > utt.start():
start=utt.start()
return start
for articulo in file:
if articulo[0] == '#':
continue
#quitamos el \n
articulo=articulo[:-1]
str_ipr=u"{{interproyecto"
page_es=wikipedia.Page(site,articulo)
texto=page_es.get()
#una pasada a ver si tiene plantillas de interproyecto. Python es un poco guarro a este respecto, pues la lista incluye poca información. ESTO RALENTIZA
l_utt_commons =r_commons.findall(texto)
l_utt_commonscat=r_commonscat.findall(texto)
l_utt_source =r_source.findall(texto)
l_utt_source_autor=r_source_autor.findall(texto)
l_utt_source_doc =r_source_doc.findall(texto)
l_utt_source_obra =r_source_obra.findall(texto)
l_utt_books =r_books.findall(texto)
l_utt_quote =r_quote.findall(texto)
l_utt_dict =r_dict.findall(texto)
l_utt_dictpar =r_dictpar.findall(texto)
l_utt_species =r_species.findall(texto)
#comprobamos que sólo haya una plantilla como máximo de cada tipo. Si hay más pasando, aplicar criterio humano
if len(l_utt_commons)+len(l_utt_commonscat) > 1 or len(l_utt_source) >1 or len(l_utt_source_autor) >1 or len(l_utt_source_doc) >1 or len(l_utt_source_obra) >1 or len(l_utt_books) >1 or len(l_utt_quote) >1 or len(l_utt_dict) >1 or len(l_utt_dictpar) >1 or len(l_utt_species) >1:
print "Tags múltiples, revisar manualmente"
continue
#pasadita que recoge donde están
utt_commons =r_commons.search(texto)
utt_commonscat =r_commonscat.search(texto)
utt_source =r_source.search(texto)
utt_source_autor=r_source_autor.search(texto)
utt_source_doc =r_source_doc.search(texto)
utt_source_obra =r_source_obra.search(texto)
utt_books =r_books.search(texto)
utt_quote =r_quote.search(texto)
utt_dict =r_dict.search(texto)
utt_dictpar =r_dictpar.search(texto)
utt_species =r_species.search(texto)
# #commons es un caso especial por tener ccat
# if utt_commons:
# str_ipr = str_ipr + u"|c"
# if utt_commons.group("link"):
# enlace=utt_commons.group("link")
# if capital(enlace[0:9]) == u"Category:":
# str_ipr = str_ipr + u"cat"
# enlace=enlace[9:]
# if capital(enlace) != articulo:
# str_ipr = str_ipr + u"=" + enlace
# if utt_commons.group("nombre"):
# if capital(utt_commons.group("nombre")) != articulo:
# str_ipr = str_ipr + u"|c_etiqueta=" + utt_commons.group("nombre")
#wikt es especial: hay que conservar la minúscula
if utt_dict:
str_ipr=iprwikt(utt_dict,str_ipr)
if utt_dictpar:
str_ipr=iprwikt(utt_dictpar,str_ipr)
#wikisource es muy pejilguero
if utt_source_autor:
str_ipr=iprize(utt_source_autor, u"wikisource", str_ipr, articulo, u"de")
elif utt_source_doc:
str_ipr=iprize(utt_source_doc, u"wikisource", str_ipr, articulo, u"histórico", u"el documento" )
elif utt_source_obra:
str_ipr=iprize(utt_source_obra, u"wikisource", str_ipr, articulo, u"de", u"una copia")
else:
str_ipr=iprize(utt_source, u"wikisource", str_ipr, articulo)
#print utt_commons
if utt_commonscat:
str_ipr = str_ipr + "|commons"
if utt_commonscat.group("link"):# != articulo:
str_ipr=str_ipr + u"=Category:" + utt_commonscat.group("link")
else:
str_ipr=str_ipr + u"=Category:" + articulo
if utt_commonscat.group("nombre") :# != articulo:
str_ipr=str_ipr + "|commons_etiqueta=" + utt_commonscat.group("nombre")
#a poner iprs más normales
str_ipr=iprize(utt_commons, u"commons", str_ipr, articulo)
str_ipr=iprize(utt_books, u"wikibooks", str_ipr, articulo)
str_ipr=iprize(utt_quote, u"wikiquote", str_ipr, articulo)
str_ipr=iprize(utt_species, u"wikispecies", str_ipr, articulo)
str_ipr=str_ipr+"}}"
#Si hay realmente cosas que cambiar:
if str_ipr != u"{{interproyecto}}":
print "plantillas encontradas"
#borramos las plantillas (TODO: ojo con los \n)
texto=r_commons.sub(u"",texto)
texto=r_commonscat.sub(u"",texto)
texto=r_source_autor.sub(u"",texto)
texto=r_source.sub(u"",texto)
texto=r_source_obra.sub(u"",texto)
texto=r_source_doc.sub(u"",texto)
texto=r_books.sub(u"",texto)
texto=r_quote.sub(u"",texto)
texto=r_dict.sub(u"",texto)
texto=r_species.sub(u"",texto)
texto=r_dictpar.sub(u"",texto)
texto=r_enlacillo.sub("==Enlaces externos==",texto)
#a ver dónde ponemos el huevo
utt_enext = r_externos.search(texto)
if utt_enext:
ap=wikipedia.Page(wikipedia.getSite(),articulo)
caso = ""
if texto[utt_enext.end()+1] != u"\n":
caso = "caso 1"
nuevoart=insert(texto,u"\n"+str_ipr,utt_enext.end())
else:
caso = "caso 2"
nuevoart=insert(texto,u"\n"+str_ipr,utt_enext.end()+1)
#print caso
#print texto[utt_enext.end()]
#print texto[utt_enext.end()+1]
consultagraba(articulo,nuevoart,None)
else:
#no hay seccion enlaces externos. Trataremos de ponerla antes de las referencias, las notas, las categorías, etc. TODO: Sustituir la lista de plantillas por una regexp que busque plantillas genéricas
# utt_notas=r_notas.search(texto)
# utt_refs=r_refs.search(texto)
utt_esbozo=r_esbozo.search(texto)
utt_miniesbozo=r_miniesbozo.search(texto)
utt_cats=r_cats.search(texto)
utt_aviso=r_aviso.search(texto)
utt_desam=r_desam.search(texto)
utt_el=r_el.search(texto)
start=-1
start=busca(utt_cats, start)
# start=busca(utt_notas,start)
# start=busca(utt_refs,start)
start=busca(utt_esbozo,start)
start=busca(utt_miniesbozo,start)
start=busca(utt_aviso,start)
start=busca(utt_desam,start)
start=busca(utt_el,start)
#hemos encontrado dónde poner la sección?
if start == -1:
print "El artículo ni siquiera tiene categorías, revisar manualmente"
continue
else:
while texto[start-1] == "\n":
start=start-1
if start != 0:
start=start+1
if texto[start-1] == u"\n" and texto[start-2] == u"\n":
nuevoart=insert(texto,u"==Enlaces externos==\n"+str_ipr+u"\n",start)
else:
nuevoart=insert(texto,u"\n==Enlaces externos==\n"+str_ipr+u"\n\n",start)
#GRABAMOS
consultagraba(articulo,nuevoart,None)
print "hecho"
# opera = webbrowser.get('opera')
# opera.open("http://es.wikipedia.org/w/index.php?title="+articulo+"&diff=cur&oldid=prev",2)
file.close()
salida.close()
nuevo_art.close()
wikipedia.stopme()