/* CONSTRUCTEUR -> INITIALISE UNE L'INSTANCE * * @parent_element Element qui contiendra le formulaire * @form_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 Objet dans lequel remplacer les valeurs * @scope Ensemble des variables permettant le remplacement * * @return replaced 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; };