Utilisateur:Eikubot/ko nom.py

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.
# -*- 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"