#wip(ecma): Desarrollando la base de trabajo ECMA.

This commit is contained in:
KyMAN 2024-03-14 16:39:51 +01:00
parent 5412700a9d
commit a7e967ce1e
5 changed files with 134 additions and 22 deletions

2
.gitignore vendored
View File

@ -1,5 +1,5 @@
[Ss]ecrets [Ss]ecrets
Data Data
CaritasSantaCruz.Mapeate.apache2.conf *.apache2.conf
Public/data Public/data
*[Ss]ecret*s* *[Ss]ecret*s*

View File

@ -12,15 +12,21 @@ Mapeate = function(entradas){
texto_por_defecto : "", texto_por_defecto : "",
configuracion_sobreescribir : false, configuracion_sobreescribir : false,
i18n_sobreescribir : false, i18n_sobreescribir : false,
formato_terminal : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}", formato_terminal : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{linea}]{archivo}({metodo}): {mensaje}",
terminal_tipos_por_defecto : [ terminal_tipos_por_defecto : [
["unkn", "unknown", "desconocido"], ["unkn", "unknown", "desconocido"],
[" ok ", "ok", "si", "correcto"], [" ok ", "ok", "si", "correcto"],
["info", "informacion", "information"],
["note", "nota", "comment", "comentario"],
["warn", "warning", "aviso", "advertencia"], ["warn", "warning", "aviso", "advertencia"],
["erro", "error", "incrrecto"], ["erro", "error", "incrrecto"],
["fail", "failure", "fallo"], ["fail", "failure", "fallo"],
["exce", "excepcion"] ["exce", "excepcion"]
] ],
archivos_de_i18n_por_defecto : [
"/json/i18n/Mapeate.i18n.espanol.json"
],
ajax_timeout : 2000
}, },
configuracion = {}, configuracion = {},
textos = {}, textos = {},
@ -29,13 +35,29 @@ Mapeate = function(entradas){
configuracion_sobreescribir = false, configuracion_sobreescribir = false,
idioma_por_defecto = null, idioma_por_defecto = null,
idioma = null, idioma = null,
formato_terminal = "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}"; modo_dispositivo = "por_defecto",
modo_gui = "por_defecto",
terminal_unkn_oscuro, terminal_unkn_claro,
terminal_ok_oscuro, terminal_ok_claro,
terminal_info_oscuro, terminal_info_claro,
terminal_note_oscuro, terminal_note_claro,
modo_gui_oscuro = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches,
formato_terminal = "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{linea}]{archivo}({metodo}): {mensaje}";
const re_bloque_de_traza = new RegExp("^(" + [
/\s*at\s+(([^\s]+)\s+\()?(([^\(\)\:]+\:)?[^\(\)\:]+)(\:([0-9]+)\:[0-9]+)?\)?/.source, // Webkit
/([^\@]+)\@([^:]+\:[^\:]+)\:([0-9]+)\:[0-9]+/.source, // Gecko
].join("|") + ")$")
const constructor = () => { const constructor = () => {
configuracion_por_defecto.terminal_tipos_por_defecto.forEach(entrada => terminal_tipos.push(entrada)); configuracion_por_defecto.terminal_tipos_por_defecto.forEach(entrada => terminal_tipos.push(entrada));
self.configuracion("autoiniciar") && self.iniciar(); self.print("info", "mapeate_construyendose");
self.configuracion("autoiniciar") && self.iniciar(() => {
self.print("ok", "mapeate_construido");
});
}; };
@ -44,11 +66,20 @@ Mapeate = function(entradas){
configuracion_sobreescribir = self.configuracion(["configuracion_sobreescribir", "sobreescribir"]); configuracion_sobreescribir = self.configuracion(["configuracion_sobreescribir", "sobreescribir"]);
formato_terminal = self.configuracion("formato_terminal"); formato_terminal = self.configuracion("formato_terminal");
} terminal_unkn_oscuro = self.configuracion("terminal_unkn_oscuro");
terminal_unkn_claro = self.configuracion("terminal_ounkn_claro");
terminal_ok_oscuro = self.configuracion("terminal_ok_oscuro");
terminal_ok_claro = self.configuracion("terminal_ok_claro");
terminal_info_oscuro = self.configuracion("terminal_info_oscuro");
terminal_info_claro = self.configuracion("terminal_info_claro");
terminal_note_oscuro = self.configuracion("terminal_note_oscuro");
terminal_note_claro = self.configuracion("terminal_note_claro");
};
this.iniciar = callback => { this.iniciar = callback => {
const terminar = estado => typeof callback == "function" && terminar(estado); const terminar = estado => typeof callback == "function" && callback(estado);
if(iniciado){ if(iniciado){
terminar(false); terminar(false);
@ -241,8 +272,8 @@ Mapeate = function(entradas){
for(let i = 0; i < l; i ++) for(let i = 0; i < l; i ++)
if(typeof idiomas[i] == "string" && textos[idiomas[i]]) if(typeof idiomas[i] == "string" && textos[idiomas[i]])
for(let j = 0; j < m; j ++) for(let j = 0; j < m; j ++)
if(idiomas[i][claves[j]] !== undefined) if(textos[idiomas[i]][claves[j]] !== undefined)
return idiomas[i][claves[j]]; return textos[idiomas[i]][claves[j]];
return ( return (
por_defecto !== undefined ? por_defecto : por_defecto !== undefined ? por_defecto :
m ? claves[0] : m ? claves[0] :
@ -273,7 +304,7 @@ Mapeate = function(entradas){
textos[lenguage] === undefined && (textos[lenguage] = {}); textos[lenguage] === undefined && (textos[lenguage] = {});
if(entradas[i][lenguage] && typeof entradas[i][lenguage] == "object") if(entradas[i][lenguage] && typeof entradas[i][lenguage] == "object")
for(const clave in entradas[i][lenguage]) for(const clave in entradas[i][lenguage])
if(sobreescribir || textos[lenguage][clave] !== undefined) if(sobreescribir || textos[lenguage][clave] === undefined)
textos[lenguage][clave] = entradas[i][lenguage][clave]; textos[lenguage][clave] = entradas[i][lenguage][clave];
}; };
terminar(); terminar();
@ -333,7 +364,7 @@ Mapeate = function(entradas){
}; };
if(typeof entradas[i] == "string"){ if(typeof entradas[i] == "string"){
if(/^[a-z0-9]+$/i.test(entradas[i])){ if(/^ *[a-z0-9]+ *$/i.test(entradas[i])){
if(clave === undefined && !terminal_tipos.some((tipos, j) => tipos.includes(entradas[i]) && !isNaN(clave = j))){ if(clave === undefined && !terminal_tipos.some((tipos, j) => tipos.includes(entradas[i]) && !isNaN(clave = j))){
clave = terminal_tipos.length; clave = terminal_tipos.length;
terminal_tipos.push([entradas[i]]); terminal_tipos.push([entradas[i]]);
@ -370,25 +401,63 @@ Mapeate = function(entradas){
}; };
this.es_dispositivo_movil = () => modo_dispositivo == "movil" || (modo_dispositivo != "escritorio" && es_movil);
this.modo_gui_oscuro = () => modo_gui == "oscuro" || (modo_gui != "claro" && modo_gui_oscuro);
this.terminal_tipos_anadir = (entradas, callback) => terminal_tipos_anadir(entradas, callback, 0); this.terminal_tipos_anadir = (entradas, callback) => terminal_tipos_anadir(entradas, callback, 0);
this.print = (tipo, mensaje, variables) => { this.coger_id_tipo_terminal = tipo => {
const l = terminal_tipos.length;
if(typeof tipo == "string" && (tipo = tipo.trim().toLowerCase()))
for(let i = 0; i < l; i ++)
if(terminal_tipos[i].includes(tipo))
return i;
return 0;
};
this.coger_tipo_terminal = tipo => terminal_tipos[self.coger_id_tipo_terminal(tipo)][0].toUpperCase();
this.coger_traza = i => (new Error()).stack.replace(/^Error\s*?[\r\n]+/, "").trim().split(/[\r\n]+/).slice(1 + (i || 0)).map(linea => {
const matches = linea.match(re_bloque_de_traza);
return matches ? {
archivo : matches[4] || matches[9],
metodo : matches[3] || matches[8] || "",
linea : Number(matches[7] || matches[10])
} : null;
});
this.print = (tipo, mensaje, variables, i) => {
const fecha = new Date(), const fecha = new Date(),
conjunto = { conjunto = {
tipo_crudo : tipo, tipo_crudo : tipo,
tipo : tipo.upperCase().substring(0, 4), tipo : self.coger_tipo_terminal(tipo),
i18n : mensaje, i18n : mensaje,
...(typeof variables == "object" ? variables : {}) ...(typeof variables == "object" ? variables : {}),
}; ...(self.coger_traza((isNaN(i) ? 1 : i) + 1) || {
linea : -1,
metodo : "UNKNOWN",
archivo : "UNKNOWN"
})
},
clave_tipo = conjunto.tipo.trim().toLowerCase();
let mensaje_procesado;
conjunto.line = conjunto.linea;
conjunto.method = conjunto.metodo;
conjunto.file = conjunto.archivo;
["year", "month", "date", "hours", "minutes", "seconds"].forEach(clave => { ["year", "month", "date", "hours", "minutes", "seconds"].forEach(clave => {
const k = clave.substring(0, 1), let k = clave.substring(0, 1);
valor = fecha["get" + (clave == "year" ? "FullYear" : k.toUpperCase() + clave.substring(1))](); const valor = fecha["get" + (clave == "year" ? "FullYear" : k.toUpperCase() + clave.substring(1))]();
conjunto[clave == "date" ? "day" : clave] = valor; conjunto[clave == "date" ? "day" : clave] = valor;
conjunto[k] = valor; conjunto[clave == "minutes" ? k = "i" : k] = valor;
conjunto[k + k] = ("00" + valor).slice(-2); conjunto[k + k] = ("00" + valor).slice(-2);
}); });
@ -396,7 +465,33 @@ Mapeate = function(entradas){
conjunto.mensaje = self.i18n(mensaje, conjunto); conjunto.mensaje = self.i18n(mensaje, conjunto);
console.log(self.string_variables(formato_terminal, conjunto)); mensaje_procesado = self.string_variables(formato_terminal, conjunto);
console.log(conjunto);
switch(conjunto.tipo){
case " OK ":
console.log("%c" + mensaje_procesado, self.modo_gui_oscuro() ? terminal_ok_oscuro : terminal_ok_claro);
break;
case "INFO":
console.log("%c" + mensaje_procesado, self.modo_gui_oscuro() ? terminal_info_oscuro : terminal_info_claro);
break;
case "UNKN":
console.log("%c" + mensaje_procesado, self.modo_gui_oscuro() ? terminal_note_oscuro : terminal_note_claro);
break;
case "ERRO":
case "FAIL":
case "EXCE":
console.error(mensaje_procesado);
break;
case "WARN":
console.warn(mensaje_procesado);
break;
case "UNKN":
default:
console.log("%c" + mensaje_procesado, self.modo_gui_oscuro() ? terminal_unkn_oscuro : terminal_unkn_claro);
break;
};
}; };

View File

@ -9,7 +9,7 @@
"texto_por_defecto" : "", "texto_por_defecto" : "",
"configuracion_sobreescribir" : false, "configuracion_sobreescribir" : false,
"i18n_sobreescribir" : false, "i18n_sobreescribir" : false,
"formato_terminal" : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}", "formato_terminal" : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{linea}]{archivo}({metodo}): {mensaje}",
"terminal_tipos_por_defecto" : [ "terminal_tipos_por_defecto" : [
["unkn", "unknown", "desconocido"], ["unkn", "unknown", "desconocido"],
[" ok ", "ok", "si", "correcto"], [" ok ", "ok", "si", "correcto"],
@ -17,5 +17,9 @@
["erro", "error", "incrrecto"], ["erro", "error", "incrrecto"],
["fail", "failure", "fallo"], ["fail", "failure", "fallo"],
["exce", "excepcion"] ["exce", "excepcion"]
] ],
"archivos_de_i18n_por_defecto" : [
"/json/i18n/Mapeate.i18n.espanol.json"
],
"ajax_timeout" : 2000
} }

View File

@ -0,0 +1,13 @@
{
"espanol" : {
"Mapeate_comun_empezar" : null,
"Mapeate_comun_terminar" : null,
"Mapeate_empezar" : null,
"mapeate_construyendose" : "La aplicación 'Mapeate' se está constryendo...",
"mapeate_construido" : "La aplicación 'Mapeate' se construyó completamente.",
"Mapeate_terminar" : null
}
}

View File

@ -46,7 +46,7 @@
build_map(ajax.responseText); build_map(ajax.responseText);
}; };
ajax.open("get", "/data/World Map.svg", true); ajax.open("get", "../data/World Map.svg", true);
ajax.timeout = 2000; ajax.timeout = 2000;
ajax.onreadystatechange = () => { ajax.onreadystatechange = () => {
if(ended) if(ended)