Utilisateur:Eikubot/ko nom.py
:
# -*- coding: utf-8 -*-
"""
Ce robot-là sert à remplacer le modèle {{kohan|hangul|blabla}} par {{ko-nom|j|a|m|o}}
"""
import os, sys
import re
import time
import difflib
import neti
from merger import mk_jamos
import atexit
interface = neti.interface
interface.DELAY = 6
interface.SLEEP_POINT_TIME = 0.2
interface.CHECK_SHUTOFF_DELAY = 50
def ouinon (question, default="n", oui=("y","o","j")):
"""Juste pour poser une question"""
rep = raw_input ("%s (%s) "%(question, default)).lower ()
if rep == "" or rep == "\n": rep = default
return rep in oui
class Foo:pass
glo = Foo () #simple conteneur
class Complete_logging:
def __init__ (self, file):
self.log = open (file, "a")
self.lastflush = time.time()
def write (self, txt):
if isinstance (txt, unicode):
txt = txt.encode ("utf-8")
self.log.write (txt)
sys.__stdout__.write (txt)
def flush (self):
sys.__stdout__.flush ()
if time.time > self.lastflush + 10:
self.log.flush ()
self.lastflush = time.time ()
sys.stdout = Complete_logging ("complete_log.txt")
def caracteres2jamos (match):
try: txt = unicode (match.group (1), "utf-8")
except TypeError:
txt = match.group (1)
glo.last_before=txt
ret = []
for i in txt: ret += mk_jamos (i)
ret = u"|".join (ret)
ret = u"{{ko-nom|%s}}"%ret
glo.last_after = ret
return ret
def replace_kohan (txt):
return re.sub (ur"(?u)\{\{kohan\|([^|]*)\|[^}]*\}}", caracteres2jamos, txt)
def rm_vide (liste):
while "" in liste:
liste.remove ("")
return liste
def get_all_in_category (cat, cmcontinue=""):
"""cherche récursivement dans les catégories"""
ret = []
if cmcontinue:
reponse = neti.demander ("pages de la catégorie des \033[34mnoms en coréen\033[0m",
action="query",
list="categorymembers",
cmtitle="Catégorie:Noms communs en coréen",
cmsort="sortkey",
cmdir="asc",
cmcontinue=cmcontinue)
else:
reponse = neti.demander ("pages de la catégorie des noms en coréen",
action="query",
list="categorymembers",
cmtitle="Catégorie:Noms communs en coréen",
cmsort="sortkey",
cmdir="asc")
subcats = []
pages = re.findall (r'title="([^"]*)"', reponse)
pages2=[]
for i in pages:
if i.startswith ("Catégorie:"):
subcats.append (i)
else: pages2.append (i)
pages = pages2
try: cmcontinue = re.findall (r'cmcontinue="([^"]*)"', reponse)[0]
except: print reponse
return (cmcontinue, pages)
sys.exit ()
diff = difflib.Differ ()
def main ():
ERRORS=0
a_faire = rm_vide (open ("ko_nom_todo.txt", "r").read ().split ("\n"))
fait = rm_vide (open ("ko_nom_done.txt", "r").read ().split ("\n"))
problemes = rm_vide (open ("ko_nom_prob.txt", "r").read ().split ("\n"))
if not a_faire:
try:
cmcontinue = open ("ko_nom_cmcontinue.txt","r").read ()
if cmcontinue == "\n": cmcontinue = ""
except: cmcontinue = ""
cmcontinue, a_faire = get_all_in_category ("Catégorie:Noms communs en coréen", cmcontinue)
open ("ko_nom_cmcontinue.txt","w").write (cmcontinue)
for i in fait:
while i in a_faire:
a_faire.remove (i)
atexit.register (lambda: open ("ko_nom_todo.txt","w").write ("\n".join (a_faire)))
atexit.register (lambda: open ("ko_nom_done.txt","w").write ("\n".join (fait)))
atexit.register (lambda: open ("ko_nom_prob.txt","w").write ("\n".join (problemes)))
log= open ("log.txt","a")
atexit.register (lambda: log.close ())
while len (a_faire):
en_cours = a_faire [-1]
print "En cours de traitement: \033[034m%s\033[0m"%en_cours
# Bouton d’arrêt d’urgence
arret_urgence = neti.verifier_arret_urgence ()
if arret_urgence:
page= neti.Page ("Utilisateur:Eikubot/Arrêt")
try: page.append_section ("Arrêt suite à une demande d’arrêt d’urgence.", "Je m’arrête. --~~~~")
except: pass
print "\033[31mArrêt d’urgence du bot demandé sur le Wiktionnaire.\033[0m"
sys.exit (1)
page = neti.Page (en_cours)
if not page.exists ():
print "La page n’existe pas."
else:
texte = unicode (page.read (), "utf-8")
try: nouveau = replace_kohan (texte)
except: ERRORS = 1
if texte == nouveau:
print "Rien à changer"
else:
print "Changements : "
differences = ''.join (list (diff.compare (texte.splitlines(1), nouveau.splitlines(1))))
print differences
log.write ("\n\n" + differences.encode ("utf-8"))
#if ouinon ("Valider ? ", "o"):
if 1:
print "\033[03mWriting %s\033[0m"%en_cours
print "len (todo) = %s"%(len (a_faire) - 1)
print "suivant: %s"%(None if len (a_faire) == 1 else a_faire [-2])
avant, apres = glo.last_before.encode ("utf-8"), glo.last_after.encode ("utf-8")
page.write ("(bot): remplacement de {{kohan|%s|…}} par %s."%(avant, apres), nouveau.encode ("utf-8"), 1)
# fin de boucle:
#if ouinon ("Des problèmes ? "):
if ERRORS:
problemes.append (a_faire.pop ())
ERRORS=0
print "%s a un problème"%fait[-1]
else:
fait.append (a_faire.pop ())
print "%s retiré de la liste"%fait[-1]
if __name__ == "__main__":
print "\033[32mDémarrage du bot.\033[0m"
try:
while True:
main ()
print "\033[32mBoucle bouclée.\033[0m"
except KeyboardInterrupt: print "\033[31mLeaving: User typed Ctrl+C.\033[0m"