Mapeate/Tools/PaisesMundoContinentes.py

251 lines
9.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from os.path import dirname as nombre_directorio
from os.path import abspath as path_absoluto
from os.path import exists as path_existe
from re import compile as RECompile
from re import MULTILINE
import datetime
from json import loads as json_decodificar
class PaisesMundoContinentes:
__path_raiz = nombre_directorio(path_absoluto(__file__))
__configuracion_por_defecto = {
"archivo_paises_continentes" : "/Data/continent.json",
"archivo_paises_mundo" : "/Data/World map.svg",
"archivo_respuesta" : __path_raiz + "/../Data/world-map-continented.svg",
"autoiniciar" : True,
"formato_terminal" : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}",
"texto_por_defecto" : ""
}
__es_dos = '\\' in __path_raiz
__slash = '\\' if __es_dos else '/'
re_arreglar_path = RECompile(r'[\\\\\/]+')
re_string_variables = RECompile(r'\{([^\{\}]+)\}')
re_id_paises = RECompile(r'^\t<(path|g) id="([^"]+)"', MULTILINE)
def __init__(self, entradas = None):
self.__configuracion = {}
self.__entradas = entradas
self.__tipos_terminal = [
["unkn", "unknown", "desc", "desconocido"],
["info", "information", "informacion"],
[" ok ", "ok", "yes", "y", "si", "s"],
["warn", "warning", "avis", "aviso"],
["erro", "error", "no", "n", "wrong", "bad"],
["exce", "exception", "excepcion"]
]
self.__textos = {
"espanol" : {
"pmc_construyendo" : "La herramienta 'PaisesMundoContinentes' se está construyendo...",
"pmc_construido" : "La herramienta 'PaisesMundoContinentes' se construyó completamente.",
"pmc_iniciando" : "La herramienta 'PaisesMundoContinentes' se está iniciando...",
"pmc_iniciado" : "La herramienta 'PaisesMundoContinentes' se inició completamente."
}
}
self.__idioma = "espanol"
self.__idioma_por_defecto = "espanol"
self.__formato_terminal = self.configuracion("formato_terminal")
self.imprimir("info", "pmc_construyendo")
self.__paths_raiz = ["", self.__path_raiz + "/..", self.__path_raiz]
self.__iniciado = False
self.imprimir("ok", "pmc_construido")
self.configuracion("autoiniciar") and self.iniciar()
def iniciar(self, callback = None):
self.imprimir("info", "pmc_iniciando")
def terminar(estado):
self.imprimir(*(("ok", "pmc_iniciado") if estado else ("warn", "pmc_ya_iniciado")))
callable(callback) and callback(estado)
if self.__iniciado:
terminar(False)
return False
self.__iniciado = True
terminar(True)
diccionario_paises_continentes = self.leer_archivo(self.configuracion("archivo_paises_continentes"))
paises_mundo = self.leer_archivo(self.configuracion("archivo_paises_mundo"))
try:
diccionario_paises_continentes = json_decodificar(diccionario_paises_continentes)
except:
diccionario_paises_continentes = None
if diccionario_paises_continentes != None:
def callback(matches):
codigo = matches.group(2).upper()
fragmento = matches.group(0)
if codigo in diccionario_paises_continentes:
fragmento += ' data-continente="' + diccionario_paises_continentes[codigo] + '"'
codigo == "NZ" and print(fragmento)
return fragmento
self.escribir_archivo(self.configuracion("archivo_respuesta"), self.re_id_paises.sub(callback, paises_mundo))
return True
def cerrar(self, callback = None):
self.imprimir("info", "pmc_cerrando")
def terminar(estado):
self.imprimir(*(("ok", "pmc_cerrado") if estado else ("warn", "pmc_ya_cerrado")))
callable(callback) and callback(estado)
if not self.__iniciado:
terminar(False)
return False
self.__iniciado = False
terminar(True)
return True
def nulos(self, nulos = None):
return nulos if isinstance(nulos, bool) else self.configuracion("nulos", None, False, False)
def por_defecto(self, por_defecto = None, nulos = None):
return por_defecto if por_defecto != None or self.nulos(nulos) else self.configuracion("por_defecto", None, None, True)
def configuracion(self, claves, entradas = None, por_defecto = None, nulos = None):
claves = [clave.strip() for clave in (claves if isinstance(claves, (list, tuple)) else [claves]) if isinstance(clave, str)]
claves = [clave for i, clave in enumerate(claves) if clave and clave not in claves[:i]]
if len(claves):
nulos = self.nulos(nulos)
for entrada in (
list(entradas) if isinstance(entradas, (list, tuple)) else [entradas]
) + [self.__entradas, self.__configuracion, self.__configuracion_por_defecto]:
if isinstance(entrada, dict):
for clave in claves:
if clave in entrada and (nulos or entrada[clave] != None):
return entrada[clave]
return self.por_defecto(por_defecto, nulos)
@classmethod
def string_variables(self, string, variables = None, por_defecto = None):
variables = [conjunto for conjunto in (
variables if isinstance(variables, (list, tuple)) else [variables]
) if isinstance(conjunto, dict)]
def callback(matches):
clave = matches.group(1)
for conjunto in variables:
if clave in conjunto:
return str(conjunto[clave])
return por_defecto if por_defecto != None else matches.group(0)
return self.re_string_variables.sub(callback, string)
def texto_por_defecto(self, por_defecto = None):
return str(por_defecto if isinstance(por_defecto, str) else self.configuracion("texto_por_defecto"))
def __coger_i18n(self, claves, por_defecto):
if not isinstance(claves, (list, tuple)):
claves = [claves]
claves = [clave.strip() for clave in claves if isinstance(clave, str)]
claves = [clave for i, clave in enumerate(claves) if clave not in claves[:i]]
if len(claves):
idiomas = [self.__idioma, self.__idioma_por_defecto] + list(self.__textos.keys())
for i, idioma in enumerate(idiomas):
if idioma and idioma not in idiomas[:i] and isinstance(idioma, str) and idioma in self.__textos:
for clave in claves:
if clave in self.__textos[idioma]:
return str(self.__textos[idioma][clave])
return claves[0]
return self.texto_por_defecto(por_defecto)
def i18n(self, claves, variables = None, por_defecto = None):
return self.string_variables(self.__coger_i18n(claves, por_defecto), variables, por_defecto)
def coger_tipo_terminal(self, tipo):
tipo = tipo.lower()
for conjunto in self.__tipos_terminal:
if tipo in conjunto:
return conjunto[0]
return conjunto[0][0]
def imprimir(self, tipo, mensaje, variables = None):
conjunto = {
**(
variables if isinstance(variables, dict) else
{clave : valor for conjunto in [
conjunto for conjunto in variables if isinstance(conjunto, dict)
] for clave, valor in conjunto.items()} if isinstance(variables, (list, tuple)) else
{}),
"tipo" : self.coger_tipo_terminal(tipo).upper(),
"tipo_crudo" : tipo,
"i18n" : mensaje
}
fecha = datetime.datetime.now()
for clave in ("year", "month", "day", "hour", "minute", "second"):
k = clave[0] if clave != "minute" else "i"
conjunto[clave] = getattr(fecha, clave)
conjunto[k] = conjunto[clave] / 100
conjunto[k + k] = ("00" + str(conjunto[k]))[-2:]
conjunto["yyyy"] = conjunto["year"]
conjunto["mensaje"] = self.i18n(mensaje, conjunto)
print(self.string_variables(self.__formato_terminal, conjunto))
@classmethod
def arreglar_path(self, path):
return self.re_arreglar_path.sub(self.__slash, path)
def coger_path_absoluto(self, path):
for path_raiz in self.__paths_raiz:
path_absoluto = self.arreglar_path(path_raiz + self.__slash + path)
if path_existe(path_absoluto):
return path_absoluto
return None
def leer_archivo(self, path):
path = self.coger_path_absoluto(path)
if path:
try:
with open(path, 'r') as archivo:
return archivo.read()
except Exception as excepcion:
pass
return None
def escribir_archivo(self, path, contenido):
try:
with open(path, 'w') as archivo:
archivo.write(contenido)
except Exception as excepcion:
pass
paises_mundo_continentes = PaisesMundoContinentes()