NxTIC/js/lib/form-builder.js

112 lines
4.0 KiB
JavaScript

/* CONSTRUCTEUR -> INITIALISE UNE L'INSTANCE
*
* @parent_element<Element> Element qui contiendra le formulaire
* @form_object<Object> Objet définissant le formulaire
*
*/
var FormBuilder = function(parent_element, form_object){
/* (1) On définit le parent */
this.parent_element = parent_element;
/* (2) On définit le formulaire (sous forme de description formelle) */
this.form_object = form_object;
/* (3) On formatte l'objet (référence des 'children' vers le 'parent') */
FormBuilder.formatFormObject(this.form_object);
};
/* 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
parent_element: this.parent_element, // element qui contiendra le formulaire
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 */
'node_attr', /* tableau des attrbuts réels de l'élément */
'node_children', /* tableau des enfants (innerHTML) du noeud courant */
'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 */
],
built_form: null, // Element correspondant au formulaire construit
regex: {
primitive_ouput_value: /\{([a-z-]+)\}/g,
primitive_input_key: /^\$([a-z-]+)$/,
array_output_set: /\{\{([a-z-]+)\}\}/g,
array_output_value: /\{([a-z-]+)\.([a-z-]+)\}/g,
array_input_key: /^\$\$([a-z-]+)$/
}
};
/* FORMATTE L'OBJET DE DESCRIPTION DU FORMULAIRE
*
*/
FormBuilder.formatFormObject = function(object){
/* (1) Si a un enfant */
if( object.hasOwnProperty('children') )
/* (2) Pour chaque enfant */
for( var child in object.children ){
/* (1) On ajoute le parent + on lance récursivement */
object.children[child].parent = object;
FormBuilder.formatFormObject(object.children[child]);
}
return object;
};
/* 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
*
* @return replaced<Object> Objet avec les remplacements effectués
*
*/
FormBuilder.replaceStatements = function(object, scope){
/* [1] Pour chaque attribut (value is string)
=========================================================*/
for( var key in object ){
/* (1) Si la valeur est une string */
if( typeof object[key] == 'string' ){
/* [1] On cherche toutes les variables PRIMITIVES à remplacer
=========================================================*/
/* (1) On récupère la regex */
var r = FormBuilder.prototype.regex.primitive_ouput_value,
m,
matches = [];
/* (2) Tant que ça match */
// while( m = r.exec(object[key]) !== null ){
// matches.push( m[1] );
// }
while( matches[ matches.push(r.exec(object[key])) -1 ] !== null );
for( var i = 0 ; i < matches.length-1 ; i++ )
matches[i] = matches[i][1];
console.log(matches);
}
}
return object;
};