document.body.innerHTML = ''; // CETTE CLASSE PERMET LA CREATION DE HTML A PARTIR D'UN OBJET JAVASCRIPT // // // Notation: // - Une chaine de caractère précédée du symbole '@' correspond à un commentaire pour expliquer une valeur // // // Types de donées: // - Chaine de caractère // - Tableau // - Tableau associatif (objet) // - Nombre entier // - Fonction // - <*> Qu'importe // // Structure: // - L'objet permettant la création du HTML correspond à un #Element // - L'imbrication de ses #Element permet de construire une structure complète // // // Fonctionnement: // - En plus de l'objet correspondant à l'élément HMTL, il faut spécifier des #Descriptions permettant // de générer le HTML // // // Liste des attributs: // 'node' String permettant de lier l'élément à une définition (qui doit forcément avoir, soit une autre définition, soit 'node_type') // 'node_type' Type d'élément HTML, aucune définition n'est nécessaire // 'children' les #Element enfants de l'#Element en question // 'prev_nodes' les #Element précédant l'#Element en question // 'next_nodes' les #Element suivant l'#Element en question // 'text' Contenu textuel de l'#Element (cf. innerHTML) // 'attributes' Tableau associatif contenant les attributs de l'#Element // 'listeners' Contient les associations { '@eventName': '@eventFunction' } - @eventName - @eventFunction // 'repeat' Définit le nombre de fois qu'il faut dupliquer l'#Element { n: @nbRepeat, id: '@idDuRepeat'} // 'n' Nombre de fois qu'il faut dupliquer l'#Element // 'id' Identifiant de la répétition, permet d'interpoler l'indice et le total // *Note: il est possible d'interpoler l'indice de l'#Element avec '{@idRepeat:i}' et le total avec '{@idRepeat:n}' // 'browse' Définit le tableau sur lequel dupliquer l'#Element { array: @tableau, funcs: { @nomValeur1: @func1, @nomValeur2: @func2 } } // 'array' Tableau pour lequel dupliquer l'#Element (pour chaque valeur), l'interpolation se fait avec '{@nomTab.@nomAttr}' // 'funcs' Définition d'actions sur chaque élément du tableau (interpolables de la même manière que les vrais attributs) // *Note: il est possible d'interpoler l'indice de l'#Element avec '{@nomTab:i}' et le total avec '{@nomTab:n}' // '$@someName' <*> Un attribut commençant par le caractère '$' sera passé au scope de ses enfants, voisins, et définitions // // // Interpolation de valeurs: // '{@nomVariable}' sera remplacé par la variable 'nomVariable', si elle n'existe pas, par une chaine vide // *Note: le nom de la variable ne peut contenir que : 1. des lettres en minuscules, des underscore ('_') // '{@nomTab[]}' sera remplacé par le tableau 'nomTab', si il n'existe pas, par un tableau vide // *Note: le nom de la variable ne peut contenir que : 1. des lettres en minuscules, des underscore ('_') // '{@nomFunc()}' sera remplacé par la fonction 'nomFunc', si elle n'existe pas, par une fonction vide // *Note: le nom de la variable ne peut contenir que : 1. des lettres en minuscules, des underscore ('_') // '{$@n}' sera remplacé par le @n-ième match de la dernière RegExp valide // *Note: ne peut qu'être utilisé dans les définitions, car c'est le seul endroit ou peuvent être des RegExp // '{@tab.@attr}' sera remplacé par l'attribut @attr de l'item en cours du tableau @tab // *Note: si l'attribut n'existe pas, mais qu'une fonction est définie pour cette valeur, la fonction calculera la valeur // *Note: n'est utilisable que dans un #Element ayant l'attribut 'browse' // // // Définition // Les clés de l'objet correspondent à l'attribut 'node', il peut soit être une chaine, soit une RegExp @r de la forme: '/^@r$/' // // // // Exemple: objet de définition // ---------------------------- var default_definition = { // Les #Element avec 'node' valant 'input' seront liés à cette définition 'input.text': { node_type: 'input', // sera un attributes: { name: '{name}', // l'attribut 'name' vaudra la valeur de la variable 'name' value: '{value}', // l'attribut 'value' vaudra la valeur de la variable 'value' type: 'text' // l'attribut 'type' vaudra 'text' } }, // Les #Element avec 'node' valant 'span:@x' avec @x un nombre entier, seront liés à cette définition '/^span:(\d+)$/': { node_type: 'span', // sera un text: 'span {spanRepeat:i} on {spanRepeat:n} (={$1})', repeat: { n: '{$1}', // sera dupliqué @x fois, avec @x récupéré dans le nom de la définition id: 'spanRepeat' // sera accessible via l'id 'spanRepeat' }, attributes: { 'class': '{class}' // l'attribut 'class' vaudra la valeur de la variable 'class' } }, // Les #Element avec 'node' valant 'simple-select', seront liés à cette définition 'simple-select': { node_type: 'select', // sera un node: 'input.text', $name: 'fname', // l' héritera la variable 'name' $value: '{default_firstname}' // l' héritera la variable 'value', qui elle-même sera récupèrée de la variable 'default_firstname' }, { // contiendra en second enfant un node_type: 'input', // sera un attributes: { type: 'submit', // aura l'attribut 'type' qui vaut 'submit' value: 'Valider' // aura l'attribut 'value' qui vaut 'Valider' } } ], // sera suivi par 2 (cf. définition de 'span:(\d+)') next_nodes: [ { node: 'span:2', $class: 'afterSpan' // les hériterons de la variable 'class' } ] }; // // Exemple code de construction // ---------------------------- // // On instancie notre builder var monBuilder = new FormBuilder(exempleFormulaire); // on ajoute la/les définition(s) monBuilder.add_definition(default_definition); // on construit notre objet en lui passant toutes les données monBuilder.build({ url: 'https://xdrm.io/page1', // variable 'url' default_firstname: 'Jean', // variable 'default_firstname' liste_noms: ['Jean', 'Pierre', 'Robert', 'Marie', 'Anna', 'Félicien', 'Marc', 'Jésus'], // tableau 'list_noms' getitemvalue: function(item){ return item; }, // pour chaque item, retournera la valeur brute getitemlength: function(item){ return item.length; } // pour chaque item, retournera la taille de la valeur }); // // Exemple code d'ajout au DOM // --------------------------- // soit monConteneur, l'élément qui contiendra le formulaire var monConteneur = document.body; // On ajoute le formulaire au conteneur monBuilder.attach(monConteneur); // // Exemple de modification des valeurs // ----------------------------------- // les variables ommises lors de la création, ne sont pas modifiables monBuilder.update({ url: 'https://xdrm.io/page2', // on modifie l'URL getitemlength: function(item){ return item.length+1; } // on modifie notre fonction (on renvoie taille+1) }); // reconstruction du DOM monBuilder.attach(monConteneur);