From 5412700a9d54d8792ac6bbfe8393cbfbb9707399 Mon Sep 17 00:00:00 2001
From: KyMAN <0kyman0@gmail.com>
Date: Tue, 12 Mar 2024 17:14:59 +0100
Subject: [PATCH] #wip(ecma): Iniciado el proyecto ECMA.
---
.gitignore | 3 +-
Public/app.html | 23 ++
Public/ecma/Mapeate.ecma.js | 405 +++++++++++++++++++++++++
Public/index.html | 5 +
Public/json/Mapeate.configuracion.json | 21 ++
README.md | 7 +-
doc/presentacion.md | 3 +
7 files changed, 464 insertions(+), 3 deletions(-)
create mode 100644 Public/app.html
create mode 100644 Public/ecma/Mapeate.ecma.js
create mode 100644 Public/json/Mapeate.configuracion.json
create mode 100644 doc/presentacion.md
diff --git a/.gitignore b/.gitignore
index 4dfb623..0e66139 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
[Ss]ecrets
Data
CaritasSantaCruz.Mapeate.apache2.conf
-Public/data
\ No newline at end of file
+Public/data
+*[Ss]ecret*s*
\ No newline at end of file
diff --git a/Public/app.html b/Public/app.html
new file mode 100644
index 0000000..5eb3d5a
--- /dev/null
+++ b/Public/app.html
@@ -0,0 +1,23 @@
+
+
+
+ Mapéate
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Public/ecma/Mapeate.ecma.js b/Public/ecma/Mapeate.ecma.js
new file mode 100644
index 0000000..7d3ca03
--- /dev/null
+++ b/Public/ecma/Mapeate.ecma.js
@@ -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();
+
+};
\ No newline at end of file
diff --git a/Public/index.html b/Public/index.html
index 87195f3..ae2a4bf 100644
--- a/Public/index.html
+++ b/Public/index.html
@@ -112,6 +112,10 @@
Mapeate
+
+
+ Mapeate
+
Git
@@ -139,6 +143,7 @@
En construcción...
Actualmente, este proyecto se encuentra en construcción. Os invitamos a seguir el desarrollo de dicho proyecto mediante los siguientes Links:
+ - https://mapeate.k3y.pw/app.html (Aplicación Web)
- https://mapeate.k3y.pw/
diff --git a/Public/json/Mapeate.configuracion.json b/Public/json/Mapeate.configuracion.json
new file mode 100644
index 0000000..16df9c8
--- /dev/null
+++ b/Public/json/Mapeate.configuracion.json
@@ -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"]
+ ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index fb9b46d..3b08770 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/doc/presentacion.md b/doc/presentacion.md
new file mode 100644
index 0000000..e3de8b5
--- /dev/null
+++ b/doc/presentacion.md
@@ -0,0 +1,3 @@
+# Presentación
+
+Este documento explicará una idea básica de lo que se pretende con este proyecto
\ No newline at end of file