PageSourceSearch

https://www.spibook.fr/themes/spibook/assets/js/product-rating.js?v=1

js spibook.fr collected 2026-10-02 00:20:46 UTC 2,664 bytes, 88 lines download raw bytes

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.