2016-09-18 10:37:21 +00:00
|
|
|
/****************************************************/
|
|
|
|
/* _ _ _____ ___ _ ___ _______ __ */
|
|
|
|
/* | | | |_ _|_ _| | |_ _|_ _\ \ / / */
|
|
|
|
/* | | | | | | | || | | | | | \ V / */
|
|
|
|
/* | |_| | | | | || |___ | | | | | | */
|
|
|
|
/* \___/ |_| |___|_____|___| |_| |_| */
|
|
|
|
/****************************************************/
|
|
|
|
var refObject = function(variable){ this.value = variable; };
|
|
|
|
|
|
|
|
refObject.prototype = {
|
|
|
|
value: this.value,
|
|
|
|
get: function(){ return this.value; },
|
|
|
|
set: function(variable){ this.value = variable; },
|
|
|
|
valueOf: function(){ return this.get(); }
|
|
|
|
};
|
|
|
|
|
|
|
|
// alias
|
|
|
|
var ref = function(variable){ return new refObject(variable); };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************************************/
|
|
|
|
/* _____ ___ ____ __ __ ____ _ _ ___ _ ____ _____ ____ */
|
|
|
|
/* | ___/ _ \| _ \| \/ | | __ )| | | |_ _| | | _ \| ____| _ \ */
|
|
|
|
/* | |_ | | | | |_) | |\/| |_____| _ \| | | || || | | | | | _| | |_) | */
|
|
|
|
/* | _|| |_| | _ <| | | |_____| |_) | |_| || || |___| |_| | |___| _ < */
|
|
|
|
/* |_| \___/|_| \_\_| |_| |____/ \___/|___|_____|____/|_____|_| \_\ */
|
|
|
|
/************************************************************************************/
|
|
|
|
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
/* CONSTRUCTEUR -> INITIALISE UNE L'INSTANCE
|
|
|
|
*
|
|
|
|
* @form_object<Object> Objet définissant le formulaire
|
|
|
|
*
|
|
|
|
*/
|
2016-09-18 10:37:21 +00:00
|
|
|
var FormBuilder = function(form_object){
|
2016-09-16 14:52:41 +00:00
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
/* On définit le formulaire (sous forme de description formelle) */
|
2016-09-16 14:52:41 +00:00
|
|
|
this.form_object = form_object;
|
2016-09-18 10:37:21 +00:00
|
|
|
|
2016-09-15 17:53:51 +00:00
|
|
|
};
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
/************************************************************************/
|
|
|
|
/* _ _____ _____ ____ ___ ____ _ _ _____ _____ ____ */
|
|
|
|
/* / \|_ _|_ _| _ \|_ _| __ )| | | |_ _| ____/ ___| */
|
|
|
|
/* / _ \ | | | | | |_) || || _ \| | | | | | | _| \___ \ */
|
|
|
|
/* / ___ \| | | | | _ < | || |_) | |_| | | | | |___ ___) | */
|
|
|
|
/* /_/ \_\_| |_| |_| \_\___|____/ \___/ |_| |_____|____/ */
|
|
|
|
/************************************************************************/
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
/* DEFINITION DES ATTRIBUTS
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
FormBuilder.prototype = {
|
|
|
|
form_object: this.form_object, // objet permettant la construction du formulaire
|
|
|
|
defs_object: {}, // objet des définitions des éléments
|
2016-09-18 10:37:21 +00:00
|
|
|
parent_element: null, // element qui contiendra le formulaire
|
|
|
|
built_form: null, // Object correspondant au formulaire construit
|
|
|
|
root_element: null // Element correspondant à l'objet construit
|
2016-09-17 10:40:29 +00:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* DEFINITION DES ATTRIBUTS STATIQUES
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
FormBuilder.regex = {
|
2016-09-17 16:44:17 +00:00
|
|
|
reg_in_key: /^\/\^(.+)\$\/$/, // Regex associée à une "regex" incluse dans une clé
|
|
|
|
reg_out_val: /\{(\$[1-9])\}/, // Regex associée à la valeur du dernier match de "regex"
|
|
|
|
|
|
|
|
pri_out_val: /\{([a-z-]+)\}/g, // Regex associée à une variable primitif à remplacer
|
|
|
|
pri_in_key: /^\$([a-z-]+)$/, // Regex associée à la clé d'une variable primitive
|
|
|
|
arr_out_set: /^\{\{([a-z-]+)\}\}$/, // Regex associée à un tableau à remplacer
|
|
|
|
arr_out_val: /\{([a-z-]+)\.([a-z-]+)\}/g, // Regex associée à une valeur de tableau à remplacer (primitif)
|
|
|
|
arr_in_key: /^\$\$([a-z-]+)$/ // Regex associée à la clé d'un tableau
|
2016-09-17 10:40:29 +00:00
|
|
|
};
|
|
|
|
|
2016-09-17 14:04:03 +00:00
|
|
|
FormBuilder.spread_attr = [ // Liste des attributs diffusant le scope
|
|
|
|
'children', // diffuse aux éléments
|
|
|
|
'next_nodes', // diffuse aux éléments
|
|
|
|
'prev_nodes', // diffuse aux éléments
|
2016-09-17 16:44:17 +00:00
|
|
|
'attributes', // diffuse aux attributs
|
|
|
|
'node_link'
|
2016-09-17 14:04:03 +00:00
|
|
|
];
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
FormBuilder.allowed_attr = [ // Liste des attributs fixes autorisés
|
|
|
|
'node', /* nom du modèle à utiliser (dans @defs_object) */
|
|
|
|
'node_type', /* nom réel de l'élément */
|
|
|
|
'next_nodes', /* tableau des enfants à ajouter à la suite de l'élément */
|
|
|
|
'prev_nodes', /* tableau des enfants à ajouter à avant l'élément */
|
|
|
|
'attributes', /* tableau des attributs à passer au niveau inférieur */
|
|
|
|
'children', /* tableau des enfants à passer au niveau inférieur */
|
|
|
|
'text', /* texte à insérer (innerHTML), REMPLACE 'children' */
|
|
|
|
'repeat' /* nombre/tableau déterminant qu'il faut répéter @n fois ou en fonction de la taille du tableau */
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************/
|
|
|
|
/* __ __ _____ _____ _ _ ___ ____ ____ */
|
|
|
|
/* | \/ | ____|_ _| | | |/ _ \| _ \/ ___| */
|
|
|
|
/* | |\/| | _| | | | |_| | | | | | | \___ \ */
|
|
|
|
/* | | | | |___ | | | _ | |_| | |_| |___) | */
|
|
|
|
/* |_| |_|_____| |_| |_| |_|\___/|____/|____/ */
|
|
|
|
/************************************************************/
|
|
|
|
|
|
|
|
/* AJOUTE UNE DEFINITION
|
|
|
|
*
|
|
|
|
* @def_object<Object> Objet de définition
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
FormBuilder.prototype.add_definition = function(def_object){
|
|
|
|
|
|
|
|
/* [1] On ajoute la définition
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
for( var key in def_object )
|
|
|
|
this.defs_object[key] = def_object[key];
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* ON CONSTRUIT L'OBJET (avant la construction)
|
|
|
|
*
|
|
|
|
* @scope<Object> for( key in object ){
|
|
|
|
[OPT] Objet contenant les variables à passer
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
FormBuilder.prototype.build = function(scope){
|
|
|
|
/* [0] Gestion du paramètres
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
scope = (scope == null) ? {} : scope;
|
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
/* [1] On clone l'object
|
|
|
|
=========================================================*/
|
|
|
|
this.built_form = JSON.parse(JSON.stringify(this.form_object));
|
|
|
|
|
|
|
|
/* [2] On formatte l'objet
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
// - Ajout des références children[n].parent vers élément parent
|
|
|
|
// - Ajout des références element.node_link vers définition (en fonction de element.node)
|
2016-09-18 10:37:21 +00:00
|
|
|
this.built_form = FormBuilder.formatFormObject(this.built_form, this.defs_object);
|
2016-09-17 10:40:29 +00:00
|
|
|
|
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
/* [3] On remplace les valeurs
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-18 10:37:21 +00:00
|
|
|
this.built_form = FormBuilder.replaceStatements(this.built_form, scope, this.defs_object);
|
2016-09-15 17:53:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
/* CONSTRUIT LES DOM ASSOCIE A L'OBJET CONSTRUIT
|
|
|
|
*
|
|
|
|
* @parent<Element> Element auquel rattacher le formulaire
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
FormBuilder.prototype.attach = function(parent){
|
|
|
|
/* [0] Initialisation
|
|
|
|
=========================================================*/
|
|
|
|
/* (1) Gestion du paramètre @parent */
|
|
|
|
if( !(parent instanceof Element) && this.parent_element == null )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
this.parent_element = (parent instanceof Element) ? parent : this.parent_element;
|
|
|
|
|
|
|
|
|
|
|
|
/* [1] Chapter Title
|
|
|
|
=========================================================*/
|
|
|
|
|
|
|
|
}
|
2016-09-17 10:40:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
/************************************************/
|
|
|
|
/* ____ _____ _ _____ ___ ____ */
|
|
|
|
/* / ___|_ _|/ \|_ _|_ _/ ___| */
|
|
|
|
/* \___ \ | | / _ \ | | | | | */
|
|
|
|
/* ___) || |/ ___ \| | | | |___ */
|
|
|
|
/* |____/ |_/_/ \_\_| |___\____| */
|
|
|
|
/************************************************/
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
/* FORMATTE L'OBJET DE DESCRIPTION DU FORMULAIRE
|
|
|
|
*
|
2016-09-17 10:40:29 +00:00
|
|
|
* @object<Object> Objet dans lequel remplacer les valeurs
|
|
|
|
* @defs<Object> Objet de définition des nodes
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @desc
|
|
|
|
* 1. Ajoute l'attribut PARENT aux enfants pour qu'ils puisse accéder à l'élément parent
|
|
|
|
* 2. Ajout l'attribut NODE_LINK aux éléments afin de lier leur définition en fonction de la valeur de 'node'
|
|
|
|
*
|
2016-09-16 14:52:41 +00:00
|
|
|
*/
|
2016-09-17 10:40:29 +00:00
|
|
|
FormBuilder.formatFormObject = function(object, defs){
|
2016-09-16 14:52:41 +00:00
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
|
2016-09-18 09:29:46 +00:00
|
|
|
/* [1] Pour chaque enfant, s'il y a
|
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
if( object.hasOwnProperty('children') ){
|
2016-09-15 17:53:51 +00:00
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
for( var child in object.children ){
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
/* On ajoute le parent + on lance récursivement */
|
2016-09-16 14:52:41 +00:00
|
|
|
object.children[child].parent = object;
|
2016-09-17 10:40:29 +00:00
|
|
|
FormBuilder.formatFormObject(object.children[child], defs);
|
2016-09-16 14:52:41 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
}
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
return object;
|
2016-09-15 17:53:51 +00:00
|
|
|
};
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
/* CHERCHE UNE DEFINITION CORRESPONDANT A L'ATTRIBUT 'node'
|
2016-09-17 08:02:22 +00:00
|
|
|
*
|
2016-09-17 10:40:29 +00:00
|
|
|
* @node<String> Nom du node pour lequel trouver la définition
|
|
|
|
* @defs<Object> Objet de définition
|
|
|
|
*
|
|
|
|
* @return node_definition<Object> Retourne la définition pour le 'node' en question
|
|
|
|
* ou NULL si on ne trouve rien
|
2016-09-17 08:02:22 +00:00
|
|
|
*
|
|
|
|
*/
|
2016-09-17 10:40:29 +00:00
|
|
|
FormBuilder.fetchNodeDefinition = function(node, defs){
|
|
|
|
/* [0] Initialisation
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
var m = null, key, i, regex;
|
2016-09-17 16:44:17 +00:00
|
|
|
r = FormBuilder.regex.reg_in_key;
|
2016-09-17 10:40:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* [1] Si la définition existe, on la retourne
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
|
|
|
if( typeof defs != 'undefined' && defs.hasOwnProperty(node) ){
|
2016-09-17 10:40:29 +00:00
|
|
|
|
2016-09-18 08:48:39 +00:00
|
|
|
return { def: defs[node] };
|
2016-09-17 10:40:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* [2] Sinon, on cherche une REGEX
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
}else{
|
|
|
|
|
|
|
|
// Pour chaque définition
|
|
|
|
for( key in defs ){
|
|
|
|
|
|
|
|
/* (2.1) On regarde s'il n'y a pas de REGEX dans la clé
|
|
|
|
---------------------------------------------------------*/
|
|
|
|
if( r.test(key) ){
|
|
|
|
|
|
|
|
// On construit la regex
|
|
|
|
regex = new RegExp( key.slice(1, -1) );
|
|
|
|
|
|
|
|
/* (1) Si la regex match */
|
|
|
|
if( (m=regex.test(node)) ){
|
|
|
|
|
|
|
|
/* (2) On récupère les 'match' */
|
|
|
|
matches = {};
|
|
|
|
|
|
|
|
for( i = 1 ; i < RegExp.length && i < 10 ; i++ )
|
|
|
|
matches['$'+i] = RegExp['$'+i];
|
|
|
|
|
|
|
|
/* (3) On renvoie le lien + le scope */
|
|
|
|
return { def: defs[key], scope: matches };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
// Si on a rien trouvé, on retourne NULL
|
2016-09-18 08:44:21 +00:00
|
|
|
return {};
|
2016-09-17 08:02:22 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
/* REMPLACE RECURSIVEMENT LES VALEURS DE @OBJECT AVEC LE @SCOPE -> RECURSIF
|
|
|
|
*
|
|
|
|
* @object<Object> Objet dans lequel remplacer les valeurs
|
|
|
|
* @scope<Object> Ensemble des variables permettant le remplacement
|
2016-09-18 09:29:46 +00:00
|
|
|
* @definitions<Object> Définitions des éléments
|
2016-09-16 14:52:41 +00:00
|
|
|
*
|
|
|
|
* @return replaced<Object> Objet avec les remplacements effectués
|
|
|
|
*
|
|
|
|
*/
|
2016-09-18 09:29:46 +00:00
|
|
|
FormBuilder.replaceStatements = function(object, scope, definitions){
|
2016-09-17 08:02:22 +00:00
|
|
|
/* [0] Initialisation
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 10:40:29 +00:00
|
|
|
/* (1) Paramètres */
|
|
|
|
object = (object instanceof Object) ? object : {};
|
2016-09-17 16:58:18 +00:00
|
|
|
scope = (scope instanceof Object) ? JSON.parse(JSON.stringify(scope)) : {};
|
2016-09-17 10:40:29 +00:00
|
|
|
|
|
|
|
/* (2) Variables */
|
2016-09-18 10:37:21 +00:00
|
|
|
var key, r, tmp, m, found, lasti, parts;
|
2016-09-17 16:58:18 +00:00
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
/* (3) On récupère le scope s'il est dans l'attribut 'scope' */
|
2016-09-17 16:44:17 +00:00
|
|
|
if( object.hasOwnProperty('scope') && object.scope instanceof Object )
|
|
|
|
for( key in object.scope )
|
2016-09-18 08:44:21 +00:00
|
|
|
scope[key] = object.scope[key];
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
|
2016-09-18 09:29:46 +00:00
|
|
|
/* [1] On lie les définitions de l'attribut 'node' -> 'node_link'
|
|
|
|
==================================================================*/
|
|
|
|
if( object.hasOwnProperty('node') && typeof object.node == 'string' ){
|
|
|
|
|
|
|
|
/* On cherche une définition */
|
|
|
|
found = FormBuilder.fetchNodeDefinition(object.node, definitions);
|
|
|
|
|
|
|
|
// Si on trouve
|
|
|
|
if( found.hasOwnProperty('def') ){
|
|
|
|
|
|
|
|
// 1. On clone la définition dans l'attribut 'node_link'
|
|
|
|
object.node_link = JSON.parse( JSON.stringify(found.def) );
|
|
|
|
|
|
|
|
// 2. On ajoute les matches dans l'attribut 'scope'
|
|
|
|
if( found.hasOwnProperty('scope') )
|
|
|
|
for( key in found.scope )
|
|
|
|
scope[key] = found.scope[key];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] On remplace les valeurs
|
|
|
|
==================================================================*/
|
2016-09-17 08:02:22 +00:00
|
|
|
for( key in object ){
|
|
|
|
|
|
|
|
/* [1.1] Si c'est une string, on regarde s'il faut remplacer
|
2016-09-18 09:29:46 +00:00
|
|
|
==================================================================*/
|
2016-09-17 15:14:41 +00:00
|
|
|
if( typeof object[key] == 'string' ){
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* (2.1) On cherche tous les TABLEAUX à remplacer
|
|
|
|
---------------------------------------------------------*/
|
|
|
|
/* (1.1) On récupère les remplacements de TABLEAUX */
|
2016-09-17 16:44:17 +00:00
|
|
|
m = null, r = FormBuilder.regex.arr_out_set;
|
2016-09-17 08:02:22 +00:00
|
|
|
var m_arr = [];
|
|
|
|
|
|
|
|
/* (1.2) Si ça match */
|
2016-09-17 10:40:29 +00:00
|
|
|
if( m = r.exec(object[key]) )
|
2016-09-17 08:02:22 +00:00
|
|
|
m_arr.push( m[1] );
|
|
|
|
|
|
|
|
/* (1.3) Pour chaque match */
|
|
|
|
for( m in m_arr ){
|
|
|
|
|
|
|
|
// {1} Si la var n'est pas dans le scope //
|
|
|
|
if( !scope.hasOwnProperty(m_arr[m]) )
|
|
|
|
scope[m_arr[m]] = []; // on met un tableau vide
|
|
|
|
|
|
|
|
// {2} on attribue le tableau //
|
|
|
|
object[key] = scope[m_arr[m]];
|
2016-09-17 14:04:03 +00:00
|
|
|
|
2016-09-17 15:14:41 +00:00
|
|
|
// console.log('arr', m_arr[m], scope[m_arr[m]]);
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/* (1.4) Si on a trouvé qqch, on passe à la clé suivante */
|
|
|
|
if( m_arr.length > 0 )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
/* (2.2) On cherche toutes les variables PRIMITIVES à remplacer
|
|
|
|
---------------------------------------------------------*/
|
|
|
|
/* (1.1) On récupère les remplacements PRIMITIFS */
|
2016-09-17 16:44:17 +00:00
|
|
|
m = null, r = FormBuilder.regex.pri_out_val;
|
2016-09-17 08:02:22 +00:00
|
|
|
var m_pri = [];
|
|
|
|
|
|
|
|
/* (1.2) Tant que ça match */
|
2016-09-17 10:40:29 +00:00
|
|
|
while( (m=r.exec(object[key])) !== null )
|
2016-09-18 10:37:21 +00:00
|
|
|
m_pri.push( m );
|
2016-09-16 14:52:41 +00:00
|
|
|
|
2016-09-17 08:02:22 +00:00
|
|
|
/* (1.3) Pour chaque match */
|
2016-09-18 10:37:21 +00:00
|
|
|
lasti = 0, parts = [];
|
2016-09-17 08:02:22 +00:00
|
|
|
for( m in m_pri ){
|
2016-09-16 14:52:41 +00:00
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
// {1} On construit les valeurs pour le 'string-builder' //
|
|
|
|
parts.push( object[key].substring(lasti, m_pri[m].index) );
|
2016-09-17 06:29:59 +00:00
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
// {2} Sa la valeur n'existe pas dans le scope, on la crée //
|
|
|
|
tmp = object[key].substring(m_pri[m].index+1, m_pri[m].index+m_pri[m][0].length-1);
|
2016-09-17 14:04:03 +00:00
|
|
|
|
2016-09-18 10:37:21 +00:00
|
|
|
if( !scope.hasOwnProperty(tmp) )
|
|
|
|
parts.push( scope[tmp] );
|
|
|
|
|
|
|
|
lasti = m_pri[m].index + m_pri[m][0].length;
|
|
|
|
|
|
|
|
// object[key] = object[key].replace(tmp, scope[m_pri[m]]);
|
|
|
|
// console.log('pri', m_pri[m], scope[m_pri[m]]);
|
2016-09-17 08:02:22 +00:00
|
|
|
}
|
2016-09-18 10:37:21 +00:00
|
|
|
// On met la fonction à amorcer pour construire la valeur
|
|
|
|
object[key] = FormBuilder.buildString(parts);
|
2016-09-17 06:29:59 +00:00
|
|
|
|
2016-09-17 08:02:22 +00:00
|
|
|
/* (1.4) Si on a trouvé qqch, on passe à la clé suivante */
|
|
|
|
if( m_pri.length > 0 )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
/* (2.3) On cherche toutes les variables REGEX à remplacer
|
|
|
|
---------------------------------------------------------*/
|
|
|
|
/* (1.1) On récupère les remplacements REGEX */
|
2016-09-17 16:44:17 +00:00
|
|
|
m = null, r = FormBuilder.regex.reg_out_val,
|
2016-09-17 10:40:29 +00:00
|
|
|
lasti = -1;
|
|
|
|
var m_reg = [];
|
|
|
|
|
|
|
|
/* (1.2) Tant que ça match */
|
|
|
|
var max = 10;
|
|
|
|
while( (m=r.exec(object[key])) !== null && max > 0 ){
|
|
|
|
// si on boucle, on sort
|
|
|
|
if( lasti >= r.lastIndex ) break;
|
|
|
|
lasti = r.lastIndex;
|
|
|
|
|
|
|
|
m_reg.push( m[1] );
|
|
|
|
}
|
|
|
|
|
|
|
|
/* (1.3) Pour chaque match */
|
|
|
|
for( m in m_reg ){
|
|
|
|
// {1} Si la var n'est pas dans le scope //
|
|
|
|
if( !scope.hasOwnProperty(m_reg[m]) )
|
|
|
|
scope[m_reg[m]] = ''; // on met une chaine vide
|
|
|
|
|
|
|
|
// {2} on remplace toutes les occurences par la valeur //
|
2016-09-18 10:37:21 +00:00
|
|
|
tmp = new RegExp( "\{\\$"+m_reg[m][1]+"\}", 'g' );
|
|
|
|
object[key] = object[key].replace(tmp, scope[m_reg[m]]);
|
2016-09-17 10:40:29 +00:00
|
|
|
|
2016-09-17 15:14:41 +00:00
|
|
|
// console.log('reg', m_reg[m], scope);
|
2016-09-17 14:04:03 +00:00
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* (1.4) Si on a trouvé qqch, on passe à la clé suivante */
|
|
|
|
if( m_reg.length > 0 )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
/* (2.4) On cherche toutes les valeurs de TABLEAUX à remplacer
|
2016-09-17 08:02:22 +00:00
|
|
|
---------------------------------------------------------*/
|
|
|
|
/* (1.1) On récupère les remplacements de valeurs de TABLEAUX */
|
2016-09-17 16:44:17 +00:00
|
|
|
m = null, r = FormBuilder.regex.arr_out_val;
|
2016-09-17 08:02:22 +00:00
|
|
|
var m_aval = [];
|
|
|
|
|
|
|
|
/* (1.2) Tant que ça match */
|
2016-09-17 10:40:29 +00:00
|
|
|
while( (m=r.exec(object[key])) !== null )
|
2016-09-17 08:02:22 +00:00
|
|
|
m_aval.push( m[1] );
|
|
|
|
|
|
|
|
/* (1.3) Pour chaque match */
|
|
|
|
for( m in m_aval ){ //TODO: implémenter l'ajout des items d'un tableau au scope lors d'un "repeat"
|
|
|
|
|
|
|
|
// {1} Si la var n'est pas dans le scope //
|
2016-09-17 10:40:29 +00:00
|
|
|
if( !scope.hasOwnProperty(m_aval[m]) )
|
|
|
|
scope[m_aval[m]] = ''; // on met une chaine vide
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
// {2} on remplace toutes les occurences par la valeur //
|
2016-09-18 10:37:21 +00:00
|
|
|
tmp = new RegExp( "/\{"+m_aval[m]+"\}/", 'g' );
|
|
|
|
object[key].replace(tmp, scope[m_aval[m]]);
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
}
|
2016-09-17 06:29:59 +00:00
|
|
|
|
2016-09-16 14:52:41 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-09-17 08:02:22 +00:00
|
|
|
|
2016-09-18 09:29:46 +00:00
|
|
|
/* [3] On ajoute les variables '$var' et '$$arr' au scope suivant
|
|
|
|
==================================================================*/
|
2016-09-17 08:02:22 +00:00
|
|
|
for( key in object ){
|
|
|
|
|
|
|
|
/* (1) Ajout des variables de type '$nomVar'
|
|
|
|
---------------------------------------------------------*/
|
2016-09-17 16:44:17 +00:00
|
|
|
if( FormBuilder.regex.pri_in_key.test(key) )
|
2016-09-18 08:44:21 +00:00
|
|
|
scope[ key.substring(1) ] = object[key];
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
/* (2) Ajout des tableaux de type '$$nomArr'
|
|
|
|
---------------------------------------------------------*/
|
2016-09-17 16:44:17 +00:00
|
|
|
else if( FormBuilder.regex.arr_in_key.test(key) )
|
2016-09-18 08:44:21 +00:00
|
|
|
scope[ key.substring(2) ] = object[key];
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-09-18 09:29:46 +00:00
|
|
|
/* [4] On lance récursivement
|
|
|
|
==================================================================*/
|
|
|
|
/* on clone le scope */
|
2016-09-18 08:44:21 +00:00
|
|
|
scope = JSON.parse(JSON.stringify(scope));
|
|
|
|
|
2016-09-17 08:02:22 +00:00
|
|
|
for( key in object ){
|
|
|
|
|
2016-09-17 15:14:41 +00:00
|
|
|
/* S'il ne s'agit d'un attribut interdit */
|
|
|
|
if( FormBuilder.spread_attr.indexOf(key) > -1 ){
|
2016-09-17 08:02:22 +00:00
|
|
|
|
|
|
|
|
2016-09-18 08:44:21 +00:00
|
|
|
/* (1) Si c'est un tableau, on lance récursivement pour chaque item */
|
2016-09-17 15:14:41 +00:00
|
|
|
if( object[key] instanceof Array )
|
2016-09-18 09:29:46 +00:00
|
|
|
for( var i in object[key] )
|
|
|
|
FormBuilder.replaceStatements(object[key][i], scope, definitions);
|
|
|
|
// console.log(object.node, key+'['+i+']');
|
|
|
|
|
2016-09-17 15:14:41 +00:00
|
|
|
|
|
|
|
/* (2) Si c'est un objet, on lance récursivement */
|
2016-09-18 09:29:46 +00:00
|
|
|
else if( object[key] instanceof Object )
|
|
|
|
FormBuilder.replaceStatements(object[key], scope, definitions);
|
|
|
|
// console.log(object.node, key);
|
2016-09-17 15:14:41 +00:00
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
|
2016-09-17 08:02:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-17 10:40:29 +00:00
|
|
|
|
2016-09-18 09:29:46 +00:00
|
|
|
/* [5] On retourne l'object courant
|
|
|
|
==================================================================*/
|
2016-09-16 14:52:41 +00:00
|
|
|
return object;
|
|
|
|
};
|
2016-09-18 10:37:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* CONSTRUIT UNE CHAINE A PARTIR DE SES PARTIES (VARIABLES OU TEXTE BRUT)
|
|
|
|
*
|
|
|
|
* @parts<Array> Tableau contenant les parties
|
|
|
|
*
|
|
|
|
* @return built<String> Chaine recomposée
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
FormBuilder.buildString = function(parts){
|
|
|
|
/* [0] Initialisation
|
|
|
|
=========================================================*/
|
|
|
|
/* (1) Variables */
|
|
|
|
var i;
|
|
|
|
var built = "";
|
|
|
|
|
|
|
|
|
|
|
|
/* [1] On remplace par les valeurs
|
|
|
|
=========================================================*/
|
|
|
|
for( i in parts ){
|
|
|
|
console.log(parts[i]);
|
|
|
|
|
|
|
|
/* (1) Si <refObject>, on ajoute la valeur */
|
|
|
|
if( parts[i] instanceof refObject )
|
|
|
|
built += '' + parts[i].get();
|
|
|
|
|
|
|
|
/* (2) Sinon, on ajoute simplement */
|
|
|
|
else
|
|
|
|
built += '' + parts[i].toString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] On retourne le résultat
|
|
|
|
=========================================================*/
|
|
|
|
return built;
|
|
|
|
|
|
|
|
};
|