py|md|ecma: Resources in Applications enabled again. Fixed the autoload of Scripts and Styles files from AnPScriptsLoader and documented.

This commit is contained in:
KyMAN 2024-09-23 18:04:26 +02:00
parent d8baca9aca
commit a2d81e2ffa
6 changed files with 104 additions and 27 deletions

View File

@ -666,9 +666,9 @@
"anp_drivers_unix_domain_socket_web_server_start_permission_exception" : "Hubo una excepción en el servidor Socket de Dominio Unix '{key}' sobre '{path}' al intentar establecer los permisos del archivo común de posicionamiento en memoria.",
"anp_drivers_unix_domain_socket_web_server_start_exception" : "Hubo una excepción en el servidor Socket de Dominio Unix '{key}' sobre '{path}' al intentar iniciar el Socket de comunicaciones.",
"anp_drivers_unix_domain_socket_web_server_close_exception" : "Hubo una excepción al intentar cerrar el servidor Socket de Dominio Unix '{key}' sobre '{path}'.",
"anp_drivers_unix_domain_socket_web_server_send_exception" : "Hubo una excepción al intentar enviar {length} bytes ({bytes_sent} bytes con cabeceras) de datos al servidor Socket de Dominio Unix '{key}'.",
"anp_drivers_unix_domain_socket_web_server_send_error" : "Hubo un error con código '{code}' al intentar enviar {length} bytes ({bytes_sent} bytes con cabeceras) de datos al servidor Socket de Dominio Unix '{key}'.",
"anp_drivers_unix_domain_socket_web_server_send_ok" : "{length} bytes ({bytes_sent} bytes con cabeceras) de datos fueron enviados al servidor Socket de Dominio Unix '{key}' correctamente.",
"anp_drivers_unix_domain_socket_web_server_send_exception" : "Hubo una excepción al intentar enviar {length} bytes ({bytes_sent} bytes con cabeceras) de datos al servidor Socket de Dominio Unix '{key}' desde '{request}'.",
"anp_drivers_unix_domain_socket_web_server_send_error" : "Hubo un error con código '{code}' al intentar enviar {length} bytes ({bytes_sent} bytes con cabeceras) de datos al servidor Socket de Dominio Unix '{key}' desde '{request}'.",
"anp_drivers_unix_domain_socket_web_server_send_ok" : "{length} bytes ({bytes_sent} bytes con cabeceras) de datos fueron enviados al servidor Socket de Dominio Unix '{key}' desde '{request}' correctamente.",
"anp_drivers_unix_domain_socket_web_server_process_request_exception" : "Hubo una excepción al intentar procesar una petición de {length} bytes desde el servidor Socket de Dominio Unix '{key}'.",
"anp_drivers_unix_domain_socket_web_server_process_request_error" : "Hubo un error con código '{code}' al intentar procesar una petición de {length} bytes desde el servidor Socket de Dominio Unix '{key}'.",
"anp_drivers_unix_domain_socket_web_server_process_request_ok" : "Una petición de {length} bytes desde el servidor Socket de Dominio Unix '{key}' fue procesada correctamente.",

View File

@ -0,0 +1,46 @@
```wmd-options
language = es
title_i18n = anp_title_ecma_scripts_loader
title_text = AnPScriptsLoader.ecma.js - Documentación - AnP
```
<!-- [[wmd]] -->
#### [[!AnPScriptsLoader.emca.js]]
El **AnPScriptsLoader** es clase almacenada en la librería con el mismo nombre dentro de los Scripts ECAMScript/JavaScript que nos permite hacer una gestión controlada y dinámica de los recursos que queramos consumir para la aplicación que queremos desarrollar. Esta librería se basa en la creación dinámica de los elementos HTML que se encargan de la carga de Scripts y estilos CSS, SCRIPT y LINK consecutivamente. Una vez tiene todo cargado ejecuta el Callback que da inicio a la aplicación AnP.
Todo el proceso de carga de los ficheros viene siendo un proceso asíncrono gestionado mediante Callbacks, evitando que se bloquee el hilo de proceso del Script mediante la utilización de los eventos de las etiquetas HTML SCRIPT y LINK tanto de "onload" como "onerror".
##### Carga de Scripts
Los Scripts son elementos dependientes unos de otros por lo general por lo que se requiere una estructuración vertical en árbol para la carga de dichos ficheros. Un ejemplo de ésto puede ser la carga básica de las librerías dependientes de AnP:
1. Nivel 1
* [[!https://errorsmanager.k3y.pw/ecma/ErrorsManager.ecma.js]]
* [[!https://cdn.k3y.pw/data/scripts/Highlight.v11.10.0.min.js]]
* [[!https://wmarkdown.k3y.pw/ecma/WMarkDown.ecma.js]]
* [[!https://cdn.k3y.pw/data/scripts/Highlight.v11.10.0.min.js]]
* [[!https://cdn.k3y.pw/data/scripts/tex-mml-chtml.v3.2.2.js]]
* [[!https://cdn.k3y.pw/data/scripts/mermaid.v10.9.1.min.js]]
2. Nivel 2
* [[!/ecma/Application/AnP.ecma.js]]
3. Nivel 3
* [[!/ecma/Managers/Settings.ecma.js]]
* [[!/ecma/Application/URI.ecma.js]]
* [[!/ecma/Managers/Globals.ecma.js]]
* [[!/ecma/Managers/I18N.ecma.js]]
* [[!/ecma/Managers/PrintTypes.ecma.js]]
* [[!/ecma/Managers/Threads.ecma.js]]
* [[!/ecma/Application/Attributes.ecma.js]]
* [[!/ecma/Application/HTMLPreload.ecma.js]]
4. Nivel 4
* [[!/ecma/Components/Base.ecma.js]]
Esto significa que hasta que no se carguen todos los ficheros del Nivel 1 no se empezará la carga de los ficheros del Nivel 2 por las posibles dependencias que éstos puedan tener sobre los del Nivel 1, y así sucesivamente, cargándose el último fichero del Nivel 4 una vez estén cargados los anteriores.
##### Carga de estilos
* *Explicar la carga de los estilos.*
<!-- [[wmd]] -->

View File

@ -13,10 +13,12 @@
const AnPScriptsLoader = function(inputs, callback){
"use strict";
/** @type {ScriptsLoader} */
/** @type {AnPScriptsLoader} */
const self = this,
/** @type {Array.<number>} */
error = [0, 0, 0];
error = [0, 0, 0],
/** @type {Object.<string, number>} */
file_tryies = {};
/**
* @returns {void}
@ -31,7 +33,12 @@ const AnPScriptsLoader = function(inputs, callback){
else if(typeof inputs != "object")
inputs = {allow_print : true};
inputs.allow_print === undefined && (inputs.allow_print = true)
[
["allow_print", true],
["maximum_tryes", 5],
["scripts", []],
["styles", []]
].forEach(([key, value]) => inputs[key] === undefined && (inputs[key] = value));
AnPScriptsLoader.prototype.SCRIPTS = [[
@ -59,8 +66,6 @@ const AnPScriptsLoader = function(inputs, callback){
"Managers/Globals",
].map(script => domain + "/ecma/" + script + ".ecma.js");
["scripts", "styles"].forEach(key => inputs[key] || (inputs[key] = []));
inputs.scripts.unshift([
domain + "/ecma/Application/AnP.ecma.js"
]);
@ -95,14 +100,16 @@ const AnPScriptsLoader = function(inputs, callback){
break;
case "wmarkdown":
break;
}
};
};
if(inputs.scripts || inputs.styles)
self.load(inputs, callback);
else
self.execute(callback);
// if(inputs.scripts || inputs.styles)
// self.load(inputs, callback);
// else
// self.execute(callback);
};
@ -187,10 +194,26 @@ const AnPScriptsLoader = function(inputs, callback){
return error;
};
/**º
* @param {!(HTMLScriptElement|HTMLLinkElement)} item
* @param {!string} file
* @param {!default_callback} callback
* @param {!default_callback} end
* @returns {void}
* @access private
*/
const check_tryes = (item, file, callback, end) => {
if((file_tryies[file] = (file_tryies[file] || 0) + 1) < inputs.maximum_tryes){
item.remove();
callback();
}else
end();
};
/**
* @param {!Array.<Array.<string>>} scripts
* @param {!number} i
* @param {default_callback} callback
* @param {default_callback} [callback]
* @returns {void}
* @access private
*/
@ -228,7 +251,9 @@ const AnPScriptsLoader = function(inputs, callback){
script_item.setAttribute("src", script);
script_item.setAttribute("data-crossorigin", "anonymous");
script_item.setAttribute("charset", "utf-8");
script_item.onerror = () => file_processed(script_item, "error", script, end);
script_item.onerror = () => file_processed(script_item, "error", script, () => check_tryes(
script_item, script, () => load_scripts([[script]], 0, end), end
));
script_item.onload = () => file_processed(script_item, "ok", script, end);
});
@ -238,7 +263,7 @@ const AnPScriptsLoader = function(inputs, callback){
/**
* @param {!Array.<string>} scripts
* @param {default_callback} callback
* @param {default_callback} [callback]
* @returns {void}
* @access private
*/
@ -290,7 +315,9 @@ const AnPScriptsLoader = function(inputs, callback){
style_item.setAttribute("charset", "utf-8");
if("onload" in style_item){
style_item.onerror = () => file_processed(style_item, "error", style, end);
style_item.onerror = () => file_processed(style_item, "error", style, () => check_tryes(
style_item, style, () => load_scripts([style], end), end
));
style_item.onload = () => file_processed(style_item, "ok", style, end);
}else{
show_file_status("unknown", style);

View File

@ -171,7 +171,7 @@ class ApplicationsAbstract(CommonAbstract):
def _build(self, callback:Optional[Callable[[], None]] = None) -> None:
self._removing = False
self.__set_basics()
# self.resources = {}
self.resources = {}
self.anp.execute(callback)
def update_settings(self) -> None:
@ -281,11 +281,11 @@ class ApplicationsAbstract(CommonAbstract):
}
})
# for key in ("default_resources", "resources"):
# if not self.anp.settings.get(self.key + "_" + key, self.__inputs):
# pass
# for subkey in []:
# self.resources[subkey] = self.anp.settings.get(self.key + "_" + subkey)
for key in ("default_resources", "resources"):
if not self.anp.settings.get(self.key + "_" + key, self.__inputs):
pass
for subkey in []:
self.resources[subkey] = self.anp.settings.get(self.key + "_" + subkey)
self.update_views()
self.update_routes()

View File

@ -169,8 +169,9 @@ class UnixDomainSocketWebServer(ConnectionsAbstract):
0), 6)
if not self.anp.errors.has(error):
bytes_sent = len(response)
try:
bytes_sent = client.sendall(response)
client.sendall(response)
except IOError as exception:
pass
except Exception as exception:
@ -197,7 +198,8 @@ class UnixDomainSocketWebServer(ConnectionsAbstract):
"length" : 0,
**self._print_data,
**(response_data.get_json() if response_data else {}),
"bytes_sent" : bytes_sent
"bytes_sent" : bytes_sent,
"request" : headers["request"] if "request" in headers else None
},
(show_errors if has_show_errors else self.__show_send_error) and "anp_drivers_unix_domain_socket_web_server_send_error",
(show_errors if has_show_errors else True) and self.__show_send_ok and "anp_drivers_unix_domain_socket_web_server_send_ok"
@ -225,6 +227,7 @@ class UnixDomainSocketWebServer(ConnectionsAbstract):
break
request = HTTPRequestModel(self.anp, client, data)
request.headers["host"] + request.uri_path == "anp.local/" and print("")
if self.anp.errors.has(request.error):
error = self.anp.errors.set(error, 1, 1)
@ -243,7 +246,8 @@ class UnixDomainSocketWebServer(ConnectionsAbstract):
1 << 3 if self.anp.errors.has(self.send(client, response.data, {
**({"mime" : response.mime} if response.mime else {}),
**({"last_modified" : self.format_date(response.date)} if response.date else {}),
"domain" : "local" if request.headers["host"].split(".")[-1] in ("local", "anprm") else "k3y.pw"
"domain" : "local" if request.headers["host"].split(".")[-1] in ("local", "anprm") else "k3y.pw",
"request" : (str(request.headers["host"]) if "host" in request.headers else "") + str(request.uri_path)
})) else
0), 3)

View File

@ -1 +1 @@
0.3.0.1
0.3.0.2