1/** 2 * Note du produit en haut de fiche (thème spibook). 3 * 4 * Remonte la note moyenne (étoiles + valeur + nombre d'avis) dans le conteneur 5 * `.rating` situé sous le titre produit, en réutilisant les données DÃJà rendues 6 * par le module natif productcomments (bloc `.product-comments-additional-info`, 7 * hook displayProductAdditionalInfo, plus bas dans la fiche). 8 * 9 * - Aucune requête réseau : `data-grade` et le compteur d'avis sont présents 10 * dans le HTML au chargement. 11 * - On ne touche pas au module natif ni au hook (partagé avec Stripe) : le bloc 12 * d'origine (lien « Lire les avis » / bouton d'avis) reste en place. 13 * - Si le produit n'a aucun avis, on ne remonte rien (le conteneur reste masqué). 14 */ 15(function () { 16 'use strict'; 17 18 function formatGrade(grade) { 19 var n = parseFloat(grade); 20 if (isNaN(n)) { 21 return ''; 22 } 23 return (Math.round(n * 10) / 10).toFixed(1); 24 } 25 26 function buildStars(grade) { 27 var pct = Math.max(0, Math.min(100, (parseFloat(grade) / 5) * 100)); 28 var stars = document.createElement('span'); 29 stars.className = 'product-rating__stars'; 30 stars.style.setProperty('--pct', pct + '%'); 31 stars.setAttribute('aria-hidden', 'true'); 32 return stars; 33 } 34 35 function readCount(info) { 36 var links = info.querySelectorAll('.link-comment'); 37 for (var i = 0; i < links.length; i++) { 38 var m = links[i].textContent.replace(/\s/g, '').match(/\((\d+)\)/); 39 if (m) { 40 return m[1]; 41 } 42 } 43 return null; 44 } 45 46 function append(target, className, text) { 47 var el = document.createElement('span'); 48 el.className = className; 49 el.textContent = text; 50 target.appendChild(el); 51 } 52 53 function init() { 54 var target = document.querySelector('#main .rating'); 55 if (!target || target.getAttribute('data-loaded')) { 56 return; 57 } 58 59 var info = document.querySelector('.product-comments-additional-info'); 60 if (!info) { 61 return; 62 } 63 64 var gradeEl = info.querySelector('.grade-stars[data-grade]'); 65 if (!gradeEl) { 66 return; // pas d'avis -> on ne remonte rien 67 } 68 69 var value = formatGrade(gradeEl.getAttribute('data-grade')); 70 if (!value) { 71 return; 72 } 73 74 target.setAttribute('data-loaded', '1'); 75 target.appendChild(buildStars(gradeEl.getAttribute('data-grade'))); 76 append(target, 'product-rating__value', value); 77 78 var count = readCount(info); 79 if (count) { 80 append(target, 'product-rating__sep', '·'); 81 append(target, 'product-rating__count', count + ' avis'); 82 } 83 84 target.classList.add('is-ready'); 85 } 86 87 document.addEventListener('DOMContentLoaded', init); 88})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.