[[post_data {
    "author" : "KyMAN",
    "since" : 20210825,
    "version" : 20210825
}]]
# Arrancar cliente

El entorno cliente del AnP se basa en JavaScript, JSON y CSS. Dentro de estos elementos podremos
seleccionar el nivel de profundidad que queremos gestionar para nuestra aplicación distinguiendo en
este caso 2 modos principales:

- **Librerías**: Modo en el que solo carcamos librerías de interés de uso general.
- **Framework**: Modo completo de la aplicación con carga sobre un entorno servidor.

Para cualquiera de los modos anteriores, nos hace falta crear un fichero HTML donde cargar dichos
elementos, donde tendremos una parte que serán los propios estilos, si éstos queremos importarlos,
que sería las etiquetas LINK; y los elementos JS en las etiquetas SCRIPT. Un ejemplo estructural
podría ser el siguiente:

```html
<!DOCTYPE html>
<html lang="es" dir="ltr">
    <head>
        <title>Example</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" />
        <link rel="icon" href="/images/logo-32.png" sizes="32x32" />
        <link rel="icon" href="/images/logo-192.png" sizes="192x192" />
        <link rel="icon" href="/images/logo-512.png" sizes="512x512" />
        <link rel="apple-touch-icon-precomposed" href="/images/logo-180.png" />
        <meta name="msapplication-TileImage" content="/images/logo-270.png" />

        <meta name="licence:text" content="© 2020-2021 CopyLeft. GPLv3" />
        <meta name="licence:link" content="https://www.gnu.org/licenses/gpl-3.0.txt" />
        <meta name="licence:icon" content="https://www.gnu.org/graphics/gplv3-88x31.png" />

        <meta name="xdoc:link" content="https://example.k3y.pw/" />
        <meta name="xdoc:author" content="KyMAN" />
        <meta name="xdoc:since" content="20210826" />
        <meta name="xdoc:version" content="20210826" />
        <meta name="xdoc:access" content="public" />

        <link type="text/css" rel="stylesheet" data-language="CSS3" href="https://cdn.k3y.pw/css/fonts/local/Roboto.css" data-crossorigin="anonymous" charset="utf-8" />
        <link type="text/css" rel="stylesheet" data-language="CSS3" href="https://cdn.k3y.pw/css/fonts/local/RobotoMono.css" data-crossorigin="anonymous" charset="utf-8" />
        <link type="text/css" rel="stylesheet" data-language="CSS3" href="https://cdn.k3y.pw/css/fonts/local/FontAwesome5Free.css" data-crossorigin="anonymous" charset="utf-8" />

        <link type="text/css" rel="stylesheet" data-language="SASS/CSS3" href="/scss/AnPRM.css" data-css-map="/scss/AnPRM.css.map" data-scss="/scss/AnPRM.scss" data-crossorigin="anonymous" charset="utf-8" />
        <link type="text/css" rel="stylesheet" data-language="CSS3" href="/anp/css/AnP.icons.css" data-crossorigin="anonymous" charset="utf-8" />
        <link type="text/css" rel="stylesheet" data-language="CSS3" href="/css/AnPRM.icons.css" data-crossorigin="anonymous" charset="utf-8" />

        <style data-type="text/css" data-rel="stylesheet" data-language="CSS3" charset="utf-8">

            html,body{
                height : 100%;
                margin : 0px;
                overflow : hidden;
            }

        </style>

        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Ajax.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Settings.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.I18N.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Threads.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Preload.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Attributes.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Components.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/comp/AnP.Components.Images.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/comp/AnP.Components.Files.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/comp/AnP.Components.Selectors.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/comp/AnP.Components.Forms.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/comp/AnP.Components.Tables.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/comp/AnP.Components.Calendars.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Sessions.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Base.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Errors.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Views.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/anp/ecma/AnP.Routes.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>

        <script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Example.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>

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

            example = new AnP({
                object_name : "example",
                default_settings_files : ["/anp/json/AnP.settings.json", "/json/Example.settings.json"]
            }, Example);

        </script>

    </head>
    <body></body>
</html>
```

En este ejemplo cargamos todas las librerías al completo y las usamos totalmente cara el cliente.

## Modo librerías

Este modo nos permite hacer cargas individuales de componentes concretos del Framework, por ejemplo,
si queremos simplemente usar el sistema de hilos simplemente habríamos de cargar el AnP,
AnP.Settings y el AnP.Threads puesto que Threads usa los Settings y ambos pertenecen al AnP.

> [[! note NOTA]]: Es importante destacar que las librerías básicas de funcionamiento son
AnP.ecma.js, AnP.Ajax.ecma.js, AnP.Settings.ecma.js y AnP.I18N.ecma.js.

## Modo Frameowrk

El modo Framework usa la gran mayoría de las librerías para ofrecer una serie de servicios en
conjunto para la creación de una aplicación diferenciada por niveles de la comunicación con VVC cara
el cliente; VPC contra el el servidor; y luego un sistema completo y autónomo cara los datos.

Para poder iniciar el modo Framework es necesario crear, en el directorio público del servidor, un
directorio para los ficheros JSON (Internacionalización, configuración, rutas y vistas mayormente);
otro para los Scripts (ECMA y JS); otro para los estilos (SASS para estilos generales y CSS para
iconografía); y otro para las imágenes (El logo, entre otras). A mayores también nos harán falta un
fichero HTML donde cargar la aplicación; un "wmd.php" para actualizar el WMarkDown de la misma; y el
"git_update.php" para actualizar desde el servidor sin necesidad de acceder directamente al mismo.

Para empezar, los ficheros JSON que nos hacen falta serían el de la I18N con los idiomas concretos
que queramos montar con una estructura de doble diccionario anidado donde la clave del primer nivel
del diccionario representa la llave interna del idioma; y el segundo nivel serían como llave la
llave propia de la frase o texto a internacionalizar, y el valor como texto en el idioma en el que
nos encontremos. Un ejemplo puede ser el siguiente:

```json
{
    "english" : {
        "example_1" : "This is the first example of the I18N text.",
        "name" : "Name",
        "name_description" : "The name of the field."
    },
    "espanol" : {
        "example_1" : "Este es el primer ejemplo del texto I18N.",
        "name" : "Nombre",
        "name_description" : "El nombre del campo."
    },
    "galego" : {
        "example_1" : "Iste é o primeiro exemplo do texto I18N.",
        "name" : "Nome",
        "name_description" : "O nome do campo."
    }
}
```

Los ficheros se pueden dividir en más de uno, no solo por idiomas, sino que de un mismo o más
idiomas pueden existir varios ficheros los cuales pueden ser cargados.

> [[! note NOTA]]: El orden en que se pongan los ficheros de la I18N será crucial a la hora de
posibles sobreescrituras.

A continuación tendríamos el archivo de configuración, el cual contendrá todos los parámetros de
configuración del AnP que se quieran customizar o asegurar con un valor concreto sobre nuestra
aplicación. Un ejemplo de ello puede ser el siguiente:

```json
{
    "i18n_files" : [
        "/anp/json/AnP.i18n.english.json",
        "/anp/json/AnP.i18n.espanol.json",
        "/anp/json/AnP.i18n.galego.json",
        "/anp/json/AnP.i18n.nihongo.json",
        "/anp/json/AnP.i18n.russkie.json",
        "/json/Example.i18n.json"
    ],
    "class" : "example",
    "application_name" : "Example",
    "application_url" : "https://example.k3y.pw",
    "application_git" : "https://git.k3y.pw/AnP/Example",
    "application_logo" : "/images/logo.png",
    "main_menu_items" : [
        {"i18n" : "home", "icon" : "home", "url" : "#/", "target" : "_self", "permissions" : ["registered"]}
    ],
    "default_views_files" : [
        "/anp/json/Example.views.json"
    ],
    "default_routes_files" : ["/anp/json/AnP.routes.json", "/json/Example.routes.json"],
    "ajax_variable_name" : "example"
}
```

En este caso se establece en el servidor, por extensión de la URL (Cabecera URI que se explica en
Python o PHP, dependiendo del servidor que se esté usando) "/anp" el servidor de elementos públicos
del propio AnP, quedando libre la raiz para los elementos propios de nuestra aplicación, por eso, la
I18N origen del AnP sale sobre "/anp".

Otro elemento importante es la clase para diferenciar este programa puesto que el AnP permite
múltiples aplicaciones en un mismo marco HTML.

A continuación, se ponen los atributos propios de programa (Nombre, URL y Git).

> [[! note NOTA]]: Cuidado con la URL, que será usada en el logo de la aplicación. En ciertas
ocasiones compensa tener la URL "#" por el hecho de ser el propio elemento raíz de la aplicación, y
así no afectar a la misma.

Luego se configuran los elementos del menú principal (Menú que se encuentra, si no se cambia la
estética del AnP, en la parte superior del programa, entre el logo y el panel del usuario).

Luego tendríamos los archivos de las vistas y las rutas que las gestionan, con el nombre de la
variable HTTP usado para enviar la información al servidor.

> [[! note NOTA]]: Es importante destacar que se han de sobreescribir las rutas públicas del AnP y
sus posibles extensiones si las hubiere, para dejar el raiz libre para nuestra aplicación, cambiando
los parámetros "default" de los archivos a cargar que dependan de las URL.

El siguiente archivo sería el de las rutas, el cual no ha de tocarse nada por defecto, sólo añadir
las rutas que queramos añadir a nuestra aplicación siguiendo la estructura de un Array de Strings
JSON donde cada String tendría una ruta URI que será la interpretada por la parte Hash de la URL; y
separado por un espacio, la vista a la que atacar. Un ejmplo de ello puede ser:

```json
[
    "/test/view test_view"
]
```

Cambiando a los ficheros ECMA o JS, requerimos de crear un fichero JS que cree la clase maestra de
nuestro proyecto, el resto de ficheros JS, o son ficheros de operaciones comunes o específicas o
serán los ViewController de las vistas que operan directamente entre las vistas y el servidor a
partir del propio AnP. Por ejemplo:

<table style="width:100%;">
    <thead>
        <tr>
            <th style="width:50%;">JavaScript 1.8</th>
            <th style="width:50%;">ECMAScript 2015</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>

```js
Example = function(input){

    var selt = this;

    var construct = function(){};

    construct();

};

```

            </td>
            <td>

```js
Example = function(input){

    const selt = this;

    const construct = () => {};

    construct();

};

```

            </td>
        </tr>
    </tbody>
</table>

Para iniciar la aplicación sobre el AnP, se usa un pequeño Script incrustado en el HTML, el cual ya
fue mostrado en el apartado del archivo HTML necesario para arrancar el sistema, el cual podría ser
como el siguiente:

```js
example = new AnP({
    object_name : "example",
    default_settings_files : ["/anp/json/AnP.settings.json", "/json/Example.settings.json"]
}, Example);
```

# Customizar estilos

Para customizar los estilos hemos de incluir los SASS originales en un nuevo fichero SASS a
excepción del de configuración ("AnP.Settings.scss"), y crear en su lugar, un nuevo archivo de
configuración con los mismos parámetros, pero alterando los que nos interesen. A mayores, hemos de
usar el orden de prioridad de CSS para sobreescribir los estilos o no incluir los ficheros que
queramos crear de 0 nosotros mismos.

[[html_data {
    "title" : "Documentación - Crear proyecto Python AnP",
    "url" : "https://anp.k3y.pw/es/py/run.html",
    "author" : "Tarsier, angelus, inoro, KyMAN",
    "since" : 20210825,
    "version" : 20210825,
    "key_words" : "anp,attach,play,attach&play,documentación,python,crear,proyecto,correr,run",
    "description" : "Creación de un proyecto Python en AnP.",
    "project" : "AnP",
    "logo" : "https://anp.k3y.pw/images/anp.png",
    "language" : "es"
}]]
