1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
| 'use strict';
// --------------
// 0- "MENU"
// --------------
// MENU : on définit ici quels textarea/div prendre en compte (pour la fonction action_clic_button_parser)
var id_textarea_menu = 'textarea-parse-menu';
var id_checkbox_menu = 'liste-checkbox-menu';
var id_resultat_menu = 'affiche-result-menu';
// --------
var id_button_parser_menu = 'button-parser-menu';
var id_button_copier_menu = 'button-copier-menu';
// --------
var arrdatas_menu = []; // array
// --------
// MENU : clic sur le bouton "Parser"
document.querySelector('#'+id_button_parser_menu).addEventListener('click', function(){
action_clic_button_parser( id_textarea_menu, id_checkbox_menu, id_resultat_menu, arrdatas_menu, 'MENU' );
});
// --------
// MENU : copie de la sélection
document.querySelector('#'+id_button_copier_menu).addEventListener('click', function(){
copie_to_clipboard( id_resultat_menu );
});
// --------------
// 1- "Caractéristiques PRODUIT-1"
// --------------
// PRODUIT-1 : on définit ici quels textarea/div prendre en compte (pour la fonction action_clic_button_parser)
var id_textarea_prd1 = 'textarea-parse-prd1';
var id_checkbox_prd1 = 'liste-checkbox-prd1';
var id_resultat_prd1 = 'affiche-result-prd1';
// --------
var id_button_parser_prd1 = 'button-parser-prd1';
var id_button_copier_prd1 = 'button-copier-prd1';
// --------
var arrdatas_prd1 = []; // array
// --------
// PRODUIT-1 : clic sur le bouton "Parser"
document.querySelector('#'+id_button_parser_prd1).addEventListener('click', function(){
action_clic_button_parser( id_textarea_prd1, id_checkbox_prd1, id_resultat_prd1, arrdatas_prd1, 'PROD' );
});
// --------
// PRODUIT-1 : clic sur le bouton "Copier"
document.querySelector('#'+id_button_copier_prd1).addEventListener('click', function(){
copie_to_clipboard( id_resultat_prd1 );
});
// --------------
// 2- "Caractéristiques PRODUIT-2"
// COPIER-COLLER le code de PRODUIT-1, en remplaçant 'prd1' par 'prd2'
// (Idem pour le code HTML)
// .....
// --------------
// ..... (et ainsi de suite pour les AUTRES "Caractéristiques PRODUIT-x"
// --------------
// --------------
// FONCTIONS COMMUNES
// --------------
// fonction : actions à réaliser au clic sur le bouton "Parser"
function action_clic_button_parser( id_textarea_a_parser, id_div_liste_checkbox, id_div_liste_resultat, array_des_donnees=[], le_type )
{
// --------
// variables locales (internes à la fonction)
var textarea_parse = document.querySelector('#'+id_textarea_a_parser);
var liste_checkbox = document.querySelector('#'+id_div_liste_checkbox);
var liste_resultat = document.querySelector('#'+id_div_liste_resultat);
var array_lesdatas = array_des_donnees;
// --------
// on vide les listes
liste_checkbox.innerHTML = ''; // div (donc .innerHTML)
liste_resultat.value = ''; // textarea (donc .value)
// --------
// on récupère le code HTML
var le_html = textarea_parse.value.trim(); // textarea (donc .value)
// --------
if( le_html == '' )
{
alert('Le textarea est vide');
return false;
} else {
// on ajoute un div avec une classe "html_to_parse" (qui va nous servir plus tard)
le_html = '<div class="html_to_parse">'+le_html+'</div>';
}
// --------
// on parse le code HTML
var parser = new DOMParser();
var doc_html = parser.parseFromString(le_html, "text/html");
// --------
// on récupère TOUS les niveaux dans UN SEUL objet
if( le_type == "MENU" )
{
// SPECIAL MENU : on NE prend PAS les 2 menus "Connexion" et "Créer un compte" (avec la classe "customer-navlink")
var elts = doc_html.querySelectorAll('div.html_to_parse > ul > li:not(.customer-navlink)'); // (les li de 1er niveau)
} else {
var elts = doc_html.querySelectorAll('div.html_to_parse > ul > li'); // (les li de 1er niveau)
}
array_lesdatas = get_lesdatas_by_level( [], elts, 0, '', le_type );
// --------
// on construit la liste de checkbox
var la_liste_checkbox = get_liste_checkbox_by_lvl_by_par( array_lesdatas, 0, '' );
liste_checkbox.innerHTML = la_liste_checkbox; // div (donc .innerHTML)
// --------
// clic sur les cases cochées
// (Important : ce bout de code doit être DANS la fonction, car les checkbox sont créees dynamiquement)
liste_checkbox.addEventListener('click', function(e){
var initElem = e.target;
if(initElem.tagName.toLowerCase() == 'input' && initElem.type == 'checkbox')
{
// on affiche les résultats (checkbox cochées)
liste_resultat.value = get_checkbox_cochees( id_div_liste_checkbox, array_lesdatas, le_type ); // textarea (donc .value)
// console.log( liste_resultat.value );
}
});
// --------
}
// --------------
// fonction récursive de récupération des niveaux
function get_lesdatas_by_level( arr=[], elts, lvl=0, par='', le_type )
{
ii = arr.length;
elts.forEach( function(elt){
// si on a des noeuds
if (elt.hasChildNodes())
{
// ----
if( le_type == "MENU" )
{
var le_tag = 'a'; // pour le MENU, on prend le contenu du lien <a> (<li><a>Le texte</a>)
} else {
var le_tag = '#text'; // pour les PRODUITS, pas de lien : on prend le contenu du #text (<li>Le texte)
}
// ----
// pour chaque noeud
elt.childNodes.forEach( function(node){
// si le noeud est le_tag : on ajoute à arr
if (node.nodeName && node.nodeName.toLowerCase() == le_tag && node.textContent.trim() !='')
{
arr[ii] = {'txt':node.textContent.trim(),'lvl':lvl,'par':par};
ii = arr.length;
}
// si le noeud est 'ul' = on a un sous-niveau : récursivité de la fonction
else if (node.nodeName && node.nodeName.toLowerCase() == 'ul') // sous-menu ?
{
var arr2 = get_lesdatas_by_level( arr, node.childNodes, lvl+1, ii-1, le_type ); // récursivité
// on regroupe les 2 :
arr = json_concat( arr, arr2 );
}
// ----
});
}
});
return arr;
// arr : array
// Chaque ligne est de la forme : idx:{ txt:"Le texte", lvl:2, par:11 }
// idx : index de la ligne
// txt : le texte (nom de la catégorie)
// lvl : le niveau (0:catégorie, 1:sous-catégorie ,2:sous-sous-catégorie, ...)
// par : index de la ligne/catégorie parente ('' si pas de parent)
}
// --------------
// fonction de fusion de 2 objets en un seul
function json_concat( o1, o2 )
{
for (var key in o2) {
o1[key] = o2[key]; // copie de o2 dans o1
}
return o1;
}
// --------------
// fonction récursive de création de la liste des checkbox
function get_liste_checkbox_by_lvl_by_par( arr=[], lvl=0, par='' )
{
var liste_checkbox = [];
arr.forEach( function(elt,idx){
if( elt.lvl == lvl && elt.par == par ) // pour CE niveau et CE parent
{
// ----
// la checkbox
var checkbox = '<label><input type="checkbox" value="'+idx+'" /><span>'+elt.txt+'</span></label>';
// ----
// récursivité : sous-liste ?
var liste_checkbox2 = get_liste_checkbox_by_lvl_by_par( arr, lvl+1, idx );
// ----
// on regroupe les 2 :
checkbox = '<li>'+checkbox+liste_checkbox2+'</li>';
// ----
// on ajoute à la liste (array)
liste_checkbox.push( checkbox );
}
});
if( liste_checkbox.length > 0 )
{
return '<ul>'+liste_checkbox.join("\n")+'</ul>'; // join : on concatène en une chaine
} else {
return '';
}
}
// --------------
// récupération des cases cochées
function get_checkbox_cochees( id_div_liste_checkbox, array_lesdatas, le_type )
{
var les_checkbox_cochees = [];
var les_checkbox = document.querySelectorAll('#'+id_div_liste_checkbox+' input[type=checkbox]');
les_checkbox.forEach( function(checkbox){
if(checkbox.checked)
{
console.log( array_lesdatas[checkbox.value]) ;
if( array_lesdatas[checkbox.value].lvl != 0 && le_type != 'MENU' )
{
// on met devant le nom de la catégorie parente
les_checkbox_cochees.push( array_lesdatas[Number(array_lesdatas[checkbox.value].par)].txt+'_'+array_lesdatas[checkbox.value].txt );
} else {
les_checkbox_cochees.push( array_lesdatas[checkbox.value].txt );
}
}
});
// return '<ul><li>'+les_checkbox_cochees.join('</li><li>')+'</li></ul>'; // concaténation sous forme de liste ul/li
return les_checkbox_cochees.join(','); // concaténation avec virgule
}
// --------------
// fonction : copie dans le presse-papier
// https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/interagir_avec_le_presse_papier
function copie_to_clipboard( id_textarea )
{
var newClip = document.querySelector('#'+id_textarea).value;
navigator.clipboard.writeText(newClip).then(function() {
// clipboard successfully set
alert( 'La sélection a été copiée : \n'+newClip );
}, function() {
// clipboard write failed
alert( 'Erreur lors de la copie : \nRecommencez' );
});
} |
Partager