#wip(ecma): Iniciado el proyecto ECMA.

main
KyMAN 2 months ago
parent bda3b199a7
commit 5412700a9d
  1. 3
      .gitignore
  2. 23
      Public/app.html
  3. 405
      Public/ecma/Mapeate.ecma.js
  4. 5
      Public/index.html
  5. 21
      Public/json/Mapeate.configuracion.json
  6. 7
      README.md
  7. 3
      doc/presentacion.md

3
.gitignore vendored

@ -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();
};

@ -112,6 +112,10 @@
<span data-icon="mapeate"></span>
<span data-i18n="mapeate">Mapeate</span>
</a></li>
<li data-i18n="web_app_oficial" title="Mapeate - Aplicación Web oficial" data-i18n-without="true"><a href="https://mapeate.k3y.pw/app.html" target="_self">
<span data-icon="mapeate"></span>
<span data-i18n="mapeate">Mapeate</span>
</a></li>
<li data-i18n="mapeate_git" title="Mapeate - Git" data-i18n-without="true"><a href="https://git.k3y.pw/CaritasSantaCruz/Mapeate" target="_blank">
<span data-icon="git"></span>
<span data-i18n="git">Git</span>
@ -139,6 +143,7 @@
<h2 data-i18n="en_construccion">En construcción...</h2>
<p data-i18n="en_construcion_text">Actualmente, este proyecto se encuentra en construcción. Os invitamos a seguir el desarrollo de dicho proyecto mediante los siguientes Links:</p>
<ul>
<li data-i18n="web_app" title="Aplicación Web" data-i18n-without="true"><a href="app.html" target="_self">https://mapeate.k3y.pw/app.html (Aplicación Web)</a></li>
<li data-i18n="git" title="Git" data-i18n-without="true"><a href="https://mapeate.k3y.pw/" target="_blank">https://mapeate.k3y.pw/</a><ul>
<li data-i18n="test_mapas" title="Pruebas de mapas SVG" data-i18n-without="true"><a href="https://mapeate.local/tests/mapa.test.html">https://mapeate.local/tests/mapa.test.html</a></li>
</ul></li>

@ -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"]
]
}

@ -4,9 +4,12 @@
## Idea
Este proyecto pretende ser un proyecto de un juego de geografía para aprender países, capitales, provincias, condados, etc. Vía Web en HTML5, ECMAScript 2015 y SASS/CSS. Este proyecto se basa en otro proyecto ya existente en SWF (Proyecto Flash) de la Universidad de Navarra, creo. El problema es que actualmente, las aplicaciones Flash en SWF están obsoletas por lo que ya no se puede hacer uso de éstas de una forma adecuada, incluso con el uso de Ruffle u otros emuladores o alternativas al Flash Player, eso sin mencionar con las fallas de seguridad ante este tipo de ficheros.
Este proyecto pretende ser un proyecto de un juego de geografía para aprender países, capitales, provincias, condados, etc. Vía Web en HTML5, ECMAScript 2015 y SASS/CSS. Este proyecto se basa en otro proyecto ya existente en SWF (Proyecto Flash) de MEC (antiguo Ministerio de Educación y Cultura) el cual ya no es accesible. El problema es que actualmente, las aplicaciones Flash en SWF están obsoletas por lo que ya no se puede hacer uso de éstas de una forma adecuada, incluso con el uso de Ruffle u otros emuladores o alternativas al Flash Player, eso sin mencionar con las fallas de seguridad ante este tipo de ficheros.
> Hay que intentar localizar el proyecto original pues creo que auinque tengan licencia MIT, estaría muy guay nombrar el proyecto del cual se basa éste.
> KyMAN: Al principio pensé que era de la Universidad de Navarra pero me equivoqué, lo hizo una persona llamada Enrique Alonso en memoria de su hija Margarita Alonso Porta, quien ayudó en el diseño y falleció en 2012. Más información en los enlaces cacheados del Wayback Machine de archive.org. La visualización del contenido puede ser ofrecida parcialmente mediante Ruffle.
- http://serbal.pntic.mec.es/ealg0027/mapasflash.htm
- https://web.archive.org/web/20161119001253/http://serbal.pntic.mec.es/ealg0027/mapasflash.htm
## Primeros pasos

@ -0,0 +1,3 @@
# Presentación
Este documento explicará una idea básica de lo que se pretende con este proyecto
Loading…
Cancel
Save