AnP

El proyecto AnP es un proyecto de tipo Framework desarrollado por KyMAN orientado a cubrir no sólo las acciones y/o variables comunes en los proyectos de dicho desarrollador, sino también unificar en un conjunto de librerías y herramientas que faciliten el desarrollo cara proyectos Web o Core en base a la filosofía de desarrollo del propio KyMAN. Este proyecto complementará a nivel técnico, gran parte de los proyectos del mismo, compartiendo con la comunidad dicho Framework para su uso libre pues lo que le importa a KyMAN son sus proyectos personales/profesionales y no las herrmientas que se utilizan para llevar a cabo dicho fin.

El proyecto podríamos decir que se divide en varias partes independientemente del nivel del lenguaje donde se encuentre, entendiéndose como tal el lenguaje mismo pues éste se divide en lenguajes de desarrollo según el ámbito que se trate. Los niveles serían los siguientes:

  • Común: Sería una única librería común para todos la cual gestionaría la base del Framework. Por sí misma sólo podría funcionar como elementos estáticos y comunes a todos, pero a nivel de objeto, requeriría de al menos el siguiente nivel.
  • Librerías de elementos básicos: Este nivel comprende la base de funcionamiento la cual sería la gestión de eventos, configuraciones, I18N, hilos de proceso, precargas, etc. Todas ellas dependerán del nivel común plenamente, y entre ellas.
  • Bloques específicos: Este nivel contendría elementos gestión específico, que se podrían subdividir según necesidades pero inicialmente integraría lo que vendría siendo el Framework.

El Framwork AnP está diseñado para trabajar a distintos niveles de aplicación, cada uno de ellos con su lenguaje propio pero todos intentando prevalecer en la estructura general.

La filosofía de trabajo sería sobre un entorno Web para un GUI el cual usaría como Front End JavaScript Post-procesado o programado de forma cruda sobre el navegador y el cual se comunicaría con el servidor de forma asíncrona; el servidor podría tener múltiples lenguajes a elección del desarrollador sobre los lenguajes que KyMAN deje a disposición; y finalmente, la sección de datos, orientado única y exclusivamente para los SQL y otras gestiones rápidas de memoria, sea volátil o fija.

Esta filosofía no quita que puedan existir aplicaciones únicamente cliente sólo con Front End con una pequeña base para lanzar el servidor; o que sea 100% Core, ya sea como servicio de servidor como de servicio externo u otros fines.

Manual

Este proyecto es extremadamente grande y laborioso, por lo que el propio manual se dividirá tal como se dividiría un proyecto gestionado con el mismo Framework: por lenguajes que representan a su vez, los niveles del desarrollo.

Comandos

Se entiende como comandos, en este caso, como órdenes y/o instrucciones que se le pueden dar a la aplicación AnP lanzada, de esta forma poder interactuar en con éste en caliente.

Los comandos que se pueden ejecutar en AnP van orientados a fines distintos, dependiendo de a qué hacemos referencia. Para entender el funcionamiento general de los comandos de AnP, nos encontramos que éstos se basan en el funcionamiento JSON principalmente, donde tenemos dos conjuntos de entradas distintos principales:

  • Array, vector o lista: Aquí se ordenan por posición dentro de una lista. Cada puesto es un valor de entrada distinto. A estos elementos se les llama parámetros internamente dentro del comando.
  • Diccionario: Aquí se identifican por claves en formato String. Estos elementos se les llama en su conjunto atributos.
El orden de los parámetros sí afecta a lo que se quiere ordenar; mientras que los atributos, al basarse en claves no ordenadas, no afecta en absoluto.

De primeras, todo valor dado se identifica como un simple String y son los propios espacios en blanco, tabuladores y/o saltos de línea los que irán separando los distintos valores. Cuando queremos que un parámetro o atributo tenga espacios éste ha de ir encapsulado entre comillas simples o dobles, independientemente, para indicar al intérprete que se está dando un parámetro o atributo complejo y que busque el cierre de comilla. Las comillas se pueden escapar mediante el Slash, lo mismo que el propio Slash puede escaparse a sí mismo. Se entiende que cualquier Slash dentro de un parámetro o atributo encapsulado entre comillas será un caracter escapado.

Para identificar un elemento de diccionario simplemente hemos de poner una clave la cual sea un String que sólo puede contener dígitos, cualquier letra del alfabeto inglés y guiones bajos; todo ello acompañado, sin espacios, de un signo igual que lo separe del contenido al que se quiere que haga referencia. El contenido, si no se le especifica éste será un String vacío.

Los comandos se basan en un método o función a ejecutar a partir de un mapeado que estructura y define dichos comandos. El trabajo con dichos métodos o funciones se basa en llamarlos enviándoles, en este orden, los parámetros y luego los atributos, tal como se representa a continuación:

command_method
voidglobalpubliccommand_methodNullishArray<Any|null>parametersnullNullishDictionary<String, Any|null>attributesnullnull
NameRequiredNullableTypedDefault Value
parametersFalseTrueArray<Any|null>null
attributesFalseTrueDictionary<String, Any|null>null
NameRequiredNullableTypedDefault Value

Por otro lado, tenemos los atributos para órdenes especiales, los cuales se identifican por ser iniciados por uno o dos guiones medios en su nombre o clave. Esto permite hacer ejecución de un segundo método o función asignado al comando para disgregar funciones, acciones, etc. Dentro del mismo comando u orden.

Añadir

Para añadir comandos hemos de hacer uso del método anp.terminarl.add el cual nos permite añadir, e incluso sobreescribir si dicho comando ya existe, a la lista de comandos generales del propio AnP. La sintaxis para añadir comandos se basa en JSON y viene siendo un diccionario cuya llave implica el como nombrar a ese comando a la hora de ser escrito en la Terminal o Consola de COMANDOS cuyo valor es otro diccionario anidado con las siguientes claves de entrada:

  • synonyms (Optional) [Array[String]|String]: Palabras clave las cuales son equivalentes dentro de la Terminal o Consola de COMANDOS, como puede ser el caso de echo y print para imprimir por pantalla un texto dado. También se utiliza mucho con la finalidad de hacer simplificaciones a los nombres de dichos comandos, como puede ser la lista de comandos existente mediante el comando list y la letra l con la misma finalidad para simplificar a la hora de hacer uso del propio terminal.
  • special (Optional) [String|Function|Array[String]]: Método o función usado para órdenes especiales. Las órdenes especiales son aquellas cuyos atributos empiezan por guines.
  • method (Required) [String|Function|Array[String]]: Método o función usado para las órdenes dadas en el comando.
  • parameters (Optional) [Array[String]|String]: Lista de parámetros que pueden acompañar a dicho comando.
La definición de entrada de parámetros, pese a que no afecte propiamente a la ejecución ni introducción de parámetros ni atributos dentro del comando, éste se especifica con el fin de poder autogestionar la ayuda mediante la I18N y el propio comando help. Dicho comportamiento se especifica de forma más profunda en la definición del propio comando help que vendrá más adelante.

Las entradas que se le pueden dar al método anp.terminarl.add pueden ser un Arrays, Diccionarios y/o Strings donde los Diccionarios han de cumplir con lo establecido anteriormente; los Strings pueden ser ficheros JSON o datos JSON con Arrays, Strings y/o Diccionario con las mismas normas.

echo

El comando echo es un comando principalmente de prueba, basado en el propio comando echo de Terminal o COMANDOS para probar que realmente funcionen de una forma adecuada. Dicho comando simplemente imprime por la Terminal o Consola de COMANDOS lo que le acompañe.

  • typesh
  • characters34
  • lines2
echo hola
echo "Hola. ¿Qué tal?"
Si ponemos más de un parámetro, ya sea por no haber controlado el grupo con comillas, o por poner más de un elemento de parámetro, así como intentar hacer uso de diccionarios, sólo se interpretará el primer parámetro, el resto se ignorará.
  • typesh
  • characters177
  • lines10
> echo Hola. ¿Qué tal?
Hola.
> echo "Hola. ¿Qué tal?"
Hola. ¿Qué tal?
> echo saludo="Hola. ¿Qué tal?" despedida=Adiós

> echo "Hola. ¿Qué tal?" "Adiós"
Hola. ¿Qué tal?
> echo

close

El comando close, también nombrado como bye o exit, nos permite cerrar la aplicación AnP de forma controlada.

  • typesh
  • characters5
  • lines1
bye
! Se aconseja el uso de bye y/o close y no de exit por el hecho de que éste último puede chocar con el propio comando exit de la Terminal o Consola de COMANDOS.

help

El comando help, también nombrado como h o ?, nos permite acceder a la ayuda referente a la configuración actual de AnP. Dicha ayuda viene siendo como un manual para poderse guiar desde la propia terminal con los distintos comandos que nos encontramos.

La ayuda también puede ser solicitada desde otros comandos a partir de la estructura de llamamiento espcial con el mismo nombre. Por tanto, la forma de llamadas del comando help serían las siguientes a nivel de ejemplo:

  • help, h o ?: Nos permite acceder a la ayuda general, donde se nos listarán los comandos que tenemos registrados en la terminal del AnP.
  • COMANDO -help, COMANDO -h, COMANDO -?: Nos permite acceder a la ayuda específica de dicho comando.

list

El comando list, también nombrado como l, nos permite acceder a la lista de aplicaciones que tenemos registradas en nuestra aplicación AnP.

update

El comando update, también nombrado como u, nos permite actualizar partes de nuestra aplicación AnP o de aplicaciones registradas dentro de AnP concretamente, todo ello en caliente.

create

El comando create, también nombrado como c, nos permite crear una nueva aplicación y adjuntarla en caliente a la lista de aplicaciones de anP. Para poder llevar a cabo dicha acción, se requiere de especificar el nombre de la aplicación y el Path donde se quiere que se cree. Requiere de los siguientes parámetros:

  1. Nombre de la aplicación.
  2. Path absoluto donde meter dicha aplicación.
  3. Características de lenguajes que se quieren agregar.

Si la aplicación ya existe, éste complementará la aplicación con las características que se le den. Dichas características son:

  • css, sass o scss: Nos permite montar toda la estructura base AnP en CSS y SCSS/SASS.
  • js, ecma, javascript o ecmascript: Nos permite crear la estructura base AnP en JavaScript/ECMAScript.
  • web: Nos permite montar toda la estructura Web cliente, es decir, la base ECMAScript/JavaScript y CSS y SCSS/SASS. Incluye, en los casos pertinentes a los lenguajes adjuntos, la creación del servidor intérprete de HTML y WMarkDown.
  • mariadb o mysql: Nos permite crear la estructura base AnP en MySQL/MariaDB.
  • sqlserver, mssql, sql_server o sql-server: Nos permite crear la estructura base AnP en SQL Server.
  • sqlite: Nos permite crear la estructura de base de datos base AnP en SQLite.
  • py o python: Nos permite crear la base de la aplicación AnP en Python. Si tiene habilitado algo de entorno Web lo complementará en este lenguaje; y si tiene algo relacionado a bases de datos lo complementará con éste también.
  • php: Nos permite crear la base de la aplicación AnP en PHP. Si tiene habilitado algo de entorno Web lo complementará en este lenguaje; y si tiene algo relacionado a bases de datos lo complementará con éste también.
  • java: Nos permite crear la estructura de servidor AnP en Java.
  • csharp, cs, c_sharp, c-sharp o c#: Nos permite crear la estructura para un servidor C#, ya sea MVC sobre .NET o bien, un MVC sobre AnP.
  • rust: Nos permite crear la estructura para un servidor Rust sobre AnP.

Estos atributos se cuentan a partir del tercer parámetro dado al comando. Se le puede mandar en un único parámetro, un conjunto estructural a partir de los siguientes caracteres:

  • s: Para crear la estructura CSS y SCSS/SASS.
  • j: Para crear la estructura JavaScript/ECMAScript.
  • w: Para simplificar la estructura completa de CSS, SCSS/SASS y JavaScript/ECMAScript.
  • m: Para crear la estructura MySQL/MariaDB.
  • x: Para crear la estructura SQL Server.
  • l: Para crear la estructura SQLite.
  • p: Para crear la estructura de PHP.
  • y: Para crear la estructura de Python.
  • c: Para crear la estructura de CSharp.
  • v: Para crear la estructura de Java.
  • r: Para crear la estructura de Rust.
Sólo se interpretará el conjunto si sólo se le da un único parámetro.
Es importante señalar que el Path que se le dé es donde se instalará el directorio con el nombre del proyecto que se le dé, es decir, el Path sólo es la ruta donde crear el directorio de proyecto y el mismo dentro de éste.
Actualmente sólo están implementadas las estructuras de CSS, SCSS/SASS, ECMAScript/JavaScript, SQL Server y Python. este es el motivo por el cual salen tachadas muchas de estas opciones. La idea es ir implementándolas cara el futuro. También es importante contar que esta parte está en pleno desarrollo por lo que es fácil que la funcionalidad no esté completamente desarrollada o funcione de una forma probada y esperada.

Por otro lado, podemos ampliar los atributos de entrada con atributos como los siguientes:

  • authors: Determina el o los autores del proyecto.
  • link: Determina la URL del proyecto. Se desaconseja el uso de este atributo salvo que sea único, es decir, que no tenga entorno de pruebas ni nada. Si es el caso de tener un entorno de pruebas es aconsejable configurarlo manualmente por el patrón del Host.
  • host_pattern: Por defecto, será el patrón regular adaptado a JSON del propio Link.
  • git: URL del proyecto Git.
  • licenses: Array de licencias que se quieren aplicar. Éstas están creadas a partir de un patrón cuyas claves son:
    • copyright: Licencia que determina el Copyright como autor o autores del proyecto. Si se le dio uno o varios autores, éste se creará automáticamente.
    • cc_by_nc_sa_4: Licencia Creative Commons para abrir el proyecto, pero con las condiciones de nombrar al autor o autores; que la base comercial del proyecto, si éste lo fuere, no sea el proyecto en cuestión; y que se permite el compartirlo, distribuirlo y editarlo. Todo ello condicionado a la versión 4.0 de la Creative Commons.
  • menu: Menú de inicio, en la parte superior de la Web. Si tiene Link del proyecto Git, éste será aplicado automáticamente, lo mismo que si tiene sección de Aplicación Web.
Ejemplos
  • typesh
  • characters39
  • lines1
create Test /PATH/ABSOLUTO python web

Crea una una aplicación llamada Test en el Path /PATH/ABSOLUTO/Test cuyo servidor es Python y sólo es Web. Un equialente simplificado de este proyecto sería el siguiente:

  • typesh
  • characters26
  • lines1
c Test /PATH/ABSOLUTO wy
  • typesh
  • characters83
  • lines1
c Test /media/kyman/SSD2TB/git wy git=https://git.k3y.pw/KyMAN/Test authors=KyMAN

Este comando crear el mismo proyecto que los anteriores per determinando el Git y la autoría de KyMAN para que éstos rellenen los Links y licencias correspondientes.

Común

En esta sección se verán todas aquellas estructuras, métodos, funciones, variables, constantes y librerías comunes a todos los lenguajes, aunque sea de una forma parcial pero común a más de un lenguaje o entorno.

Base

El desarrollo de AnP se basa en estructuras que dependen de cada uno de los lenguajes, cogiendo éstos las partes pertinentes a su lado de desarrollo. En éstos nos encontramos elementos comunes a todos o una gran parte de ellos. Como base común del AnP nos encontramos el siguiente flujo de funcionamiento por cada librería que lo compone:

  • typemermaid
  • characters435
  • lines25
flowchart TD

subgraph "Object AnP"
    subgraph Common
        B["Construir"]
        ST["Iniciar"]
        _B{"¿Está construido?"}
        _ST{"¿Está iniciado?"}
    end
    subgraph Full
        U["Actualizar"]
        SP["Detener"]
        R["Reiniciar"]
        R_ST{"¿Está iniciado?"}
    end
end

_B -->|No| B
_B -->|Si| _ST
_ST -->|No| ST
_ST -.->|Sí| SP
R -.-> R_ST
R_ST -.->|Sí| SP -.->|"al reiniciar"| ST
R_ST -.->|No| ST

Aquí podemos ver que toda librería estaría diseñada para que tenga un iniciador, y opcionalmente, un sistema de detención de la misma, lo que nos permitiría incluso el reinicio de la misma. También nos encontramos un elemento de actualizaciones, es decir, en los casos de librerías de estructura completa como sucedería en Python, éstas tienen la capacidad de poder ser actualizadas en sus datos cogidos de servidor, como por ejemplo las configuraciones, donde podríamos actualizar en caliente la configuración.

ObjectClass
ObjectClass
voidglobalpublicObjectClassRequiredAnPanpRequiredNullishObject<String, Any|null>|Array<Object<String, Any|null>>inputs
NameRequiredNullableTypedDefault Value
anpTrueFalseAnP
inputsTrueTrueObject<String, Any|null>|Array<Object<String, Any|null>>
NameRequiredNullableTypedDefault Value

Esta sería la llamada a la clase que crea el objeto que estamos trabajando.

En el caso de lenguajes como JavaScript nos encontraremos una función que la simule.

Los objetos tienen la peculiaridad de que éstos conocen al origen del objeto AnP donde se anidan, de esta forma pueden llamar a los componentes y elementos que lo conforman internamente. El argumento que acompaña al propio objeto AnP no es más que parámetros de configuración o simples parámetros de funcionamiento.

self
ObjectClass.self
ObjectClassobjectprivateObjectClass.self
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Representa a él mismo como objeto, equivalente al this, pero con ambito común a todo el objeto, independientemente del nivel heredado en el que se encuentre. Se usa principalmente para poder simular un this que sea único cara el objeto que se trabaja, independientemente de los elementos que se crean internamente, sino, como pasa con el ámbito de las clases de JavaScript, se pueden perder las referencias y las memorias de lo que se quiere atacar.

Este elemento es básico para trabajar con la filosofía de clases tipo Java sobre un objeto construído a partir de una función pues si sólo se hace uso y referencia de los this, éstos quedarían en uso del nivel donde se trabaje, aquí quedaría totalmente independiente dicho factor.
Este elemento es omitido en lenguajes como PHP, Java, etc. Por el hecho de ya tener el funcionamiento esperado de this.
set_basics
ObjectClass.set_basics
voidobjectpublicObjectClass.set_basics
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

El método público "set_basics" nos permite unificar el sistema que establece los valores necesarios para el funcionamiento de cada librería dependientes de configuraciones y otros puntos que pueden ser variados a lo largo de la vida de ejecución de la aplicación en cuestión, por ejemplo, si hablamos de un objeto que se genera, durante su construcción, éstos parámetros ya tienen que existir, pero aún no fue iniciado la aplicación AnP pues está en la fase de construcción, y tras la fase de iniciación es cuando se establecerán realmente los valores finales. Además, este método permite una ayuda rápida cara unificar lo que serían valores específicos de configuración que cara un simple reinicio o Update del objeto, éste pueda ser relanzado sin afectar al resto del objeto.

constructor
ObjectClass.constructor
voidobjectprivateObjectClass.constructor
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta función privada viene siendo un Singleton el cual es llamado al terminar de ejecutar la función del objeto ObjectClass al que hace referencia. Dicha función tendría la creación de todos los elementos asignados en su interior, por ejemplo, en el caso de la clase maestra AnP, tendríamos dentro del propio constructor la creación de los objetos que gestionan las configuraciones, la I18N, los hilos de proceso, etc.

Este elemento puede existir como constructor cuando el lenguaje así lo especifica cara un objeto, como puede ser el caso de Java, Python, C#, etc. Pero en los casos en los que éstos no se usan o por filosofía de desarrollo, este elemento ha de ser simulado, éste es implementado, como pasa con la filosofía que se sigue en JavaScript con las clases simuladas a partir de una función.
start
ObjectClass.start
BooleanobjectpublicObjectClass.startRequiredNullishFunctioncallback
NameRequiredNullableTypedDefault Value
callbackTrueTrueFunction
NameRequiredNullableTypedDefault Value

El método público "start" nos permite iniciar la librería una vez ésta esté construída.

El inicio de una librería y su construcción son distintos, y se diferencian con motivo de que la construcción es sólo crear los objetos que lo constituyen, mientras que el inicio es conseguir los datos necesarios para su trabajo así como el inicio de las acciones, automatizaciones y gestiones para su buen funcionamiento completo. Mientras una librería no esté iniciada, aunque ésta esté construída como objeto, puede tener comportamientos no esperados.

Este método puede funcionar de forma síncrona y asíncrona dependiendo del caso, por ejemplo, si estamos hablando de iniciar un automatismo, ésta sería síncrona pues no requiere de esperar, sólo iniciar; pero si se requiere de conseguir datos de servidor, por ejemplo, como sucede tanto con la librería Settings o I18N, éstas serían asíncronas, ejecutando el Callback a destiempo, normalmente, del retorno dado. Este es el motivo por el cual se aconseja encaricidamente el uso del Callback para gestionar los inicios de los objetos.

Este método retorna de forma síncrona y con tipado Booleano, si ha sido ejecutado correctamente o no; y con el mismo tipado, pero de forma asíncrona, se enviará como parámetro al Callback.

Es importante mencionar que si un objeto que trabaja esta filosofía ya está iniciado, este método retornará o enviará "false" pues está diseñado para controlar que sólo pueda ser usado en el objeto cuando éste no esté iniciado, permitiendo no sólo hacer inicios únicos controlados sino también detención de objetos y reinicios de los mismos de una forma plenamente controlada. Su condición es la variable privada local started, variable que controla dicho flujo de trabajo.

Application/AnP

Esta librería es la encargada de contener todos aquellos elementos: funciones, variables y métodos comunes a todas las librerías del Framework de AnP.

Es importante mencionar que los métodos que determinan tipado, en casos de lenguajes rígidos como Java, también pueden existir para casos de envío de valores que pueden ser no determinados mediante el tipado genérico object, aunque en este tipo de lenguajes se intentará, dentro de la medida de las posibilidades, el hacer uso de este tipado concreto, quedando parcialmente inútiles dichos métodos.
AnP
AnPglobalpublicAnPObject<String, Any|null>|Array<Object<String, Any|null>>inputs
NameRequiredNullableTypedDefault Value
inputsFalseFalseObject<String, Any|null>|Array<Object<String, Any|null>>
NameRequiredNullableTypedDefault Value

Una aplicación AnP funciona a partir de la creación de un objeto AnP que parte de esta librería.

AnP.SHOW_ERRORS
AnP.SHOW_ERRORS
IntegerstaticpublicAnP.SHOW_ERRORS1 << 0
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Valor numérico entero positivo que representa el primer Bit, es decir, un 1, para poder concatenar con otras opciones Booleanas que por defecto son "false". Sirve para indicar, donde así lo permita, si se muestran los errores por consola o no.

AnP.RAW
AnP.RAW
IntegerstaticpublicAnP.RAW1 << 1
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Valor numérico entero positivo que representa el segundo Bit, es decir, un 2, para poder concatenar con otras opciones Booleanas que por defecto son "false". Sirve para indicar, donde así lo permita, si se hace algo en formato crudo o no.

AnP.is_function
AnP.is_function
BooleanstaticpublicAnP.is_functionRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es una función o no.

AnP.is_object
AnP.is_object
BooleanstaticpublicAnP.is_objectRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un objeto o no, independientemente del tipado

AnP.is_array
AnP.is_array
BooleanstaticpublicAnP.is_arrayRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un Array o no.

En lenguajes como Python, éste puede representar valores equivalentes como list o tuple.
AnP.is_dictionary
AnP.is_dictionary
BooleanstaticpublicAnP.is_dictionaryRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un diccionario o no.

La verificación de diccionario, a diferencia del de Objeto, es que éste no tiene constructor propio, sino que depende de ser un sistema de Clave-Valor.
AnP.is_bool
AnP.is_bool
BooleanstaticpublicAnP.is_boolRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un valor Booleano o no.

AnP.is_string
AnP.is_string
BooleanstaticpublicAnP.is_stringRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un String o no.

AnP.is_html_object
AnP.is_html_object
BooleanstaticpublicAnP.is_html_objectRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un objeto HTML por DOM o equivalente o no.

AnP.is_number
AnP.is_number
BooleanstaticpublicAnP.is_numberRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un valor numérico o no, independientemente de ser un valor entero o decimal.

AnP.is_date
AnP.is_date
BooleanstaticpublicAnP.is_dateRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un objeto de tipo fecha o no.

AnP.is_integer
AnP.is_integer
BooleanstaticpublicAnP.is_integerRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Función pública estática que verifica si un valor dado es un valor numérico entero o no.

AnP.execute
AnP.execute
Any|null|voidstaticpublicAnP.executeRequiredNullishFunctioncallbackNullish...Anyarguments
NameRequiredNullableTypedDefault Value
callbackTrueTrueFunction
argumentsFalseTrue...Any
NameRequiredNullableTypedDefault Value

Método estático que nos permite gestionar una ejecución de un método o función Callback. Este método sirve para simplificar la llamada de un posible Callback, es decir, la ejecución de Callbacks en cuyos casos éstos son opcionales, haciendo las comprobaciones permitinentes para que dicha ejecución se lleve a cabo o no sin que el usuario desarrollador tenga la necesidad de gestionar dicha comprobación.

El método permite también el envío de argumentos, añadiéndolos a continuación del argumento que indica el Callback.

AnP.get_array
AnP.get_array
Any|nullstaticpublicAnP.get_arrayRequiredString|Array<String>keysRequiredObject<String, Any|null>|Array<Object<String, Any|null>>inputsAny_default
NameRequiredNullableTypedDefault Value
keysTrueFalseString|Array<String>
inputsTrueFalseObject<String, Any|null>|Array<Object<String, Any|null>>
_defaultFalseFalseAny
NameRequiredNullableTypedDefault Value

Método estático que nos permite seleccionar un valor a partir de una o varias claves opciones; y uno o varios diccionarios, donde se retornará el primer elemento encontrado en el orden primero de las claves dadas y luego de los diccionarios dados. En caso de no encontrarse ningún valor éste retornará el valor establecido en _default.

AnP.get_keys
AnP.get_keys
Array<String>staticpublicAnP.get_keysRequiredArray<String>|Stringkeys
NameRequiredNullableTypedDefault Value
keysTrueFalseArray<String>|String
NameRequiredNullableTypedDefault Value

Método estático que nos permite coger un Array de claves. Las claves no son más que valores de tipo String cuyos caracteres son letras del alfabeto inglés, guiones bajos y números. Cualquier valor que no sea la descripción de una clave será omitido, pudiendo llegar a retornar un Array vacío. Si se le envía un String en vez de un Array, éste lo tomará como un Array de un único String y lo trabajará de la misma forma.

AnP.execute_keys
AnP.execute_keys
Array<String>staticpublicAnP.execute_keysRequiredArray<String>|StringkeysRequiredFunctioneach_callbackFunctionend_callback
NameRequiredNullableTypedDefault Value
keysTrueFalseArray<String>|String
each_callbackTrueFalseFunction
end_callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Método estático que nos permite realizar una ejecución por cada una de las claves dadas, de forma asíncrona y ordenada y nunca en paralelo. Cuando termine de realizar todas las ejecuciones de cada clave, el método ejecutará el Callback final si éste fue dado.

AnP.get_json_data
AnP.get_json_data
voidstaticpublicAnP.get_json_dataRequiredStringdataRequiredNullishFunctionok_callbackFunctionwrong_callback
NameRequiredNullableTypedDefault Value
dataTrueFalseString
ok_callbackTrueTrueFunction
wrong_callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Método estático que gestiona la carga de los datos de un JSON, y en caso de salir todo correcto, éste ejecutará el Callback ok_callback enviándole como argumento dichos datos; en caso contrario, éste ejecutará el Callback wrong_callback sin argumento alguno.

AnP.is_refrence_key
AnP.is_refrence_key
BooleanstaticpublicAnP.is_refrence_keyRequiredStringdataRequiredNullishStringbase"AnP""AnP"
NameRequiredNullableTypedDefault Value
dataTrueFalseString
baseTrueTrueString"AnP"
NameRequiredNullableTypedDefault Value

Método estático que nos permite validar si una clave es una clave reservada para abrir y cerrar bloques dentro de un JSON a partir de la sintaxis de estructura de AnP la cual sería empezar con el nombre del proyecto en cuestión en Pascal Case y en Snake Case el nombre del nivel donde se encuentra y con el final de "_start" para iniciar bloque o "_end" para cerrarlo.

  • typejson
  • characters342
  • lines17
{

    "AnP_common_start" : null, 
    "parameter_1a" : "A", 
    "parameter_1b" : "B", 
    "parameter_1c" : "C", 
    "parameter_1n" : "N", 
    "AnP_common_end" : null, 

    "AnP_base_start" : null, 
    "parameter_2a" : "A", 
    "parameter_2b" : "B", 
    "parameter_2c" : "C", 
    "parameter_2n" : "N", 
    "AnP_base_end" : null

}

Este método es usado para ignorar la adjunción de las marcas de apertura y cierre de bloque lo cual sirve para ayudar a la visualización de los contenidos de un JSON.

AnP.launch
AnP.launch
voidstaticpublicAnP.launchRequiredObjectobjectRequiredString|Array.<String>itemsRequiredNullishFunctioncallbackRequiredNullishString|Array<String>methods"start""start"
NameRequiredNullableTypedDefault Value
objectTrueFalseObject
itemsTrueFalseString|Array.<String>
callbackTrueTrueFunction
methodsTrueTrueString|Array<String>"start"
NameRequiredNullableTypedDefault Value

Método estático que nos permite lanzar una acción, con uno o varios nombres opcionales sobre elementos de un mismo objeto según nombre de los mismos. El argumento object determina el objeto donde se encuentra para lanzar dichas acciones; el argumento items determina el nombre de los objetos hijo del argumento anterior a los cuales hacemos referencia; el argumento callback determina la función a ejecutar tras haber ejecutado los métodos de los objeto hijo; y finalmente, el argumento methods que determina el nombre del método que se quiere hacer referencia. Éste puede ser un Array que contenga más de una opción para compatibilizar entre librerías y/o objetos.

Este método se usa principalmente para iniciar los objetos con sus hijos de forma asíncrona en el método start explicado en el bloque que especifica la base de cualquier librería.

AnP.load_dictionaries
AnP.load_dictionaries
voidobjectpublicAnP.load_dictionariesRequiredArray<String|Object<String, Any|null>|Array<Any|null>>inputsRequiredFunctioneach_callbackRequiredNullishFunctionend_callback
NameRequiredNullableTypedDefault Value
inputsTrueFalseArray<String|Object<String, Any|null>|Array<Any|null>>
each_callbackTrueFalseFunction
end_callbackTrueTrueFunction
NameRequiredNullableTypedDefault Value

Método objeto que nos permite hacer una carga asíncrona de uno o varios diccionarios donde por cada diccionario cargado éste ejecute un método para trabajarlos, y opcionalmente, otro método para cuando acabe todo el proceso y poder llevar un órden asíncrono monoproceso.

Este método es muy usado para carga de valores como la configuración, I18N, etc.

AnP.hash
Es importante destacar que a lo que se le llama Hash en esta premisa de la aplicación no deja de ser un simple identificador a partir de una cadena aleatoria para fines diversos dentro de la aplicación. Un ejemplo de uso puede ser en la referencia FOR-ID en HTML para crear identificadores únicos de referencia para poder interactuar con éstos.
AnP.hash_alphabet
StringobjectpublicAnP.hash_alphabet"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Variable que configura el alfabeto por defecto utilizado para crear cadenas aleatorias.

AnP.hash_length
IntegerobjectpublicAnP.hash_length11
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

variable que determina la longitud del Hash por defecto.

AnP.hash
StringobjectpublicAnP.hashObject<String, Any|null>|Array<Object<String, Any|null>>inputs
NameRequiredNullableTypedDefault Value
inputsFalseFalseObject<String, Any|null>|Array<Object<String, Any|null>>
NameRequiredNullableTypedDefault Value

Método objeto que nos permite hacer una carga asíncrona de uno o varios diccionarios donde por cada diccionario cargado éste ejecute un método para trabajarlos, y opcionalmente, otro método para cuando acabe todo el proceso y poder llevar un órden asíncrono monoproceso.

Este método es muy usado para carga de valores como la configuración, I18N, etc.

AnP.get_dictionaries
AnP.get_dictionaries
Array<Object<String, Any|null>>staticpublicAnP.get_dictionariesRequiredAnyitems
NameRequiredNullableTypedDefault Value
itemsTrueFalseAny
NameRequiredNullableTypedDefault Value

Método estático que nos retorna un Array con todos los diccionarios que se le hallan mandado en el argumento items. Si éste no es un diccionario o un Array de diccionarios, éste retornará un Array vacío. Si algún elemento de un Array dado no es un diccionario, éstos se omitirán en la respuesta.

AnP.string_variables
AnP.string_variables
StringstaticpublicAnP.string_variablesRequiredStringstringNullishObject<String, Any|null>|Array<Object<String, Any|null>>variablesNullishAny_default
NameRequiredNullableTypedDefault Value
stringTrueFalseString
variablesFalseTrueObject<String, Any|null>|Array<Object<String, Any|null>>
_defaultFalseTrueAny
NameRequiredNullableTypedDefault Value

Método estático que nos permite gestionar pseudovariables a partir de claves encapsuladas entre llaves para determinar la clave dentro de objectos y/o diccionariosa que se le proporcionen para ir cubriendo dichos valores dentro del String sin necesidad de cambiarlo manualmente o tener que ir concatenando fragmentos de de Strings o castear a String valores de forma manual.

AnP.get_value
AnP.get_value
Any|null|undefinedstaticpublicAnP.get_valueRequiredStringstringNullishObject<String, Any|null>|Array<Object<String, Any|null>>variablesNullishAny_default
NameRequiredNullableTypedDefault Value
stringTrueFalseString
variablesFalseTrueObject<String, Any|null>|Array<Object<String, Any|null>>
_defaultFalseTrueAny
NameRequiredNullableTypedDefault Value

Método estático que nos permite gestionar pseudovariables a partir de claves encapsuladas entre llaves para determinar la clave dentro de objectos y/o diccionariosa que se le proporcionen para ir cubriendo dichos valores dentro del String sin necesidad de cambiarlo manualmente o tener que ir concatenando fragmentos de de Strings o castear a String valores de forma manual.

AnP.get_texts
AnP.get_texts
Array<String>staticpublicAnP.get_textsRequiredString|Array<String>texts
NameRequiredNullableTypedDefault Value
textsTrueFalseString|Array<String>
NameRequiredNullableTypedDefault Value

Método estático que nos permite recoger un Array de Strings, ya sea por un Array dado o por un simple String dado. En caso de dar un Array y éste contener valores que no son un String, éstos serán omitidos. El objetivo es recoger cualquier texto dado.

AnP.null_or_undefined
AnP.null_or_undefined
BooleanstaticpublicAnP.null_or_undefinedRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Método estático que nos permite determinar si un valor dado es nulo o no está definido.

Este método sólo es viable para lenguajes que tienen distintos valores nulificados, como es el caso de JavaScript con el valor undefined. En el resto de lenguajes éste se sutituirá por una comprobación directa sobre null.
AnP.get_dictionary
AnP.get_dictionary
Object<String, Any|null>staticpublicAnP.get_dictionaryRequiredObject<String, Any|null>|Array<Object<String, Any|null>>items
NameRequiredNullableTypedDefault Value
itemsTrueFalseObject<String, Any|null>|Array<Object<String, Any|null>>
NameRequiredNullableTypedDefault Value

Método estático que nos permite unir más de un diccionario en un único diccionario. Si se le envía un único diccionario, éste retornará un clone de éste; por el contrario, se unirán todos los diccionarios dados en el Array, pero si alguno no es un Array, éste los omitirá. Si no se envía ni un Array ni ningún diccionario, éste retornará un diccionario vacío.

AnP.get_trace
AnP.get_trace
Array<Object<String, Integer|String|null>>staticpublicAnP.get_traceRequiredNullishIntegeri00
NameRequiredNullableTypedDefault Value
iTrueTrueInteger0
NameRequiredNullableTypedDefault Value

Método estático que nos permite coger la traza desde el inicio de la ejecución actual hasta el punto donde se le llame, permitiendo especificar el último nodo de recogida de traza mediante el argumento i.

AnP.get_class_keys
AnP.get_class_keys
Array<String>staticpublicAnP.get_class_keysRequiredArray<String>|Stringkeys
NameRequiredNullableTypedDefault Value
keysTrueFalseArray<String>|String
NameRequiredNullableTypedDefault Value

Método estático que nos permite coger en un Array las claves de las clases HTML que se le envíen.

AnP.get_dictionary_from_array
AnP.get_dictionary_from_array
Object<String, Any|null>staticpublicAnP.get_dictionary_from_arrayRequiredArray<String>keysArray<Any|null>array
NameRequiredNullableTypedDefault Value
keysTrueFalseArray<String>
arrayFalseFalseArray<Any|null>
NameRequiredNullableTypedDefault Value

Método estático que nos permite crear un diccionario a partir de un Array de claves y otro de valores.

AnP.extends
AnP.extends
ObjectstaticpublicAnP.extendsRequiredObjectorigin...Objectextra
NameRequiredNullableTypedDefault Value
originTrueFalseObject
extraFalseFalse...Object
NameRequiredNullableTypedDefault Value
AnP.extends
ObjectstaticpublicAnP.extendsRequiredObjectoriginRequiredBooleanoverwrite...Objectextra
NameRequiredNullableTypedDefault Value
originTrueFalseObject
overwriteTrueFalseBoolean
extraFalseFalse...Object
NameRequiredNullableTypedDefault Value

Este método estático nos permite extender un Objeto origin con los objetos declarados en extra. El parámetro overwrite nos determina si las claves ya existentes en origin se sobreescriben con las nuevas claves de los objetos extra. Si overwrite no se define, éste será por defecto false.

El orden de sobreescritura de las claves sobre origin será en base a la prioridad del último valor de clave que se encuentre según el orden de los objeto extra.

Esta función sólo existirá realmente en lenguajes muy flexibles que permiten una edición en caliente de un objeto sin que éste tenga que estar predefinido, como es el caso de JavaScript, en los cuales las clases no permitan extender de otras clases o bien, se simulen las clases por el hecho de no existir en dicho lenguaje. En el resto de casos se usarán las estructuras de clase o equivalentes predeterminadas.
AnP.extends
voidobjectpublicAnP.extendsRequiredObject|Class|FunctionobjectRequiredNullishBooleanoverwritefalsefalse
NameRequiredNullableTypedDefault Value
objectTrueFalseObject|Class|Function
overwriteTrueTrueBooleanfalse
NameRequiredNullableTypedDefault Value

Este método objeto permite extender el propio objeto AnP contra otro objeto dado. Si el valor dado es un objeto o diccionario, éste se extenderá de forma directa; en caso de ser una función que sea de tipo constructor o una clase, éste generará el objeto como si fuese un objeto AnP y lo extenderá. Si el valor del argumento overwrite es true, éste priorizará los valores de las claves del nuevo objeto, sobreescribiéndolas en el objeto AnP si éstas ya existen.

Este método objeto es sólo compatible con lenguajes que diferencian a nivel de ámbito de llamada lo que viene siendo un método estático de uno de objeto pese a tener el mismo nombre, sino, éste no será utilizado y en su defecto se usará el método estático.
AnP.json_encode
AnP.json_encode
String|nullstaticpublicAnP.json_encodeRequiredObject<String, Any|null>|ArraydataRequiredNullishBooleanshow_errorsfalsefalse
NameRequiredNullableTypedDefault Value
dataTrueFalseObject<String, Any|null>|Array
show_errorsTrueTrueBooleanfalse
NameRequiredNullableTypedDefault Value

Método estático que nos permite codificar un objeto serializable en un String con formato JSON. En caso de dar un valor no serializable cara un String JSON, éste gestionará una excepción la cual será mostrada únicamente por consola/terminal si se le especifica como true al argumento show_errors. En caso de error, éste retornará null.

AnP.json_decode
AnP.json_decode
Object<String, Any|null>|Array|nullstaticpublicAnP.json_decodeRequiredStringjsonRequiredNullishBooleanshow_errorsfalsefalse
NameRequiredNullableTypedDefault Value
jsonTrueFalseString
show_errorsTrueTrueBooleanfalse
NameRequiredNullableTypedDefault Value

Método estático que nos permite decodificar un String con formato JSON en un Objeto serializable. En caso de que el String no sea un JSON, éste gestionará una excepción la cual será mostrada únicamente por consola/terminal si se le especifica como true al argumento show_errors. En caso de error, éste retornará null.

AnP.base64_encode
AnP.json_encode
String|nullstaticpublicAnP.json_encodeRequiredStringstringRequiredNullishIntegerinputsAnP.SHOW_ERRORSAnP.SHOW_ERRORS
NameRequiredNullableTypedDefault Value
stringTrueFalseString
inputsTrueTrueIntegerAnP.SHOW_ERRORS
NameRequiredNullableTypedDefault Value

Método estático que nos permite codificar un String en Base64. En caso de no ser un String o éste poseer caracteres no válidos para dicha tarea, éste gestionará una excepción la cual será mostrada únicamente por consola/terminal si se le especifica al inputs el valor AnP.SHOW_ERRORS o 1 << 0. En caso de error, éste retornará null.

Este método tiene una entrada de Booleanos en formato binario el cual se representa con un valor numérico entero cuyos bits representan:

  1. AnP.SHOW_ERRORS (1 << 0): Determina si se muestran errores o no.
  2. AnP.RAW (1 << 1): Determina si se hace una conversión en crudo (true) o se pasa primero a URI String (false).
La codificación por defecto se hará sobre una codificación previa en URI por el hecho de adaptar todos los caracteres a un formato String compatible y global aplicable a otros lenguajes pues este formateo se suele hacer con la intención de poder enviar la información a otras plataformas de una forma legible y accesible.
AnP.base64_decode
AnP.json_decode
String|nullstaticpublicAnP.json_decodeRequiredStringdataRequiredNullishIntegerinputsAnP.SHOW_ERRORSAnP.SHOW_ERRORS
NameRequiredNullableTypedDefault Value
dataTrueFalseString
inputsTrueTrueIntegerAnP.SHOW_ERRORS
NameRequiredNullableTypedDefault Value

Método estático que nos permite decodificar un String con formato Base64 a un String de texto plano. En caso de no ser un String o éste poseer caracteres no válidos para dicha tarea, éste gestionará una excepción la cual será mostrada únicamente por consola/terminal si se le especifica al inputs el valor AnP.SHOW_ERRORS o 1 << 0. En caso de error, éste retornará null.

Este método tiene una entrada de Booleanos en formato binario el cual se representa con un valor numérico entero cuyos bits representan:

  1. AnP.SHOW_ERRORS (1 << 0): Determina si se muestran errores o no.
  2. AnP.RAW (1 << 1): Determina si se hace una conversión en crudo (true) o se pasa primero a URI String (false).
La decodificación por defecto se hará sobre una decodificación posterior de URI por el hecho de adaptar todos los caracteres a un formato String compatible y global aplicable a otros lenguajes pues este formateo se suele hacer con la intención de poder enviar la información a otras plataformas de una forma legible y accesible.
AnP.encode_set
AnP.encode_set
String|nullobjectpublicAnP.encode_setRequiredArray<Any|null>|Object<String, Any|null>set
NameRequiredNullableTypedDefault Value
setTrueFalseArray<Any|null>|Object<String, Any|null>
NameRequiredNullableTypedDefault Value

Método objeto que codifica en el entorno local del AnP un objeto para uso principalmente en comunicaciones entre las distintas partes de la aplicación. Este método se integra como objeto dentro del AnP para que éste pueda tener una función customizada a partir de la creación del objeto a modo de Callback o metodologías preprogramadas a selección de la configuración. Dicho método ha de estar sincronizado en todos los niveles de la aplicación con su contraparte AnP.decode_set.

AnP.decode_set
AnP.decode_set
Array<Any|null>|Object<String, Any|null>|nullobjectpublicAnP.decode_setRequiredStringset
NameRequiredNullableTypedDefault Value
setTrueFalseString
NameRequiredNullableTypedDefault Value

Método objeto que decodifica en el entorno local del AnP un objeto para uso principalmente en comunicaciones entre las distintas partes de la aplicación. Este método se integra como objeto dentro del AnP para que éste pueda tener una función customizada a partir de la creación del objeto a modo de Callback o metodologías preprogramadas a selección de la configuración. Dicho método ha de estar sincronizado en todos los niveles de la aplicación con su contraparte AnP.encode_set.

Managers/Settings

Esta librería es la encargada de gestionar las configuraciones de la aplicación AnP y heredados. Para entender su funcionamiento de selección de parámetros hay que entender primero que hay los siguientes niveles de selección de parámetros, cuyo orden de prioridad es el que se sale a continuación:

  1. inputs: Estos parámetros son dados cuando se llama al método get de esta librería y vienen siendo parámetros dados directamente por el desarrollador en la llamada a dicho método.
  2. customs: Estos parámetros son dados cuando se crea el objeto AnP del que parte la aplicación y son parámetros que los integra el desarrollador para forzar ciertos valores por defecto o customizados.
  3. secrets: Estos parámetros son dados desdce un fichero externo y determina principalmente valores cuya sensibilidad no puede existir dentro del proyecto por lo que se apartan en este fichero, como pueden ser accesos a bases de datos, claves, etc. Éste tiene prioridad sobre los settings que vienen a continuación pues a pesar de tener una filosofía similar, los siguientes son parámetros públicos que personalizan a la aplicación sin sensibilidad de los mismos.
  4. settings: Estos parámetros son dados son cargados desde uno o más ficheros y representan la customización de la aplicación. Éstos tienen dos cargas: la configuración por defecto; y luego, sobreescribiendo, las configuraciones personalizadas.
  5. default_settings: Estos parámetros son dados por defecto a nivel de código para un arranque básico que permita el inicio de los componentes básicos previos al uso de los parámetros settings y secrets. Éstos vienen influenciados por inputs y customs.

Hay que tener en cuenta que estas configuraciones son simplemente diccionadios de clave valor que en base a su clave podemos coger el valor que estamos buscando. En caso de anidaciones, éstos cuentan sólo como un valor del padre de la anidación, de esta forma podemos simular incluso objetos a nivel de JSON para su configuración.

SettingsManager.sentences
SettingsManager.settings
Object<String, Any|null>objectprivateSettingsManager.settings{}
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante es la encargada de almacenar todos los parámetros de configuración que se carguen externamente desde ficheros de configuración JSON.

Los archivos JSON orientados al almacenaje de la configuración y secretos de AnP pueden dividir en bloques dichos parámetros visualmente para facilitar a los desarrolladores el trabajo sobre éstos, aunque dichos bloques serán ignorados a la hora de implementar dichos valores en el propio AnP para renderizar el funcionamiento de dicha librería. La sintaxis a seguir para poder dividir en bloques la configuración y/o los secretos simplemente ha de empezar por el nombre de la aplicación en Pascal Case o usar una clave determinada por los desarrolladores continuado por un guión bajo, y finalizar dicha clave mediante un guión bajo seguido de start si ésta se inicia o end si finaliza el bloque.

  • typejson
  • characters931
  • lines24
{

    "AnP_grupo_a_start" : null, 
    "parametro_a_1" : "Valor del parámetro 1 del grupo A.", 
    "parametro_a_2" : "Valor del parámetro 2 del grupo A.", 
    "parametro_a_3" : "Valor del parámetro 3 del grupo A.", 
    "parametro_a_n" : "Valor del parámetro N del grupo A.", 
    "AnP_grupo_a_end" : null, 

    "AnP_grupo_b_start" : null, 
    "parametro_b_1" : "Valor del parámetro 1 del grupo B.", 
    "parametro_b_2" : "Valor del parámetro 2 del grupo B.", 
    "parametro_b_3" : "Valor del parámetro 3 del grupo B.", 
    "parametro_b_n" : "Valor del parámetro N del grupo B.", 
    "AnP_grupo_b_end" : null, 

    "AnP_grupo_c_start" : null, 
    "parametro_c_1" : "Valor del parámetro 1 del grupo C.", 
    "parametro_c_2" : "Valor del parámetro 2 del grupo C.", 
    "parametro_c_3" : "Valor del parámetro 3 del grupo C.", 
    "parametro_c_n" : "Valor del parámetro N del grupo C.", 
    "AnP_grupo_c_end" : null

}
SettingsManager.secrets
SettingsManager.secrets
Object<String, Any|null>objectprivateSettingsManager.secrets{}
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante almacena toda la configuración secreta o de alta sensibilidad, priorizada frente a settings, con la misma estructura que ésta.

SettingsManager.default_nulls
SettingsManager.default_nulls
BooleanobjectprivateSettingsManager.default_nullsfalse
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina si se admiten valores nulos por defecto a la hora de retornar el valor de un parámetro requerido mediante el método get.

SettingsManager.default_value
SettingsManager.default_value
Any|nullobjectprivateSettingsManager.default_valuenull
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable dcetermina el valor por defecto a devolver en caso de no encontrar nada en el método get. También puede ser usado externamente para determinar el valor por defecto de la aplicación.

SettingsManager.default_overwrite
SettingsManager.default_overwrite
BooleanobjectprivateSettingsManager.default_overwritefalse
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina si se permite sobreescribir parámetros ya existentes en la constante settings desde el método add.

SettingsManager.default_secrets_overwrite
SettingsManager.default_secrets_overwrite
BooleanobjectprivateSettingsManager.default_secrets_overwritefalse
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina si se permite sobreescribir parámetros ya existentes en la constante secrets desde el método add_secrets.

SettingsManager.nulls
SettingsManager.nulls
BooleanobjectpublicSettingsManager.nullsBooleannulls
NameRequiredNullableTypedDefault Value
nullsFalseFalseBoolean
NameRequiredNullableTypedDefault Value

Este método objeto nos permite coger como valor la verificación de si queremos valores nulos o no, o en caso de no ser especificado, coger de la configuración si por defecto aceptamos valores nulos o no.

SettingsManager.default_value
SettingsManager.default_value
Any|nullobjectpublicSettingsManager.default_valueNullishAny_defaultBooleannulls
NameRequiredNullableTypedDefault Value
_defaultFalseTrueAny
nullsFalseFalseBoolean
NameRequiredNullableTypedDefault Value

Este método objeto nos permite coger un valor por defecto que nosotros especifiquemos, y en caso de no cumplir la regla de los nulos o no ser especificado, éste retornará el valor por defecto establecido en la configuración.

SettingsManager.get
SettingsManager.get
Any|nullobjectpublicSettingsManager.getRequiredString|Array<String>keysNullishObject<String, Any|null>|Array<Object<String, Any|null>>inputsNullishAny_defaultBooleannulls
NameRequiredNullableTypedDefault Value
keysTrueFalseString|Array<String>
inputsFalseTrueObject<String, Any|null>|Array<Object<String, Any|null>>
_defaultFalseTrueAny
nullsFalseFalseBoolean
NameRequiredNullableTypedDefault Value

Este método objeto nos permite recoger un valor de la configuración según la clave o claves dadas.

Mirar al principio de la documentación de esta librería el orden en el que se cargan las configuraciones, de esta forma será más predecible y se entenderá mejor el funcionamiento de este método objeto.
SettingsManager.add
SettingsManager.add
Any|nullobjectpublicSettingsManager.addNullishString|Object<String, Any|null>|Array<Object<String, Any|null>|String>inputsBooleanoverwriteFunctioncallback
NameRequiredNullableTypedDefault Value
inputsFalseTrueString|Object<String, Any|null>|Array<Object<String, Any|null>|String>
overwriteFalseFalseBoolean
callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Este método objeto nos permite añadir parámetros a la configuración al nivel de la configuración personalizada.

SettingsManager.add_secrets
SettingsManager.add_secrets
Any|nullobjectpublicSettingsManager.add_secretsNullishString|Object<String, Any|null>|Array<Object<String, Any|null>|String>inputsBooleanoverwriteFunctioncallback
NameRequiredNullableTypedDefault Value
inputsFalseTrueString|Object<String, Any|null>|Array<Object<String, Any|null>|String>
overwriteFalseFalseBoolean
callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Este método objeto nos permite añadir parámetros a la configuración al nivel de la configuración secreta.

Application/URI

Esta librería está construida con el fin de poder cargar ficheros y datos, ya sean locales o remotos.

Por los ámbitos que trabaja el propio AnP, algunos lenguajes pueden tener parte de estos parámetros, y otros otra parte diferente. Un buen ejemplo sería el ECMAScript/JavaScript cliente, el cual no tendría una lectura local de ficheros salvo por selección directa del usuario.
URI.default_timeout
URI.default_timeout
IntegerobjectprivateURI.default_timeout2000
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable establece un tiempo límite de carga. Si el tiepo límite se excede se retornará un error indicando que fue un Timeout.

En algunos casos, por no tener un control preciso sobre el hilo de carga, puede haber dos resultados distintos de Timeout:
  • Timeout (TIMEOUT).
  • Timeout forzado (FORCED_TIMEOUT).
URI.default_mode
URI.default_mode
StringobjectprivateURI.default_mode"text"
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina el modo por defecto de carga de los los datos. Los modos actualmente existentes son:

  • text: Formatea los resultados de carga en un texto String en formato UTF-8.
  • json: Formatea los resultados de carga en un objeto Array o diccionario compatible con la serialización de JSON.
  • binary: Formatea los resultados de carga en un vector de bytes crudos.
URI.get
URI.get
Array<Any|null, AJAX, Integer>objectpublicURI.getRequiredStringurlNullishFunctioncallbackObject<String, Any|null>|Array<Object<String, Any|null>>inputs
NameRequiredNullableTypedDefault Value
urlTrueFalseString
callbackFalseTrueFunction
inputsFalseFalseObject<String, Any|null>|Array<Object<String, Any|null>>
NameRequiredNullableTypedDefault Value

Método objeto que nos permite cargar contenido de una URL por el método GET del protocolo HTTP. El método es asíncrono por defecto, aunque también tiene una respuesta directa para lenguajes o entornos con sincronicidad y/o espera de respuesta. La respuesta consta de 3 valores:

  • response: Respuesta dada por por la carga de los datos en base a su modo, formato y tipado.
  • ajax: Objeto de gestión de carga de la información. Se le llamó ajax por el hecho de que en JavaScript se suele usar un objeto de tipo ajax con una lectura asíncrona, fuera de la filosofía de la promesa fetch.
  • error: Código de error en formato entero cuyos Bits representan cada uno de los errores de forma Booleana como análisis global de los mismos.

Por otro lado tenemos la respuesta asíncrona que se dará sobre el método Callback dado, la cual contiene los siguientes parámetros:

  • response: Resultado de la respuesta ya formateada en el modo deseado o en el formato por defecto de los datos de la respuesta.
  • status: Estado HTTP de la respuesta (Mirar códigos HTTP de respuesta).
  • state: Estado de proceso de la consulta AJAX.
  • message: Mensaje de error para determinar el estado de la consulta. Éstos pueden ser los siguientes:
    • OK: Todo ha salido correctamente o según lo esperado por defecto.
    • HTTP_ERROR: Hubo un error según estado HTTP de la respuesta.
    • FORCED_TIMEOUT: El tiempo máximo de espera fue excedido y se detuvo de forma forzada fuera del entorno de AJAX.
    • ABORTED: La petición fue abortada. Esto puede darse al usar el método abort de AJAX al poder ser usado desde la respuesta síncrona del mismo.
    • ERROR: Hubo un error al intentar procesar el AJAX.
    • TIMEOUT: Se excedió el tiempo de respuesta y AJAX detuvo su proceso.
  • ok: Valor Booleano que determina si la asincronicidad fue gestionada completamente bien por defecto o no.
  • error: Código de error, ampliado con la posible respuesta.
Es importante destacar que la respuesta asícrona se ayuda de la propia respuesta síncrona, es decir, factores como el código de error lo tendremos por la parte síncrona, aunque es verdad que el método asíncrono dará un error completo con los datos asíncronos.

Los modos de respuesta que se le pueden definir en el inputs pueden ser:

  • raw, binary o bytes: Viene siendo un vector de bytes crudos para su proceso o uso posterior.
  • blob: Viene retornando los datos en un objeto BLOB.
  • json: Si es un String compatible, éste retornará un objeto serializable y compatible con JSON.

Los posibles errores que puede dar en el código de error, según sus bytes, serían los siguientes:

  1. Excepción.
  2. URL no definida.
  3. URL nula.
  4. La URL no es un String.
  5. La URL está vacía.
  6. La URL contiene caracteres no válidos.
  7. El Callback no está definido.
  8. El Callback es nulo.
  9. El callback no es una función.
  10. La comunicación fue abortada.
  11. Hubo un error durante el proceso.
  12. Timeout.
  13. Timeout forzado.
  14. Error HTTP.

Managers/Globals

Esta librería se encarga de gestionar las variables globales internas del proyecto AnP, permitiendo un uso general de éstas, tanto interna como externamente. Un ejemplo de variables globales son las dadas a partir de la URL con respecto a la dirección o direcciones registradas en el gestor de rutas.

GlobalsManager.default_overwrite
GlobalsManager.default_overwrite
BooleanobjectprivateGlobalsManager.default_overwritefalse
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina si se permite sobreescribir variables globales ya existentes en la constante globals desde el método add.

GlobalsManager.add
GlobalsManager.add
voidobjectpublicGlobalsManager.addRequiredObject<String, Any|null>|Array<Object<String, Any|null>>inputsNullishBooleanoverwriteFunctioncallback
NameRequiredNullableTypedDefault Value
inputsTrueFalseObject<String, Any|null>|Array<Object<String, Any|null>>
overwriteFalseTrueBoolean
callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Este método objeto permite añadir nuevas variables globales. Si se determina como true el parámetro overwrite éste permitirá sobreescribir el valor de una variable global si ésta ya existe, sino será omitida en dicho caso.

Este método puede ser usado asíncronamente aunque éste funcione plenamente síncrono, para seguir la estructura asíncrona por defecto de los métodos add de AnP.
GlobalsManager.get
GlobalsManager.get
Any|nullobjectpublicGlobalsManager.getString|Array<String>keysNullishAny_default
NameRequiredNullableTypedDefault Value
keysFalseFalseString|Array<String>
_defaultFalseTrueAny
NameRequiredNullableTypedDefault Value

Este método objeto permite coger un valor en base a una o varias claves opcionales y en caso de no existir ninguna de ellas, poder retornar el valor dado en el argumento _default. Si no se le da ninguna clave, éste retornará una copia del diccionario que almacena todas las variables globales.

GlobalsManager.set
GlobalsManager.set
voidobjectpublicGlobalsManager.setRequiredStringkeyRequiredNullishAnyvalue
NameRequiredNullableTypedDefault Value
keyTrueFalseString
valueTrueTrueAny
NameRequiredNullableTypedDefault Value

Este método objeto permite establecer, de forma forzada, exista o no dicha clave entre las variables globales, el valor contra dicha clave.

GlobalsManager.remove
GlobalsManager.remove
voidobjectpublicGlobalsManager.removeRequiredStringkey
NameRequiredNullableTypedDefault Value
keyTrueFalseString
NameRequiredNullableTypedDefault Value

Este método objeto permite eliminar una variable global en base a su clave si ésta existe.

GlobalsManager.process
GlobalsManager.process
StringobjectpublicGlobalsManager.processRequiredStringstringNullishObject<String, Any|null>|Array<Object<String, Any|null>>inputsNullishAny_default
NameRequiredNullableTypedDefault Value
stringTrueFalseString
inputsFalseTrueObject<String, Any|null>|Array<Object<String, Any|null>>
_defaultFalseTrueAny
NameRequiredNullableTypedDefault Value

Este método objeto permite procesar las variables de un String en base al método AnP.string_variables pero extendiendo las variables dadas a las variables globales por defecto. En caso no determinarse el arguimento inputs sólo se usarán las variables globales.

Managers/I18N

Esta librería es la encargada de gestionar los textos internacionalizados de la aplicación que derive del AnP.

I18NManager.sentences
I18NManager.sentences
Object<String, String|Array<String>|null>objectprivateI18NManager.sentences{}
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante es la encargada de almacenar todos los idiomas y sus respectivos textos a partir de dos diccionarios anidados de tal forma que el primer nivel determina la clave del idioma y el segundo almacena las claves con cada uno de los textos en dicho idioma.

  • typejson
  • characters582
  • lines20
{
    "english" : {
        "text_a" : "This is the text A.", 
        "text_b" : "This is the text B.", 
        "text_c" : "This is the text C.", 
        "text_n" : "This is the text N."
    }, 
    "espanol" : {
        "text_a" : "Este es el texto A.", 
        "text_b" : "Este es el texto B.", 
        "text_c" : "Este es el texto C.", 
        "text_n" : "Este es el texto N."
    }, 
    "galego" : {
        "text_a" : "Iste é o texto A.", 
        "text_b" : "Iste é o texto B.", 
        "text_c" : "Iste é o texto C.", 
        "text_n" : "Iste é o texto N."
    }
}

Con esta estructura podemos hacer uso de esta constante a partir de la clave que determine el idioma y la clave que determine el texto.

A la hora de crear un JSON con textos para su carga sobre la aplicación AnP, éstos pueden dividir los textos en bloques a partir de claves que empiecen por el nombre de la aplicación o cualquier otra clave la cual los desarrolladores hagan uso, seguido de un guión bajo; y acabar con un guión bajo acompañado de un start si éste se iniciar o bien de un end si éste se cierra o se termina.

  • typejson
  • characters932
  • lines27

{
    "espanol" : {

        "AnP_grupo_a_start" : null, 
        "text_a_1" : "Este es el texto 1 del grupo A.", 
        "text_a_2" : "Este es el texto 2 del grupo A.", 
        "text_a_3" : "Este es el texto 3 del grupo A.", 
        "text_a_n" : "Este es el texto N del grupo A.", 
        "AnP_grupo_a_end" : null, 

        "AnP_grupo_b_start" : null, 
        "text_b_1" : "Este es el texto 1 del grupo B.", 
        "text_b_2" : "Este es el texto 2 del grupo B.", 
        "text_b_3" : "Este es el texto 3 del grupo B.", 
        "text_b_n" : "Este es el texto N del grupo B.", 
        "AnP_grupo_b_end" : null, 

        "AnP_grupo_c_start" : null, 
        "text_c_1" : "Este es el texto 1 del grupo C.", 
        "text_c_2" : "Este es el texto 2 del grupo C.", 
        "text_c_3" : "Este es el texto 3 del grupo C.", 
        "text_c_n" : "Este es el texto N del grupo C.", 
        "AnP_grupo_c_end" : null

    }
}

de esta forma, a la hora de agregar los nuevos textos, los bloques son ignorados para renderizar el diccionario que los almacena. Esta práctica sólo es para permitir una mejor visualización de los textos.

Los textos pueden ser Array de Strings por el hecho de que éstos pueden estar fragmentados en Arrays dentro de un JSON por facilidad de visualización cara el o los desarrolladores. También pueden ser valores nulos cuando éstos no quieren ser especificados o bien, para hacer uso de claves de bloque.
I18NManager.data
I18NManager.data
Object<String, Object<String, String|Array<String>>>objectprivateI18NManager.data{}
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante contiene la información necesaria para poder trabajar los idiomas interactuables desde el propio GUI pues estos parámetros no pueden ser aplicados en sentences puesto que si cambia el idioma, éstos cambiarían en el propio GUI por dicha referencia, por lo que se establece esta nueva constante para dicho fin. Su estructura son dos dicciomarios anidados donde el primer nivel establece el idioma y el segundo los datos pertinentes del mismo.

  • typejson
  • characters1474
  • lines52
{
    "english" : {
        "flag" : [
            "{anp_root}/images/flags/english.svg", 
            "https://cdn.k3y.pw/data/images/flags/english.svg"
        ],
        "language" : "English",
        "country" : "Unated Kingdom",
        "language_code" : "en",
        "country_code" : "UK"
    }, 
    "espanol" : {
        "flag" : [
            "{anp_root}/images/flags/espanol.svg", 
            "https://cdn.k3y.pw/data/images/flags/espanol.svg"
        ],
        "language" : "Español",
        "country" : "España",
        "language_code" : "es",
        "country_code" : "ES"
    }, 
    "galego" : {
        "flag" : [
            "{anp_root}/images/flags/galego.svg", 
            "https://cdn.k3y.pw/data/images/flags/galego.svg"
        ],
        "language" : "Galego",
        "country" : "España",
        "language_code" : "gl",
        "country_code" : "ES"
    }, 
    "nihongo" : {
        "flag" : [
            "{anp_root}/images/flags/nihongo.svg", 
            "https://cdn.k3y.pw/data/images/flags/nihongo.svg"
        ],
        "language" : "日本語",
        "country" : "日本",
        "language_code" : "jp",
        "country_code" : "JP"
    }, 
    "russkiy" : {
        "flag" : [
            "{anp_root}/images/flags/russkiy.svg", 
            "https://cdn.k3y.pw/data/images/flags/russkiy.svg"
        ],
        "language" : "Pусский",
        "country" : "Россия",
        "language_code" : "ru",
        "country_code" : "RU"
    }
}

Los campos que implementan cada idioma son los siguientes:

  • flag: URL (String) o conjunto de URLs Array alternativas donde las primeras tienen prioridad sobre las segundas para garantizar que alguna de las URL cargue correctamente la bandera.
  • language: Nombre del idioma en el idioma que represente.
  • country: Nombre del país del idioma en el idioma que represente.
  • language_code: Determina el código del lenguaje en ISO 3166-1.
  • country_code: Determina el código del país en ISO 3166-1.
I18NManager.selected
I18NManager.selected
String|nullobjectpublicI18NManager.selectednull
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina la clave del idioma que está seleccionada actualmente en la aplicación AnP, ya sea seleccionada por el usuario o que ésta venga configurada por defecto.

En caso de ser un valor nulo nos indica que éste no está configurado ni seleccionado lo que cuando se va a coger un texto, éste irá con otros parámetros para determinar el idioma o bien, dependerá del orden en el que se constituyan los idiomas dentro del diccionario sentences.
I18NManager.default_language
I18NManager.default_language
String|nullobjectpublicI18NManager.default_languagenull
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina la clave del idioma por defecto configurada por el desarrollador.

En caso de ser un valor nulo nos indica que éste no está configurado ni seleccionado lo que cuando se va a coger un texto, éste irá con otros parámetros para determinar el idioma o bien, dependerá del orden en el que se constituyan los idiomas dentro del diccionario sentences.
I18NManager.default_overwrite
I18NManager.default_overwrite
BooleanobjectpublicI18NManager.default_overwritefalse
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina si cuando se añade una nueva clave de texto a un idioma determinado y éste ya existe, si éste es sobreescrito (true) o no (false)

I18NManager.default_overwrite_data
I18NManager.default_overwrite_data
BooleanobjectpublicI18NManager.default_overwrite_datafalse
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina si cuando se añade una nueva clave de información de idioma orientado al GUI determinado y éste ya existe, si éste es sobreescrito (true) o no (false)

I18NManager.default_text
I18NManager.default_text
String|Array<String>|nullobjectpublicI18NManager.default_text""
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable determina el texto por defecto para los casos donde se quiera recoger un texto concreto y éste no se encuentre y no se le halla determinado un texto de respuesta por defecto.

I18NManager.add
I18NManager.add
String|nullobjectpublicI18NManager.addRequiredString|Object<String, Object<String, String|Array<String>|null>>|ArrayinputsNullishBooleanoverwriteFunctioncallback
NameRequiredNullableTypedDefault Value
inputsTrueFalseString|Object<String, Object<String, String|Array<String>|null>>|Array
overwriteFalseTrueBoolean
callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Método objeto asíncrono que nos permite añadir y sobreescribir idiomas y textos para éstos. La sobreescritura se basa en determinar el argumento overwrite como true.

En lenguajes como Python u otros que pueden determinar cargas externas como síncronas con seguridad, este método podría ser síncrono excepcionalmente a estos casos.
I18NManager.default_text
I18NManager.default_text
String|nullobjectpublicI18NManager.default_textString_default
NameRequiredNullableTypedDefault Value
_defaultFalseFalseString
NameRequiredNullableTypedDefault Value

Método objeto que nos permite recoger un texto por defecto, ya sea que nosotros se lo demos bien, éste retorne el valor de la variable que almacena el propio texto por defecto.

I18NManager.get
I18NManager.get
String|nullobjectpublicI18NManager.getRequiredString|Array<String>keysNullishObject<String, any|null>|Array<Object<String, any|null>>variablesNullishString|Array<String>_defaultString|Array<String>languages
NameRequiredNullableTypedDefault Value
keysTrueFalseString|Array<String>
variablesFalseTrueObject<String, any|null>|Array<Object<String, any|null>>
_defaultFalseTrueString|Array<String>
languagesFalseFalseString|Array<String>
NameRequiredNullableTypedDefault Value

Método objeto que nos permite recoger un texto que estemos buscando, ya sea que éste exista, o le demos un texto por defecto para casos de no existir, o que en caso de no ser ninguna de las anteriores éste retorne el valor de la variable que almacena el texto por defecto. Este método también es capaz de gestionar variables dentro del propio texto devuelto a partir del método AnP:string_variables, encapsulando dentro del propio texto entre llaves, las claves de las variables de las cuales se quieran hacer uso.

En caso de que el texto que se selecciona sea un Array, éste lo unirá con Strings vacíos, es decir, que cada separación del mismo ha de ir con los caracteres correspondientes por defecto, normalmente espacios. De esta forma siempre retornará o un String en caso de ser encontrado un texto; o un vcalor nulo.
El método get tiende a ayudarse de otro método privado que lo acompaña por el hecho de que uno procesa el texto a retornar puesto que hay varias vías por las que puede salir; y el principal se encarga de formatear el texto a un String o a un valor nulo.
I18NManager.update
I18NManager.update
voidobjectpublicI18NManager.update
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Método objeto que nos permite actualizar los textos del GUI. En este caso, pueden existir más de una forma de actualización de los mismos dependiendo del entorno donde se encuentre.

! Este método sólo existe en lenguajes que sean capaces de interactuar con los GUI que vienen a continuación.

Este método saltará automáticamente cada vez que se cambie el idioma de la aplicación si éste posee las condiciones adecuadas para que éste exista y sea tratable en el entorno de aplicación.

HTML

En el entorno HTML de un nqavegador o aplicación basada en WebView, éste buscará dentro del mismo todas las etiquetas que contengan el atributo data-i18n que contiene la clave de texto a la cual hace referencia. Por cada clave encontrada se recogerá el texto en el idioma establecido mediante el método get, y en caso de existir el atributo data-i18n-veriables, ésta se decodificará en un Objeto Clave-Valor donde la clave será el nombre de la variable y el valor, el valor de la propia variable. En caso de existir el atributo data-i18n-without=true, éste no le dará texto internacionalizado a su contenido, únicamente a los atributos que contenga asociados con textos como puede ser alt, title, placeholder*, etc.

Es posible que se pueda considerar un método tosco y poco renderizado para Webs o Aplicaciones Web relativamente grande, sin embargo, hay que contar que cada elemento puede tener su clave y sus condiciones así como sus variables por lo que se decidió establecer este método para realizar dicha tarea.
I18NManager.create
I18NManager.create
voidobjectpublicI18NManager.create
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Este método objeto nos permite crear un selector de idiomas en base a los idiomas implementados en la constante sentences en los entornos que permitan GUI en base a los siguientes que están implementados, retornando el código directo u objeto inicialmente no anidado en el GUI para ser implementado donde el desarrollador desee.

La estructura GUI de este elemento no es más que un selector desplegable donde por defecto sólo muestra el idioma seleccionado pero cuando el puntero o mediante Touch, éste es pulsado, se desplieguen todos los idiomas establecidos en la aplicación para ser seleccionado por el usuario.

! Una vez seleccionado un idioma distinto al que está implementado en ese momento, éste actualizará todos los textos del GUI automáticamente mediante el método update.

Cada idioma estará formateado en base a un formato String con las siguientes variables a usar, las cuales se especificarán en dicho String de formato encapsulándolas entre llaves:

  • frag: Determina el Path o URL de la bandera que represente al país y/o idioma.
  • name: Determina la clave String del idioma.
  • language: Determina el nombre del idioma en el idioma al que hace referencia.
  • country: Determina el nombre del país en el idioma a la que hace referencia.
  • language_code: Determina el código del lenguaje en ISO 3166-1.
  • country_code: Determina el código del país en ISO 3166-1.
Salvo la clave name, que viene siendo un recurso común, la clave del propio idioma, todas las demás claves vienen del diccionario de la constante data.
HTML

En el entorno HTML se creará un element UL que alberba la selección de los idiomas mediante objetos LI, uno por cada idioma, y se determinará el idioma seleccionado mediante el atributo data-selected=true. Su dinamismo se basa plenamente en SASS/CSS.

En la estructura base de una Aplicación Web vía AnP, éste aparecerá en la esquina inferior derecha del GUI, en el Footer de la aplicación.
I18NManager.change
I18NManager.change
IntegerobjectpublicI18NManager.changeRequiredStringlanguage
NameRequiredNullableTypedDefault Value
languageTrueFalseString
NameRequiredNullableTypedDefault Value

Este método objeto nos permite cambiar el idioma de la aplicación actual al idioma que represente la clave dada. Éste analizará posibles errores los cuales se almacenan binariamente en un valor numérico entero cuyos bits representan:

  1. Excepción.
  2. La clave del idioma no está definido.
  3. La clave del idioma es nulo.
  4. La clave del idioma no es un String.
  5. La clave del idioma tiene caracteres no válidos.
  6. La clave del idioma no es conocido en sentences.
  7. La clave del idioma es la misma que la del idioma seleccionado actualmente.

Si no posee ningún error, es decir, que le código de error es 0, éste cambiará el idioma de la aplicación, y en caso de tener GUI, cambiará el idioma en todos los selectores de idioma que pueda haber en el GUI y en los elementos del GUI Internacionalizados.

I18NManager.add_data
I18NManager.add_data
String|nullobjectpublicI18NManager.add_dataRequiredString|Object<String, Object<String, String|Array<String>>>|ArrayinputsNullishBooleanoverwriteFunctioncallback
NameRequiredNullableTypedDefault Value
inputsTrueFalseString|Object<String, Object<String, String|Array<String>>>|Array
overwriteFalseTrueBoolean
callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Método objeto asíncrono que nos permite añadir y sobreescribir datos de idioma orientados al GUI sobre la constante data.

Managers/PrintTypes

Esta librería se encarga de gestionar los tipos de mensajes impresos contra el terminal o la consola.

PrintTypesManager.types
PrintTypesManager.types
Array<Array<String>>objectprivatePrintTypesManager.types[ ["unkn", "unknown"], [" ok ", "ok", "yes", "y", "right"], ["warn", "warning"], ["erro", "error", "no", "n", "wrong"], ["exce", "exception"], ["info", "information"], ["test"], ["time"]
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

]

Esta constante objeto privada contiene todos los tipos de impresión sobre terminal o consola registrados, en conjunto con sus aliases. Por defecto nos encontramos los siguientes tipos:

  • unkn (Desconocido): Este tipo es usado por defecto para cualquier tipo desconocido especicado en el método _print.
  • ok: Este tipo es para determinar un mensaje cuyo resultado fue el esperado.
  • warn (Aviso): Este tipo se usa para advertir de algo. No tiene porque ser un error o algo que sea un problema, simplemente es una advertencia para controlar o avisar de algo concreto.
  • error: Este tipo es para definir un error que sea no sólo una advertencia, sino que hay una alta probabilidad de que sea un problema cara la ejecución de una tarea.
  • exception: Este tipo es para definir una excepción controlada dentro del código.
  • info: Este tipo es para informar de algo simplemente.
  • test: Este tipo es para determinar que el mensaje o contenido que se expone es una prueba, normalmente de caracter temporal o que no fue eliminada en su release.
  • time: Este tipo es para determinar que se muestra un tiempo, normalmente de ejecución para tener un control de rendimiento de algo.
A todos estos tipos se les puede añadir más tipos y aliases.

La clave de trabajo de los tipos es el elemento 0 de cada uno de los tipos, y éste aparecerá en mayúsculas. El resto de opciones dentro del mismo Array son aliases del mismo.

Es de vital importancia que el primer elemento, el que define el nombre del tipado sea de 4 caracteres fijos pues será el usado para la consola o terminal y si se quiere mantener un estilo o estructura éste ha de ser de 4 caracteres, independientemente de cuales pues se usará una fuente monoespaciada para estos entornos Core.
PrintTypesManager.add
PrintTypesManager.add
voidobjectpublicPrintTypesManager.addRequiredString|Array<Array<String>|Array<Array<String>>|String>inputsFunctioncallback
NameRequiredNullableTypedDefault Value
inputsTrueFalseString|Array<Array<String>|Array<Array<String>>|String>
callbackFalseFalseFunction
NameRequiredNullableTypedDefault Value

Este método sirve para añadir nuevos tipos de impresión de mensajes en consola o terminal, así como añadir nuevos aliases tanto a los nuevos como a los ya existentes. Su funcionamiento se basa en encontrar estructuras que definan tipos, el cual es una anidación bidimensional de Arrays donde el segundo nivel contenga Strings, que vienen siendo las claves que definen los tipos y los aliases. En caso de existir el primer elemento de un Array, el resto se añadirán como aliases a éste si éstos no en ningún otro tipado.

PrintTypesManager.get
PrintTypesManager.get
voidobjectpublicPrintTypesManager.getRequiredStringkeys
NameRequiredNullableTypedDefault Value
keysTrueFalseString
NameRequiredNullableTypedDefault Value

Este método sirve para coger el nombre real en Upper Case de un tipo de mensaje de impresión sobre consola o terminal a partir de su nombre o alias. Se le puede poner más de una opción para conseguir dicho valor.

Application/Binary

Esta librería es un conjunto de métodos que nos permiten operar a ciertos niveles con valores numéricos sobre binarios, ya sean fragmentados en Bytes como en un valor numérico entero.

Esta librería, pese a tener un constructor, es de las pocas que pueden decirse que son estáticas de uso global y común, es decir, no requiere de la creación de un objeto que contenga sus operaciones sino que simplemente llamando a sus métodos ya sería capaz de aportar las operaciones que ésta contiene.
Binary.get_object
Binary.get_object
ObjectstaticpublicBinary.get_objectRequiredUint8Array|Array<TinyInt>binaryRequiredArray<Array<String, String, Integer>>map
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array|Array<TinyInt>
mapTrueFalseArray<Array<String, String, Integer>>
NameRequiredNullableTypedDefault Value

Este método público estático nos permite crear un objeto anónimo con claves y valores definidos sobre el argumento map que mapea dichos datos secuencialmente ordenados contra los datos binarios establecidos en el argumento binary. El mapeado de los datos consta de un Array cuyos valores son otro Array con los siguientes datos:

  • name: Este valor no es más que un String que representa el nombre o clave del elemento que se quiere extraer.
  • type: Este valor es un String que representa un tipo de dato que se quiere extraer. Dichos datos pueden ser los siguientes:
    • string: Representa un valor de tipo String.
    • integer: Representa un valor de tipo numérico entero.
    • bytes: Representa un valor en Bytes.
    • bool: Representa un valor Booleano.
  • bytes: Número de Bytes que ocupa dicho valor.
Los tipos de valores que se representan con esos nombres representan realmente un método público estático de Binary que se coge a partir de su prefijo get_, por lo que un valor de tipo string sería para llamar al método Binary:get_string.

El campo type del mapeado de los datos a extraer puede ser una función, la cual representará la acción a llevar a cabo para procesar esos datos.

Por otro lado, el campo bytes del mapeado de los datos a extraer puede ser una función que determine como retorno el número de Bytes a coger dentro del valor binario.

Binary.get_string
Binary.get_string
StringstaticpublicBinary.get_stringRequiredUint8Array|Array<TinyInt>binary
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array|Array<TinyInt>
NameRequiredNullableTypedDefault Value

Este método público estático nos permite coger un String a partir del conjunto de Bytes dado por el valor binario.

Binary.get_integer
Binary.get_integer
IntegerstaticpublicBinary.get_integerRequiredUint8Array|Array<TinyInt>binary
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array|Array<TinyInt>
NameRequiredNullableTypedDefault Value

Este método público estático nos permite coger un valor numérico entero a partir del conjunto de Bytes dado por el valor binario.

Este método es peligroso a la hora de usar binarios que excedan del límite seguro de la mantisa del procesador en los lenguajes basados en éstos. Este concepto cambia en lenguajes que procesan de una forma lógica dichos valores como sucede con Python. Además, el rango de seguridad puede variar según lenguaje, pudiendo dar valores totalmente inesperados.
Binary.get_bytes
Binary.get_bytes
Array<TinyInt>staticpublicBinary.get_bytesRequiredUint8Array|Array<TinyInt>binary
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array|Array<TinyInt>
NameRequiredNullableTypedDefault Value

Este método público estático nos permite coger Bytes en un Array de enteros pequeños de 8 bits a partir del conjunto de Bytes dado por el valor binario.

Binary.get_bool
Binary.get_bool
BooleanstaticpublicBinary.get_boolRequiredUint8Array|Array<TinyInt>binary
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array|Array<TinyInt>
NameRequiredNullableTypedDefault Value

Este método público estático nos permite coger el valor Booleano a partir del conjunto de Bytes dado por el valor binario. Independientemente de su longitud, si todos los Bytes que lo representan son 0, éste retornará false, en caso contrario retornará true.

Binary.get_bits
Binary.get_bits
Integer|nullstaticpublicBinary.get_bitsRequiredUint8Array|Array<TinyInt>|Integerbinary
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array|Array<TinyInt>|Integer
NameRequiredNullableTypedDefault Value

Este método público estático nos permite coger el número de Bits que compone el valor binario dado. En caso de no ser un tipado conocido éste retornará null.

Binary.reset
Binary.reset
Uint8ArraystaticpublicBinary.resetRequiredUint8ArraybinaryRequiredIntegerstartIntegerlength11
NameRequiredNullableTypedDefault Value
binaryTrueFalseUint8Array
startTrueFalseInteger
lengthFalseFalseInteger1
NameRequiredNullableTypedDefault Value
Binary.reset
Array<TinyInt>staticpublicBinary.resetRequiredArray<TinyInt>binaryRequiredIntegerstartIntegerlength11
NameRequiredNullableTypedDefault Value
binaryTrueFalseArray<TinyInt>
startTrueFalseInteger
lengthFalseFalseInteger1
NameRequiredNullableTypedDefault Value
Binary.reset
IntegerstaticpublicBinary.resetRequiredIntegerbinaryRequiredIntegerstartIntegerlength11
NameRequiredNullableTypedDefault Value
binaryTrueFalseInteger
startTrueFalseInteger
lengthFalseFalseInteger1
NameRequiredNullableTypedDefault Value

Este método público estático nos permite resetear un rango de Bits de un binario dado por el argumento binary desde la posición dada por el argumento start hasta el número de Bits que se determinan en la longitud mediante el argumento opcional length.

Managers/Events

Esta librería es un recurso pseudoexterno el cual permite crear un objeto de gestión de eventos, pero a requerir de la implementación del objeto AnP original con su primer argumento, se considera que es pseudoexterno pues no pertenece propiamente al objeto AnP pero sí es implementado y fundamental en éste y pertenece, no sólo por filosofía, al propio proyecto AnP.

El sistema se basa en un Array que almacena los Callbacks ordenadamente, cuya posición es su ID. Para evitar un uso excesivo de memoria con este objeto, éste se encarga de ir cubriendo y vaciando el Array de almacenamiento en base a:

  • Al crubrir, busca un espacio vacío donde almacenar el nuevo Callback. Si éste no lo encuentra lo añadirá al final como un nuevo elemento del Array.
  • Al eliminar lo único que hace es cambiar el valor, eliminando la función del Callback en la posición asignada (su ID) y lo cambia por un valor null.

De esta forma se reutilizan los espacios y la asignación de memoria, pese a no ser la más eficiente, es la más óptima en relación recursos de proceso y memoria.

El último análisis, en el último párrafo, se da en las circunstancias en las que fue usada la librería, pero esto a futuro puede cambiar según se vaya planteando, por ejemplo, teniendo un espacio de memoria en un Array que determine la posición en base a un Array de dos claves.
Es muy importante destacar que este objeto no es un objeto normal de AnP, por lo que no tiene funciones ni gestión de inicio y fin, y es con fines de proceso síncrono. Para asincronizarlo tendríamos que hacer uso de recursos externos como Intervalos, hilos o eventos asíncronos y sólo sería gestionable para su método execute.
EventsManager.events
EventsManager.events
Array<Function|null>objectprivateEventsManager.events[]
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante objeto privada se encarga de almacenar los eventos para su futura ejecución o gestión según necesidades del entorno que lo aplique.

EventsManager.execute
EventsManager.execute
voidobjectpublicEventsManager.execute...Any|nullarguments
NameRequiredNullableTypedDefault Value
argumentsFalseFalse...Any|null
NameRequiredNullableTypedDefault Value

Este método objeto público permite ejecutar todos los Callbacks registrados en la variable interna events de una sóla llamada con los argumentos unificados.

Este método no tiene una forma iniciar de detención por lo que una vez se ejecuta se requiere de la espera de que termine la ejecución completa de todos los Callbacks.
Si un Callback da una excepción, éste saltará como no controlado y detendrá el proceso en ese punto específico, donde si es el hilo principal detendrá por completo la aplicación.
EventsManager.add
EventsManager.add
IntegerobjectpublicEventsManager.addRequiredFunctionmethod
NameRequiredNullableTypedDefault Value
methodTrueFalseFunction
NameRequiredNullableTypedDefault Value

Este método objeto público permite añadir un nuevo método Callback al evento y retornará su ID en base a su posición dentro del Array que almacena los Callback del evento.

EventsManager.remove
EventsManager.remove
voidobjectpublicEventsManager.removeRequiredIntegeri
NameRequiredNullableTypedDefault Value
iTrueFalseInteger
NameRequiredNullableTypedDefault Value

Este método objeto público permite eliminar un Callback del evento si éste existe en base a su ID de posición dentro del Array.

Application/HTMLPreload

HTMLPreload
HTMLPreloadglobalpublicHTMLPreloadRequiredAnPanpRequiredString|HTMLElementselectorNullishFunctioncallbackObject<String, Any|null>|Array<Object<String, Any|null>>inputs
NameRequiredNullableTypedDefault Value
anpTrueFalseAnP
selectorTrueFalseString|HTMLElement
callbackFalseTrueFunction
inputsFalseFalseObject<String, Any|null>|Array<Object<String, Any|null>>
NameRequiredNullableTypedDefault Value

Esta librería es un sistema pseudoexterno al objeto AnP resultante del proyecto AnP, usadopara precargar o acceder a objetos HTML ya sea de forma asíncrona como síncrona si éste ya existe. Requiere de enviársele sí o sí el objeto AnP para que éste pueda operar pues depende de los métodos públicos de éste para funcionar, motivo por el cual se establece que es un sistema pseudoexterno al objeto AnP. Para hacerlo funcionar es necesario crearlo como objeto donde se requiera su uso.

Esta librería permite en muchos casos su reutilización mediante un nuevo inicio de la misma pues una vez acaba la precarga, ya sea de una forma existosa o no.
HTMLPreload.OK
HTMLPreload.OK
IntegerstaticpublicHTMLPreload.OK0
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código de una ejecución correcta frente al estado registrado en el objeto.

HTMLPreload.EXCEPTION
HTMLPreload.EXCEPTION
IntegerstaticpublicHTMLPreload.EXCEPTION1 << 0
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que hubo una excepción durante la ejecución de la precarga según el estado del objeto.

HTMLPreload.SUCCESS
HTMLPreload.SUCCESS
IntegerstaticpublicHTMLPreload.SUCCESS1 << 6
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que la precarga se ejecutó correctamente según el estado del objeto.

HTMLPreload.NO_SELECTOR
HTMLPreload.NO_SELECTOR
IntegerstaticpublicHTMLPreload.NO_SELECTOR1 << 7
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que no se especificó ni selector ni objeto HTML según el estado del objeto.

HTMLPreload.BAD_SELECTOR
HTMLPreload.BAD_SELECTOR
IntegerstaticpublicHTMLPreload.BAD_SELECTOR1 << 8
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que el selector dado está mal según el estado del objeto.

HTMLPreload.TIMEOUT
HTMLPreload.TIMEOUT
IntegerstaticpublicHTMLPreload.TIMEOUT1 << 9
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que el tiempo de precarga se excedió sin éxito según el estado del objeto.

HTMLPreload.ABORTED
HTMLPreload.ABORTED
IntegerstaticpublicHTMLPreload.ABORTED1 << 10
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que la precarga fue abortada según el estado del objeto.

HTMLPreload.LOADING
HTMLPreload.LOADING
IntegerstaticpublicHTMLPreload.LOADING1 << 11
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que aún está el proceso de la precarga activo según el estado del objeto.

HTMLPreload.STOPPED
HTMLPreload.STOPPED
IntegerstaticpublicHTMLPreload.STOPPED1 << 12
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que el proceso de la precarga está detenido según el estado del objeto.

HTMLPreload.NO_CALLBACK
HTMLPreload.NO_CALLBACK
IntegerstaticpublicHTMLPreload.NO_CALLBACK1 << 13
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que el objeto no posee Callback según el estado del objeto.

HTMLPreload.ASYNCHRONOUS_SUCCESS
HTMLPreload.ASYNCHRONOUS_SUCCESS
IntegerstaticpublicHTMLPreload.ASYNCHRONOUS_SUCCESS1 << 14
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que el proceso de precarga se completo correctamente de forma asíncrona según el estado del objeto.

HTMLPreload.NO_STRING_SELECTOR
HTMLPreload.NO_STRING_SELECTOR
IntegerstaticpublicHTMLPreload.NO_STRING_SELECTOR1 << 15
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta constante estática determina el código que dicta que el selector dado tampoco es un Selector HTML según el estado del objeto.

HTMLPreload.timeout
HTMLPreload.timeout
IntegerobjectprivateHTMLPreload.timeout2000
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable objeto privada determina el tiempo máximo de intento de precarga de un Selector sobre el HTML actual.

HTMLPreload.autostart
HTMLPreload.autostart
BooleanobjectprivateHTMLPreload.autostarttrue
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable objeto privada determina si la precarga empieza automáticamente con la creación del objeto o no.

HTMLPreload.status
HTMLPreload.status
IntegerobjectpublicHTMLPreload.status0
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta variable objeto pública determina el código de estado de como está la precarga. Dichos estados se representan mediante un valor numérico entero cuyos Bits representan, de forma binaria, cada uno de los estados en los que se puede hallar. Dichos estados son los siguientes:

  1. Excepción.
  2. El Callback no está definido.
  3. El Callback es nulo.
  4. El selector no está definido.
  5. El selector es nulo.
  6. Reservado.
  7. La precarga fue realizada con éxito.
  8. No se especificó ni selector ni objeto HTML.
  9. El selector está mal.
  10. Se excedió el tiempo de precarga.
  11. La precarga fue abortada.
  12. La precarga está activa.
  13. La precarga fue detenida.
  14. No hay Callback.
  15. El proceso de precarga correcto asíncronamente.
  16. El selector no es un String.
HTMLPreload.status
HTMLPreload.status
IntegerobjectpublicHTMLPreload.status
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta método objeto público determina el código de estado de como está la precarga. Dichos estados se representan mediante un valor numérico entero cuyos Bits representan, de forma binaria, cada uno de los estados en los que se puede hallar. Dichos estados son los siguientes:

  1. Excepción.
  2. El Callback no está definido.
  3. El Callback es nulo.
  4. El selector no está definido.
  5. El selector es nulo.
  6. Reservado.
  7. La precarga fue realizada con éxito.
  8. No se especificó ni selector ni objeto HTML.
  9. El selector está mal.
  10. Se excedió el tiempo de precarga.
  11. La precarga fue abortada.
  12. La precarga está activa.
  13. La precarga fue detenida.
  14. No hay Callback.
  15. El proceso de precarga correcto asíncronamente.
  16. El selector no es un String.
HTMLPreload.abort
HTMLPreload.abort
BooleanobjectpublicHTMLPreload.abort
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta método objeto público permite abortar el proceso de precarga si éste se encuentra activo. Su respuesta permite ver si ha sido realizado con éxito o no. Para ver el estado es necesario hacer uso del método status.

HTMLPreload.stop
HTMLPreload.stop
BooleanobjectpublicHTMLPreload.stop
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta método objeto público permite detener el proceso de precarga si éste se encuentra activo. Su respuesta permite ver si ha sido realizado con éxito o no. Para ver el estado es necesario hacer uso del método status.

Aunque tenga distinto código de estado, éste funciona como el método abort.
HTMLPreload.retry
HTMLPreload.retry
BooleanobjectpublicHTMLPreload.retry
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Esta método objeto público permite, independientemente de su estado, el reintento de precarga. Su respuesta permite ver si ha sido realizado con éxito o no. Para ver el estado es necesario hacer uso del método status.

Ya se encarga de iniciar el proceso de precarga una vez detenido todo el proceso actual de forma automática.

Application/Attributes

Esta librería está construida con el propósito de gestionar de una manera más manejable y dinámica los atributos de los elementos y objetos HTML, pero sigue dejando hacer uso de los métodos DOM estándar de JavaScript y mediante String.

Esta librería se basa en instrucciones preprogramadas las cuales quizás no contengan todos los elementos de las reglas de los atributos HTML por lo que pueden salir resultados inesperados con el uso de esta librería fuera de los fines a los que fue orientado. Es de vital importancia para el uso de esta librería seguir la filosofía de desarrollo de AnP y configurar bien esta misma librería.
Attributes.standard
Attributes.standard
Array<String>objectprivateAttributes.standard[
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

]

Esta constante privada determina la clave de todos los atributos considerados estándar de HTML a uso de AnP y las versiones HTML de trabajo del mismo.

Cualquier nombre que no salga en esta lista se entenderá que no pertenece al estándar HTML y para poder estandarizar dicho nombre se le añadirá, si no lo tiene ya o en su defecto aria-, el prefijo data-. Esta casuística puede causar que un atributo no registrado quedaría desconocido para AnP y cuando se trabaje esta librería dar como resultado que se le añada de forma inesperada el propio data-.

ECMAScript/JavaScript

El lenguaje ECMAScript/JavaScript está orientado principalmente cara el GUI cliente por el ámbito de los navegadores Web o simplemente, reunir un conjunto de librerías útiles para desarrollo desde el lado cliente de un navegador. Cara lo que es el lenguaje ECMAScript/JavaScript, se usa la cabecera de función "use strict" por el hecho de asegurar una estructura más rígida para encontrar posibles fallos de funcionamiento y evitar el uso de nomenclaturas problemáticas, por lo que desde el propio desarrollo de AnP, lo aconsejamos encarecidamente.

Sí es cierto que existen los WASM, sin embargo, lo que se pretende con este proyecto es que los proyectos que partan de éste queden totalmente accesibles a los clientes para que éstos sepan qué se hace sobre su lado, para ser lo más transparentes posibles con el entorno de ejecución mismo del cliente.

Común

Casi todos los archivos ECMA vienen con una estructura tal como se presenta a continuación:

  • typejs
  • characters1055
  • lines51
/** @typedef {import("../Application/AnP.ecma.js").AnP} AnP */

/**
 * @constructor
 * @param {!AnP} anp 
 * @param {!(Object.<string, any|null>|Array.<Object.<string, any|null>>)} [inputs] 
 * @returns {void}
 * @access public
 */
const ObjectClass = function(anp, inputs){
    "use strict";

    /** @type {ObjectClass} */
    const self = this;
    /** @type {boolean} */
    let started = false;

    /**
     * @returns {void}
     * @access private
     */
    const constructor = () => {};

    /**
     * @param {!anp_start_callback} [callback] 
     * @returns {boolean}
     * @access public
     */
    this.start = callback => {

        /**
         * @param {anp_start_callback} status 
         * @returns {void}
         */
        const end = status => AnP.prototype.execute(callback, status);

        if(started){
            end(false);
            return false;
        };
        started = true;

        AnP.prototype.launch(self, [/* Local objects keys */], () => end(true));

        return true;
    };

    constructor();

};

AnPScriptsLoader.ecma.js

El AnPScriptsLoader es clase almacenada en la librería con el mismo nombre dentro de los Scripts ECMAScript/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.

AnPScriptsLoader
AnPScriptsLoaderglobalpublicAnPScriptsLoaderRequiredNullishObject<String, Any|null>|String|Integer|BooleaninputsRequiredFunctionCallbackcallback
NameRequiredNullableTypedDefault Value
inputsTrueTrueObject<String, Any|null>|String|Integer|Boolean
callbackTrueFalseFunctionCallback
NameRequiredNullableTypedDefault Value
FunctionCallback
voidglobalpublicFunctionCallback
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

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". Dicha asincronicidad se basaría en dos procesos anidados uno dentro de otro donde el primero determina el nivel y el segundo los ficheros a cargar en dicho nivel, permitiendo con ello gestionar las dependencias en cargad e una forma adecuada. Un ejemplo de orden de carga por niveles donde cada nivel irá sucesivo al siguiente pero los archivos que éste posea se cargarán conjuntamente independientemente del orden sería el siguiente:

  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
Este mismo sistema puede aplicarse perfectamente a los estilos.

Esta librería está diseñada principalmente para la carga del Framework AnP y proyectos heredados que puedan pertenecer al mismo ecosistema, pero eso no quita que pueda ser usado para cargar asíncronamente otros conjuntos de librerías. Para poder iniciar un proyecto a partir de la carga de dichos ficheros se puede hacer de la siguiente manera:

  • typehtml
  • characters2843
  • lines60
<!DOCTYPE html>
<html lang="es">
    <head>
        <title>Test - AnPScriptsLoader</title>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />

        <script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" src="https://anp.k3y.pw/ecma/AnPScriptsLoader.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>

        <script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" charset="utf-8">

            /** @type {AnPScriptsLoader} */
            new AnPScriptsLoader({
                styles : [
                    "https://cdn.k3y.pw/css/Roboto.v30.local.css", 
                    "https://cdn.k3y.pw/css/RobotoMono.v23.local.css", 
                    "https://cdn.k3y.pw/css/FA6F.v6.5.2.local.css", 
                    "https://anp.k3y.pw/scss/AnPWeb.css", 
                    "https://wmarkdown.k3y.pw/css/WMarkDown.icons.FontAwesome.css", 
                    "https://wmarkdown.k3y.pw/css/WMarkDown.web.icons.css", 
                    "https://wmarkdown.k3y.pw/scss/WMarkDown.scss", 
                    "https://cdn.k3y.pw/data/styles/Highlight.v11.10.0.min.css"
                ], 
                scripts : [[
                    "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/tex-mml-chtml.v3.2.2.js", 
                    "https://cdn.k3y.pw/data/scripts/mermaid.v10.9.1.min.js"
                ], [
                    "https://anp.k3y.pw/ecma/Application/AnP.ecma.js"
                ], [
                    "https://anp.k3y.pw/ecma/Managers/Settings.ecma.js", 
                    "https://anp.k3y.pw/ecma/Application/URI.ecma.js", 
                    "https://anp.k3y.pw/ecma/Managers/Globals.ecma.js", 
                    "https://anp.k3y.pw/ecma/Managers/I18N.ecma.js", 
                    "https://anp.k3y.pw/ecma/Managers/PrintTypes.ecma.js", 
                    "https://anp.k3y.pw/ecma/Managers/Threads.ecma.js", 
                    "https://anp.k3y.pw/ecma/Application/Attributes.ecma.js", 
                    "https://anp.k3y.pw/ecma/Application/HTMLPreload.ecma.js"
                ], [
                    "/ecma/Components/Base.ecma.js"
                ]]
            }, () => {

                /** @type {WMarkDown} */
                const wmarkdown = new WMarkDown({dictionary : "https://wmarkdown.k3y.pw/json/WMarkDown.dict.es.kyman.json"});

                // TODO
            });

        </script>

    </head>
    <body>
        <!-- TODO -->
    </body>
</html>

Por otro lado, tenemos la opción de hacer una carga dinámica y asíncrona completamente bajo ECMAScript/JavaScript de la siguiente manera:

  • typejs
  • characters576
  • lines25
"use strict";

/** @type {number} */
const preload = setInterval(() => {

    /** @type {HTMLHeadElement|null} */
    const head = document.querySelector("head");

    if(!head)
        return;
    clearInterval(preload);

    /** @type {HTMLScriptElement} */
    const script = head.appendChild(document.createElement("script"));

    script.setAttribute("https://anp.k3y.pw/ecma/AnPScriptsLoader.ecma.js");
    script.onload = () => new AnPScriptsLoader({
        mode : "wmarkdown", 
        styles : ["/scss/AnPWeb.css"]
    }, () => {
        // TODO
    });

}, 100);

Este método dinámico de creación del objeto está diseñado principalmente para casos de entornos de desarrollo donde el dominio es dependiente del entorno de pruebas o el entorno de producción, entre otras posibilidades que puedan surgir dependiendo del servidor, como el hecho de que el AnP esté SelfHosteado. Al entenderse que este Script se ejecuta sobre el HTML de forma directa, éste pueda resumirse de la siguiente forma:

  • typehtml
  • characters1269
  • lines36
<!DOCTYPE html>
<html lang="es">
    <head>
        <title>Test - AnPScriptsLoader</title>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />

        <script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" charset="utf-8">

            /** @type {string} */
            const domain = window.location.href.match(/^[^\:]+\:\/{2}([^\/]+)/)[1], 
                  /** @type {HTMLScriptElement} */
                  script = document.querySelector("head").appendChild(document.createElement("script"));

            script.setAttribute("https://anp." + domain + "/ecma/AnPScriptsLoader.ecma.js");
            script.onload = () => new AnPScriptsLoader({
                domain : domain, 
                mode : "wmarkdown", 
                styles : ["/scss/AnPWeb.css"]
            }, () => {

                /** @type {WMarkDown} */
                const wmarkdown = new WMarkDown({dictionary : "https://wmarkdown." + domain + "/json/WMarkDown.dict.es.kyman.json"});

                // TODO
            });

        </script>

    </head>
    <body>
        <!-- TODO -->
    </body>
</html>

Este es el motivo por el cual puedan existir proyectos que contengan dichas estructuras para hacer control del dominio entre otras cosas.

Parámetros de entrada

La creación del objeto AnPScriptsLoader que gestiona dicha precarga asíncrona tiene los siguientes parámetros de configuración los cuales se integran dentro de un diccionario:

  • domain (String = k3y.pw): Determina el dominio del cual se cargan Scripts como los del AnP, WMarkDown, ErrorsManager, etc.
  • mode (String): Determina el modo de trabajo para determinar los Scripts y estilos por defecto los cuales adjuntar.
  • scripts (Array): Determina los Scripts a cargar.
  • styles (Array): Determina los estilos a cargar.
  • allow_print (Boolean = true): Verifica si se permite la impresión de los resultados de carga en la consola del navegador o no.
  • maximum_tryes (Integer = 5): Determina el número de intentos máximos para cargar un archivo antes de desestimar su carga.
Estos parámetros de entrada en el diccionario pueden ser ampliados y utilizados en los Links de Scripts y estilos para definir elementos concretos. Ésto se analizará más adelante.
A continuación se definirán ciertos conceptos de la entrada de parámetros pero no todos pues se definirán en otro punto más adelante.

El dominio (domain) se define como parámetro para que los archivos por defecto imlpementados en el modo (mode) de trabajo se determine el origen delos ficheros por el hecho de que éstos pueden estar en entorno local, como los ficheros del propio AnP por si el desarrollador o entidad tienen en Self Hosting dichos contenidos o proyectos. Si no se define, por defecto será k3y.pw.

Por otro lado, la librería está diseñada para avisar vía Consola del Navegador del estado de las cargas de los ficheros, pero es un elemento opcional que por defecto está habilitado y está definido en el parámetro allow_print, donde podemos definirlo como false para deshabilitarlo.

Finalmente, es importante entender que los ficheros pueden dar problemas a la hora de ser cargados por varios motivos, algunos de ellos pueden ser los siguientes:

  • El ancho de banda del servidor está limitado y un exceso de peticiones puede retornar una respuesta con error HTTP.
  • Al realizarse múltiples peticiones simultáneas desde el mismo sitio puede dar como respuesta por parte del servidor una limitación de respuestas sin error, ya sea para proteger al propio servidor de un posible ataque DDOS o por limitaciones técnicas del mismo.
  • La propia aplicación de servicio de servidor Web puede estar limitada a un consumo limitado de peticiones simultáneas limitando sus respuestas sin error.

Por este motivo existe la posibilidad de reintentar la carga de los ficheros mediante el parámetro maximum_tryes, el cual está configurado a un máximo de 5 intentos por fichero, pero dicho valor puede ser alterado implementando dicho parámetro en la entrada de parámetros de la librería.

Es importante tener en cuenta que las peticiones pueden tener un retraso elevado, sobretodo si se espera con un Timeout muy elevado, por lo que implementar una alta cantidad de intentos puede relentizar enormemente la carga de la Web por culpa de ciertos recursos ahí establecidos.
Gestión de ficheros y modos

Los ficheros que se gestionan en esta librería son meros Scripts ECMAScript/JavaScript y ficheros de estilos CSS. La carga de dichos ficheros se basa en la creación de un elemento en la cabecera HTML de tipo SCRIPT en el caso de los Scripts ECMAScript/JavaScript; y en el caso de los archivos CSS con la etiqueta HTML LINK. Dichas etiquetas contienen una serie de atributos para definir dichos ficheros, las cuales serían las siguientes:

  • typehtml
  • characters839
  • lines13

<!-- Etiqueta para un archivo SASS/SCSS. -->
<link type="text/css;charset=utf-8" data-language="SASS/CSS3" rel="stylesheet" href="ARCHIVO.css" data-scss="ARCHIVO.scss" data-css-map="ARCHIVO.css.map" data-crossorigin="anonymous" charset="utf-8" />

<!-- Etiqueta para un archivo CSS. -->
<link type="text/css;charset=utf-8" data-language="CSS3" rel="stylesheet" href="ARCHIVO.css" data-crossorigin="anonymous" charset="utf-8" />

<!-- Etiqueta para un archivo ECMAScript. -->
<script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" src="ARCHIVO.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>

<!-- Etiqueta para un archivo JavaScript. -->
<script data-type="text/javascript;charset=utf-8" data-language="JavaScript 1.8.5" src="ARCHIVO.js" data-crossorigin="anonymous" charset="utf-8"></script>

Las etiquetas están expuestas a vulnerabilidad pues les faltan atributos como integrity para determinar que el fichero cargado es el original, entre otras posibilidades, pero por dificultades a la hora de definirlo de una forma simplista se optó por la omisión de dicho parámetro, lo mismo que aislar mediante el prefijo data- el atributo crossorigin.
Los atributos data-type y data-language vienen del estándar antiguo de HTML4 y el antiguo XHTML, hablamos de la época del motor Trident MSIE6 del Internet Explorer, donde se establecían ciertos atributos informativos para la ayuda a interpretar los contenidos, sobretodo siendo una época donde había ciertas capacidades de los navegadores a interpretar otros lenguajes. Estas etiquetas las guardamos de forma simbólica mediante el prefijo data-, pero son totalmente omitibles, pero forzados internamente por defecto por la librería.

Como podemos observar por la construcción de las etiquetas, esta librería distingue los archivos de estilos compilados SASS de los archivo no compilados íntegramente CSS, lo mismo que los archivos de Scripts ECMAScript de los íntegramente JavaScript. En todos estos casos se distinguen internamente por la extensión utilizada en dichos ficheros. De esta forma tendríamos la siguiente relación en base a su extensión:

  • .scss: Sería para definir archivos compilados mediante SASS. Los atributos data-scss y data-css-map son simplemente informativos a desarrolladores y curiosos suponiendo que se usen compiladores como RubySass y de esta forma, ser lo más transparente posible con los recursos utilizados en el proyecto.
  • .css: Sería para definir archivos íntegramente desarrollados en CSS puro.
  • .ecma.js: Sería para definir archivos que no sean puramente JavaScript, teniendo elementos que pertenezcan al estándar de ECMA antes que de JavaScript clásico.
  • .js: Sería para definir un Script JavaScript íntegramente con esta filosofía.
La diferencia que se destaca aquí entre el JavaScript y el ECMAScript es la sintaxis y recursos utilizados pues el ECMAScript está más definido a entornos NodeJS o equivalentes, y el JavaScript para el navegador principalmente, aunque eso no quita que parte de los estándarse de JavaScript para navegadores admitan recursos de NodeJS entre otros.
AnPScriptsLoader.prototype.FILES

Sabiendo ya dichas propiedades de los ficheros entramos en la propiedad anteriormente mencionada la cual viene siendo la distribución de los ficheros mediante niveles según hereden los unos de los otros. Para empezar, hemos de aclarar si usamos los modos de trabajo para hacer uso de AnP, éstos pueden condicionar el nivel en el cual establecer nuestros ficheros. Para entender esto mejor, a continuación se expone esta constante.

AnPScriptsLoader.prototype.FILES
Object<String, Object<String, Array<Array<String>>>>objectpublicAnPScriptsLoader.prototype.FILES
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value
Se pone constante en cursiva para indicar que sólo es informativo puesto que a la hora de definir una propiedad de un tipado basado en una función éstas no poseen dichas propiedades estáticas en ECMASCript/JavaScript.
  • typejs
  • characters2293
  • lines62
"use strict";

/** @type {Object.<string, Object.<string, Array.<Array.<string>>>>} */
AnPScriptsLoader.prototype.FILES = {
    settings : {
        scripts : [[
            "https://errorsmanager.{domain}/ecma/ErrorsManager.ecma.js"
        ], [
            "https://anp.{domain}/ecma/Application/AnP.ecma.js"
        ], [
            "https://anp.{domain}/ecma/Managers/Settings.ecma.js", 
            "https://anp.{domain}/ecma/Application/URI.ecma.js", 
            "https://anp.{domain}/ecma/Managers/Globals.ecma.js"
        ]]
    }, 
    i18n : {
        dependences : ["settings"], 
        scripts : [[], [], [
            "https://anp.{domain}/ecma/Managers/I18N.ecma.js"
        ]]
    }, 
    core : {
        dependences : ["i18n"], 
        scripts : [[], [], [
            "https://anp.{domain}/ecma/Managers/PrintTypes.ecma.js", 
            "https://anp.{domain}/ecma/Managers/Threads.ecma.js"
        ]]
    }, 
    gui : {
        dependences : ["core"], 
        styles : [[
            "https://anp.{domain}/scss/AnP.scss", 
            "https://anp.{domain}/css/AnP.icons.css"
        ]], 
        scripts : [[], [], [
            "https://anp.{domain}/ecma/Application/Attributes.ecma.js", 
            "https://anp.{domain}/ecma/Application/HTMLPreload.ecma.js"
        ], [
            "https://anp.{domain}/ecma/Components/Base.ecma.js"
        ]]
    }, 
    wmarkdown : {
        dependences : ["gui.scripts"], 
        styles : [[
            "https://cdn.{domain}/css/Roboto.v30.local.css", 
            "https://cdn.{domain}/css/RobotoMono.v23.local.css", 
            "https://cdn.{domain}/css/FA6F.v6.5.2.local.css", 
            "https://wmarkdown.{domain}/css/WMarkDown.icons.FontAwesome.css", 
            "https://wmarkdown.{domain}/css/WMarkDown.web.icons.css", 
            "https://wmarkdown.{domain}/scss/WMarkDown.scss", 
            "https://cdn.{domain}/data/styles/Highlight.v11.10.0.min.css"
        ]], 
        scripts : [[
            "https://cdn.{domain}/data/scripts/Highlight.v11.10.0.min.js", 
            "https://cdn.{domain}/data/scripts/tex-mml-chtml.v3.2.2.js", 
            "https://cdn.{domain}/data/scripts/mermaid.v10.9.1.min.js"
        ], [
            "https://wmarkdown.{domain}/ecma/WMarkDown.ecma.js"
        ]]
    }
};

Las URL de los ficheros vemos que tienen claves encapsuladas entre llaves, en este caso {domain}. Esto indica una variable dentro del texto, y se resolverá con respecto a lo que tenga la entrada de valores del objeto que gestiona la carga: el AnPScriptsLoader. En este caso, el parámetro domain se puede especificar directamente en la entrada o éste quedaría por defecto como k3y.pw. Se pueden usar variables con cualquier clave, pero éstas han de estar definidas en la entrada de parámetros, de lo contrario, aparecerán tal cual se dejan, pudiendo ocasionar respuestas inesperadas.

Como podemos observar, aquí tenemos definidos los modos de la carga de los ficheros los cuales pueden ser alterados o ampliados mediante el uso del diccionario que contiene AnPScriptsLoader.prototype.FILES. Cada modo es otro diccionario el cual posee las siguientes claves:

  • dependences: Nos indica si éste hereda de uno o varios otros modos, añadiendo los ficheros que éste posee al conjunto de los otros, en el orden de niveles establecido.
  • styles: Este elemento contienen todos los archivos de estilos ordenados por niveles.
  • scripts: Este elemento contienen todos los archivos de Scripts ordenados por niveles.

Los niveles vienen siendo un Array bidimensional donde su Array anidado es un nivel con todos los archivos que éste posee; y el Array maestro contiene todos los niveles de ficheros. Si nosotros queremos agregar un fichero al segundo nivel, primero hemos de indicar el primer nivel, aunque éste esté vacío para establecer dónde implementarlo cara sus dependencias. Si no tiene dependencias en el caso de agregar elementos en el segundo o mayor nivel, estando el o los primeros niveles vacíos, éstos se ignorarán ante la carga, pero existirán por la posibilidad de que dicho modo pueda ser usado como dependencia de otro.

No se habla del orden en el que se meten los archivos dentro de un nivel porque se entiende que la dependencia es con otros ficheros no pertenencientes a este nivel, sino a niveles anteriores.
El primer nivel será siempre para archivos no dependientes de otros.
En caso de haber más niveles de los que quiero definir en un modo en sus dependencias, los niveles que excedan de los definidos no es necesario establecerlos. Véase el modo wmarkdown el cual se sitúa al final.

Cada modo está orientado a una función concreta las cuales son:

  • settings: Este modo es para cargar únicamente el AnP para uso básico de elementos estáticos y la gestión de configuración y carga de ficheros.
  • i18n: Este modo amplía el modo settings con la capacidad de poder gestionar también textos internacionalizados.
  • core: Este modo habilita todas las capacidades del AnP en modo Core, es decir, todas aquellas librerías que no trabajen de forma directa el GUI y puedan ser implementadas en entornos de texto, terminal, consola o simple apoyo Background.
  • gui: Este modo habilita todas las capacidades Core y de GUI del AnP.
  • wmarkdown: Este modo habilita todas las capacidades del Core y del GUI de AnP conjunto con todas las capacidades Web cliente del WMarkDown para páginas Web y gestión de contenidos mediante este lenguage de marcas.

Application/AnP.ecma.js

Esta librería es la encargada de contener todos aquellos elementos: funciones, variables y métodos comunes a todas las librerías del Framework de AnP, la cual representa, en el desarrollo de estructuras comunes, (../../common/application.anp). A mayores de lo que vemos en la documentación general, tenemos las siguientes estructuras específicas para ECMAScript/JavaScript.

AnP.prototype.RE_STACK_TRACE
AnP.RE_STACK_TRACE
RegExpstaticpublicAnP.RE_STACK_TRACE/\s*at\s+(([^\s]+)\s+\()?(([^\(\)\:]+\:)?[^\(\)\:]+)(\:([0-9]+)\:[0-9]+)?\)?|([^\@]+)\@([^:]+\:[^\:]+)\:([0-9]+)\:[0-9]+/
NameRequiredNullableTypedDefault Value
NameRequiredNullableTypedDefault Value

Este valor estático representa un patrón regular para desglosar cada una de las líneas de traza según intérprete Webkit o Gecko. Sin este patrón regular, la extracción de los datos necesarios para visualizar el Print cara la consola y/o terminal sería imposible por el hecho de que las trazas retornan un objeto que está compuesto principalmente de un String que requiere de ser desestructurado para poder extraer los datos que se requieren para el trabajo del mismo unificado a todos los lenguajes que se vayan a trabajar en este proyecto.

Para entender mejor este patrón regular, lo estructuraremos en dos constrantes en el siguiente fragmento de código:

  • typejs
  • characters202
  • lines5
"use strict";

const re_stack_trace_webkit = /\s*at\s+(([^\s]+)\s+\()?(([^\(\)\:]+\:)?[^\(\)\:]+)(\:([0-9]+)\:[0-9]+)?\)?/;
const re_stack_trace_gecko = /([^\@]+)\@([^:]+\:[^\:]+)\:([0-9]+)\:[0-9]+/;

Bugs y errores

En este apartado se publicarán los Bugs y errores encontrados con su estado actual de cómo se encuentran dentro del desarrollo. Si el Bug o error fue reportado por alguien ajeno, éste irá indicado en el reporte.

Este proyecto está siendo desarrollado por una única persona por lo que es fácil que muchos reportes no salgan o salgan a cuentagotas en base a las posibilidades que el equipo de desarrollo pueda ir disponiendo.

Cargas HTTP incompletas

Srx00
Al cargar los archivos en HTTP sobre Web desde el servidor Python, en algunos casos éstos no cargan o cargan parcialmente. El error puede estar o en el propio Python a la hora de gestionar las peticiones individuales o bien, la forma de pedir los ficheros desde el propio AnPLoader.
  • Localizar el error.
  • Arreglo del error.
Srx00
El problema tenía varios factores: el primero de todos es el sistema de carga no controlado de una forma eficiente, es decir, se redundaba código entre las cargas de y gestión de las mismas entre los Scripts y los Estilos; y para continuar, se hacían cargas simultáneas que sobrecargaban modo DDOS el servidor por dicha falta de control por lo que una reiteración asíncrona cuyo tiempo de ejecución ya hace de factor Delta para aleatorizar cambio en tiempo lo arregla. Desde hecho dichos cambios, el problema desapareció y no hace uso del reintento de coger los Scripts por lo que también se sofocó el indirecto autoataque DDOS. Con esto determinamos que el problema no estaba en el Socket Python.
Srx00
Al ir a una URL con Link interno Hash, independientemente de ID para HTML5 como de A NAME para el resto, en carga no baja al recurso que se desea, sólo baja una vez cargada la Web.
  • Localizar el error.
  • Arreglo del error.
Srx00
En realidad es que éste no está corregido sino que la carga es algo lenta y pseudodinámica lo que impide que el navegador haga bien dicha tarea por lo que se optó por hacer uso del precargador del menú principal de la Web WMarkDown para determinar fin de carga y forzar la posición del Hash URL dentro de la Web.

Donaciones

Este proyecto es plenamente gratuito pues es un proyecto orientado a complementar otros proyectos de los mismos desarrolladores. No tiene ningún plan de ingresos ni pasivos ni activos más allá de lo que se expone en este título. Si alguien quisiere colaborar en que este proyecto no sólo esté abierto por requisitos de los autores, sino también cara un mantenimiento hacia terceros, a continuación presentamos unas direcciones de Cryptoactivos donde se podrá donar sin ninguna cuantía mínima establecida.

Mientras no halla ninguna condición de recursos que impida el mantenimiento gratuito de este servicio, éste permanecerá mantenido y público independientemente de los ingresos obtenidos a partir de los donativos.
Los usuarios que colaboren y quieran ser referenciados, éstos serán referenciados en este apartado mediante un Quote de comentario de usuario con el Nick y avatar correspondiente, pero sólo en caso de que ellos quieran aparecer aquí.
Se mantendrá informados a los usuarios de todo aquel donativo dado y la cantidad económica adquirida, y será publicado su uso y tenencia para que halla constancia pública del uso que se le dé a dichos recursos.
Srx00
Quería agredecer de forma personal aquellas aportaciones que serán bien recibidas y valoradas para este proyecto, ya sea como valor simbólico como de mantenimiento. Así, que desde el desarrollo y como desarrollador de este proyecto, muchas gracias a todos aquellos que ponen su granito de arena para este proyecto y por lo tanto, en pro de todos. Muchas gracias, de verdad.

Balance

A continuación se mostrará una tabla de balance con respecto a las cantidades y usos dados.

ActivoCantidadMotivoUsuarioCantidad total actual
BTC0 BTCInicio del contador de unidades de BTC.0 BTC
LTC0 LTCInicio del contador de unidades de LTC.0 LTC
DOGE0 DOGEInicio del contador de unidades de DOGE.0 DOGE
DASH0 DASHInicio del contador de unidades de DASH.0 DASH
FAIR0 FAIRInicio del contador de unidades de FAIR.0 FAIR
ActivoCantidadMotivoUsuarioCantidad total actual

Cómputo total actual en tenencia.

ActivoCantidadNúmero de Operaciones
BTC0 BTC0
LTC0 LTC0
DOGE0 DOGE0
DASH0 DASH0
FAIR0 FAIR0
ActivoCantidadNúmero de Operaciones

Donantes

A continuación, los comentarios de los donantes.