112 lines
4.0 KiB
JavaScript
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;
|
|
};
|