parent
bda3b199a7
commit
5412700a9d
@ -1,4 +1,5 @@ |
||||
[Ss]ecrets |
||||
Data |
||||
CaritasSantaCruz.Mapeate.apache2.conf |
||||
Public/data |
||||
Public/data |
||||
*[Ss]ecret*s* |
@ -0,0 +1,23 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="es"> |
||||
<head> |
||||
<title data-i18n="mapeate">Mapéate</title> |
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> |
||||
<meta charset="utf-8" /> |
||||
|
||||
<meta name="xdoc:author" content="leinosa,Yilber,KyMAN" /> |
||||
<meta name="xdoc:since" content="20240213" /> |
||||
<meta name="xdoc:version" content="20240312" /> |
||||
<meta name="xdoc:access" content="public" /> |
||||
|
||||
<script data-type="text/javascript" data-language="ECMAScript 2015" src="ecma/Mapeate.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script> |
||||
|
||||
<script data-type="text/javascript" data-language="ECMAScript 2015" charset="utf-8"> |
||||
|
||||
mapeate = new Mapeate(); |
||||
|
||||
</script> |
||||
|
||||
</head> |
||||
<body></body> |
||||
</html> |
@ -0,0 +1,405 @@ |
||||
Mapeate = function(entradas){ |
||||
|
||||
const self = this,
|
||||
configuracion_por_defecto = { |
||||
nulos : false,
|
||||
valor_por_defecto : null,
|
||||
autoiniciar : true,
|
||||
archivos_de_configuracion_por_defecto : [ |
||||
"/json/Mapeate.configuracion.json",
|
||||
"/json/Mapeate.configuracion.secretos.json" |
||||
],
|
||||
texto_por_defecto : "",
|
||||
configuracion_sobreescribir : false,
|
||||
i18n_sobreescribir : false,
|
||||
formato_terminal : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}",
|
||||
terminal_tipos_por_defecto : [ |
||||
["unkn", "unknown", "desconocido"],
|
||||
[" ok ", "ok", "si", "correcto"],
|
||||
["warn", "warning", "aviso", "advertencia"],
|
||||
["erro", "error", "incrrecto"],
|
||||
["fail", "failure", "fallo"],
|
||||
["exce", "excepcion"] |
||||
] |
||||
},
|
||||
configuracion = {},
|
||||
textos = {},
|
||||
terminal_tipos = []; |
||||
let iniciado = false,
|
||||
configuracion_sobreescribir = false,
|
||||
idioma_por_defecto = null,
|
||||
idioma = null,
|
||||
formato_terminal = "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}"; |
||||
|
||||
const constructor = () => { |
||||
|
||||
configuracion_por_defecto.terminal_tipos_por_defecto.forEach(entrada => terminal_tipos.push(entrada)); |
||||
|
||||
self.configuracion("autoiniciar") && self.iniciar(); |
||||
|
||||
}; |
||||
|
||||
const establecer_variables_comunes = () => { |
||||
|
||||
configuracion_sobreescribir = self.configuracion(["configuracion_sobreescribir", "sobreescribir"]); |
||||
formato_terminal = self.configuracion("formato_terminal"); |
||||
|
||||
} |
||||
|
||||
this.iniciar = callback => { |
||||
|
||||
const terminar = estado => typeof callback == "function" && terminar(estado); |
||||
|
||||
if(iniciado){ |
||||
terminar(false); |
||||
return false; |
||||
}; |
||||
iniciado = true; |
||||
|
||||
establecer_variables_comunes(); |
||||
|
||||
self.configuracion_anadir(self.configuracion("archivos_de_configuracion_por_defecto"), null, () => { |
||||
establecer_variables_comunes(); |
||||
self.configuracion_anadir(self.configuracion("archivos_de_configuracion"), null, () => { |
||||
establecer_variables_comunes(); |
||||
self.terminal_tipos_anadir(self.configuracion("terminal_tipos_por_defecto"), () => { |
||||
self.terminal_tipos_anadir(self.configuracion("terminal_tipos"), () => { |
||||
|
||||
i18n_sobreescribir = self.configuracion(["i18n_sobreescribir", "sobreescribir"]); |
||||
idioma_por_defecto = self.configuracion(["idioma_por_defecto", "idioma"]); |
||||
idioma = self.configuracion(["idioma", "idioma_por_defecto"]); |
||||
|
||||
self.i18n_anadir(self.configuracion("archivos_de_i18n_por_defecto"), null, () => { |
||||
self.i18n_anadir(self.configuracion("archivos_de_i18n"), null,() => { |
||||
|
||||
terminar(true); |
||||
console.log("PASA"); |
||||
|
||||
}); |
||||
});
|
||||
|
||||
}); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
return true; |
||||
}; |
||||
|
||||
this.nulos = nulos => typeof nulos != "boolean" ? self.configuracion("nulos", null, false, false) : nulos; |
||||
|
||||
this.valor_por_defecto = (valor_por_defecto, nulos) => ( |
||||
valor_por_defecto !== undefined && (self.nulos(nulos) || valor_por_defecto !== null) ? valor_por_defecto :
|
||||
self.configuracion("valor_por_defecto", null, null, true) |
||||
); |
||||
|
||||
this.coger_array_de_diccionarios = valor => valor && typeof valor == "object" ? valor instanceof Array ? valor : [valor] : []; |
||||
|
||||
this.coger_array_de_strings = valor => ( |
||||
valor && typeof valor == "object" && valor instanceof Array ? valor : [valor] |
||||
).filter(elemento => typeof elemento == "string" && elemento.trim()).map(elemento => elemento.trim()); |
||||
|
||||
this.configuracion = (claves, entradas, valor_por_defecto, nulos) => { |
||||
|
||||
const m = (claves = self.coger_array_de_strings(claves)).length; |
||||
|
||||
if(m){ |
||||
|
||||
const l = (entradas = [].concat( |
||||
self.coger_array_de_diccionarios(entradas),
|
||||
[entradas, configuracion, configuracion_por_defecto] |
||||
)).length; |
||||
|
||||
nulos = self.nulos(nulos); |
||||
|
||||
for(let i = 0; i < l; i ++) |
||||
if(entradas[i] && typeof entradas[i] == "object") |
||||
for(let j = 0; j < m; j ++) |
||||
if(entradas[i][claves[j]] !== undefined && (nulos || entradas[i][claves[j]] !== null)) |
||||
return entradas[i][claves[j]]; |
||||
}; |
||||
return self.valor_por_defecto(valor_por_defecto, nulos); |
||||
}; |
||||
|
||||
this.leer_archivo = (url, entradas) => { |
||||
|
||||
let terminado = false; |
||||
const ajax = new XMLHttpRequest(),
|
||||
callback = self.configuracion("callback",
|
||||
typeof entradas == "function" ? (entradas = {callback : entradas}) :
|
||||
entradas && typeof entradas == "object" ? entradas :
|
||||
{}),
|
||||
timeout = self.configuracion(["ajax_timeout", "timeout"], entradas),
|
||||
terminar = codigo => ( |
||||
!terminado &&
|
||||
(terminado = true) &&
|
||||
typeof callback == "function" &&
|
||||
callback(ajax.responseText, ajax.status, ajax.readyState, codigo) |
||||
),
|
||||
fecha = Date.now(); |
||||
|
||||
ajax.open("get", url, true); |
||||
ajax.timeout = timeout; |
||||
ajax.onreadystatechange = () => { |
||||
if(terminado) |
||||
return; |
||||
if(ajax.readyState == 4) |
||||
terminar( |
||||
(ajax.status >= 200 && ajax.status < 300) || [301, 302, 304].includes(ajax.status) ? "OK" :
|
||||
"HTTP_ERROR"); |
||||
else if(Date.now() - fecha > timeout) |
||||
terminar("TIMEOUT_FORZADO"); |
||||
}; |
||||
ajax.send(null); |
||||
|
||||
ajax.onabort = () => terminar("ABORTADO"); |
||||
ajax.onerror = () => terminar("ERROR"); |
||||
ajax.ontimeout = () => terminar("TIMEOUT"); |
||||
|
||||
return ajax; |
||||
}; |
||||
|
||||
const configuracion_anadir = (entradas, sobreescribir, callback, i) => { |
||||
|
||||
if(i >= entradas.length){ |
||||
callback(); |
||||
return; |
||||
}; |
||||
|
||||
const terminar = () => configuracion_anadir(entradas, sobreescribir, callback, i + 1); |
||||
|
||||
if(!entradas[i]){ |
||||
terminar(); |
||||
return; |
||||
}; |
||||
|
||||
if(typeof entradas[i] == "object"){ |
||||
if(entradas[i] instanceof Array) |
||||
configuracion_anadir(entradas[i], sobreescribir, terminar, 0); |
||||
else{ |
||||
for(const clave in entradas[i]) |
||||
if(sobreescribir || configuracion[clave] === undefined) |
||||
configuracion[clave] = entradas[i][clave]; |
||||
terminar(); |
||||
}; |
||||
}else if(typeof entradas[i] == "string"){ |
||||
if(!(entradas[i] = entradas[i].trim())){ |
||||
terminar(); |
||||
return; |
||||
}; |
||||
|
||||
let json; |
||||
|
||||
if(entradas[i].match(/^(\{(.|[\r\n])+\}|\[(.|[\r\n])+\])$/)){ |
||||
try{ |
||||
json = JSON.parse(entradas[i]); |
||||
}catch(excepcion){}; |
||||
if(json) |
||||
configuracion_anadir(json instanceof Array ? json : [json], sobreescribir, terminar, 0); |
||||
else
|
||||
terminar(); |
||||
}else
|
||||
self.leer_archivo(entradas[i], salida => { |
||||
try{ |
||||
json = JSON.parse(salida); |
||||
}catch(excepcion){}; |
||||
if(json) |
||||
configuracion_anadir(json instanceof Array ? json : [json], sobreescribir, terminar, 0); |
||||
else
|
||||
terminar(); |
||||
}); |
||||
}else
|
||||
terminar(); |
||||
|
||||
}; |
||||
|
||||
this.configuracion_anadir = (entradas, sobreescribir, callback) => configuracion_anadir( |
||||
entradas && typeof entradas == "object" && entradas instanceof Array ? entradas : [entradas],
|
||||
typeof sobreescribir == "boolean" ? sobreescribir : configuracion_sobreescribir,
|
||||
callback,
|
||||
0 |
||||
); |
||||
|
||||
this.string_variables = (string, variables, por_defecto) => { |
||||
|
||||
const l = (variables = self.coger_array_de_diccionarios(variables)).length; |
||||
|
||||
return (string || "" + string).replace(/\{([^\{\}]+)\}/g, (crudo, clave) => { |
||||
for(let i = 0; i < l; i ++) |
||||
if(variables[i][clave] !== undefined) |
||||
return variables[i][clave]; |
||||
return por_defecto === undefined ? crudo : por_defecto; |
||||
}); |
||||
}; |
||||
|
||||
const i18n = (claves, por_defecto) => { |
||||
|
||||
const m = (claves = self.coger_array_de_strings(claves)).length,
|
||||
idiomas = [idioma_por_defecto, idioma].concat(Object.keys(textos)),
|
||||
l = idiomas.length; |
||||
|
||||
for(let i = 0; i < l; i ++) |
||||
if(typeof idiomas[i] == "string" && textos[idiomas[i]]) |
||||
for(let j = 0; j < m; j ++) |
||||
if(idiomas[i][claves[j]] !== undefined) |
||||
return idiomas[i][claves[j]]; |
||||
return ( |
||||
por_defecto !== undefined ? por_defecto :
|
||||
m ? claves[0] :
|
||||
self.configuracion("texto_por_defecto")); |
||||
}; |
||||
|
||||
this.i18n = (claves, variables, por_defecto) => self.string_variables(i18n(claves, por_defecto), variables); |
||||
|
||||
const i18n_anadir = (entradas, sobreescribir, callback, i) => { |
||||
|
||||
if(i >= entradas.length){ |
||||
typeof callback == "function" && callback(); |
||||
return; |
||||
}; |
||||
|
||||
const terminar = () => i18n_anadir(entradas, sobreescribir, callback, i + 1); |
||||
|
||||
if(!entradas[i]){ |
||||
terminar(); |
||||
return; |
||||
}; |
||||
|
||||
if(typeof entradas[i] == "object"){ |
||||
if(entradas[i] instanceof Array) |
||||
i18n_anadir(entradas[i], sobreescribir, terminar, 0); |
||||
else{ |
||||
for(const lenguage in entradas[i]){ |
||||
textos[lenguage] === undefined && (textos[lenguage] = {}); |
||||
if(entradas[i][lenguage] && typeof entradas[i][lenguage] == "object") |
||||
for(const clave in entradas[i][lenguage]) |
||||
if(sobreescribir || textos[lenguage][clave] !== undefined) |
||||
textos[lenguage][clave] = entradas[i][lenguage][clave]; |
||||
}; |
||||
terminar(); |
||||
}; |
||||
}else if(typeof entradas[i] == "string"){ |
||||
if(!(entradas[i] = entradas[i].trim())){ |
||||
terminar(); |
||||
return;
|
||||
}; |
||||
|
||||
let json; |
||||
|
||||
if(entradas[i].match(/^(\{(.|[\r\n])+\}|\[(.|[\r\n])+\])$/)){ |
||||
try{ |
||||
json = JSON.parse(entradas[i]); |
||||
}catch(excepcion){}; |
||||
if(json) |
||||
i18n_anadir(json instanceof Array ? json : [json], sobreescribir, terminar, 0); |
||||
else
|
||||
terminar(); |
||||
}else
|
||||
self.leer_archivo(entradas[i], salida => { |
||||
try{ |
||||
json = JSON.parse(salida); |
||||
}catch(excepcion){}; |
||||
if(json) |
||||
i18n_anadir(json instanceof Array ? json : [json], sobreescribir, terminar, 0); |
||||
else
|
||||
terminar(); |
||||
}); |
||||
}else
|
||||
terminar(); |
||||
|
||||
}; |
||||
|
||||
this.i18n_anadir = (entradas, sobreescribir, callback) => i18n_anadir( |
||||
entradas && typeof entradas == "object" && entradas instanceof Array ? entradas : [entradas],
|
||||
typeof sobreescribir == "boolean" ? sobreescribir : i18n_sobreescribir,
|
||||
callback,
|
||||
0 |
||||
); |
||||
|
||||
const terminal_tipos_anadir = (entradas, callback, i, clave) => { |
||||
if(i > 10) |
||||
return; |
||||
|
||||
if(!entradas || i >= entradas.length){ |
||||
typeof callback == "function" && callback(); |
||||
return; |
||||
}; |
||||
|
||||
const terminar = () => terminal_tipos_anadir(entradas, callback, i + 1, clave); |
||||
|
||||
if(!entradas[i]){ |
||||
terminar(); |
||||
return; |
||||
}; |
||||
|
||||
if(typeof entradas[i] == "string"){ |
||||
if(/^[a-z0-9]+$/i.test(entradas[i])){ |
||||
if(clave === undefined && !terminal_tipos.some((tipos, j) => tipos.includes(entradas[i]) && !isNaN(clave = j))){ |
||||
clave = terminal_tipos.length; |
||||
terminal_tipos.push([entradas[i]]); |
||||
}else
|
||||
!terminal_tipos[clave].includes(entradas[i]) && terminal_tipos[clave].push(entradas[i]); |
||||
terminar(); |
||||
return; |
||||
}; |
||||
|
||||
let json; |
||||
|
||||
if(/^(\[(.|[\r\n])+\])$/.test(entradas[i])){ |
||||
try{ |
||||
json = JSON.parse(entradas[i]); |
||||
}catch(excepcion){}; |
||||
if(json) |
||||
terminal_tipos_anadir(json, terminar, 0, clave); |
||||
else
|
||||
terminar(); |
||||
}else
|
||||
self.leer_archivo(entradas[i], salida => { |
||||
try{ |
||||
json = JSON.parse(salida); |
||||
}catch(excepcion){}; |
||||
if(json) |
||||
terminal_tipos_anadir(json, terminar, 0, clave); |
||||
else
|
||||
terminar(); |
||||
}); |
||||
}else if(typeof entradas[i] == "object" && entradas[i] instanceof Array) |
||||
terminal_tipos_anadir(entradas[i], terminar, 0); |
||||
else
|
||||
terminar(); |
||||
|
||||
}; |
||||
|
||||
this.terminal_tipos_anadir = (entradas, callback) => terminal_tipos_anadir(entradas, callback, 0); |
||||
|
||||
this.print = (tipo, mensaje, variables) => { |
||||
|
||||
const fecha = new Date(),
|
||||
conjunto = { |
||||
tipo_crudo : tipo,
|
||||
tipo : tipo.upperCase().substring(0, 4),
|
||||
i18n : mensaje,
|
||||
...(typeof variables == "object" ? variables : {}) |
||||
}; |
||||
|
||||
["year", "month", "date", "hours", "minutes", "seconds"].forEach(clave => { |
||||
|
||||
const k = clave.substring(0, 1),
|
||||
valor = fecha["get" + (clave == "year" ? "FullYear" : k.toUpperCase() + clave.substring(1))](); |
||||
|
||||
conjunto[clave == "date" ? "day" : clave] = valor; |
||||
conjunto[k] = valor; |
||||
conjunto[k + k] = ("00" + valor).slice(-2); |
||||
|
||||
}); |
||||
conjunto["yyyy"] = conjunto["year"]; |
||||
|
||||
conjunto.mensaje = self.i18n(mensaje, conjunto); |
||||
|
||||
console.log(self.string_variables(formato_terminal, conjunto)); |
||||
|
||||
}; |
||||
|
||||
constructor(); |
||||
|
||||
}; |
@ -0,0 +1,21 @@ |
||||
{ |
||||
"nulos" : false, |
||||
"valor_por_defecto" : null, |
||||
"autoiniciar" : true, |
||||
"archivos_de_configuracion_por_defecto" : [ |
||||
"/json/Mapeate.configuracion.json", |
||||
"/json/Mapeate.configuracion.secretos.json" |
||||
], |
||||
"texto_por_defecto" : "", |
||||
"configuracion_sobreescribir" : false, |
||||
"i18n_sobreescribir" : false, |
||||
"formato_terminal" : "[{tipo}] {yyyy}{mm}{dd} {hh}{ii}{ss}: {mensaje}", |
||||
"terminal_tipos_por_defecto" : [ |
||||
["unkn", "unknown", "desconocido"], |
||||
[" ok ", "ok", "si", "correcto"], |
||||
["warn", "warning", "aviso", "advertencia"], |
||||
["erro", "error", "incrrecto"], |
||||
["fail", "failure", "fallo"], |
||||
["exce", "excepcion"] |
||||
] |
||||
} |
@ -0,0 +1,3 @@ |
||||
# Presentación |
||||
|
||||
Este documento explicará una idea básica de lo que se pretende con este proyecto |
Loading…
Reference in new issue