Usuario:Chabbot/code

De Wikipedia, la enciclopedia libre
# -*- 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()