Usuario:Chabbot/code
Apariencia
# -*- 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()