3e856dc476
Tous les <script> inline et event handlers inline bloqués par la CSP sont déplacés vers des fichiers JS statiques servis par 'self' : - density-fouc.js : anti-FOUC densité (chargé en <head>) - density.js : widget L/M/S - trending-home.js : AJAX "Meilleures audiences" (RSS XML) - admin-stats.js : groupes AS + pages trending (RSS XML) - admin.js : bookAddArticle + bulk-delete (onclick/onchange → listeners) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
52 lines
2.5 KiB
JavaScript
52 lines
2.5 KiB
JavaScript
/* Chargement AJAX de la section "Meilleures audiences" via le flux RSS XML /trending?period=1h */
|
|
(function () {
|
|
var grid = document.getElementById('home-audiences-grid');
|
|
if (!grid) { return; }
|
|
|
|
var gradients = [
|
|
'linear-gradient(135deg,#667eea 0%,#764ba2 100%)',
|
|
'linear-gradient(135deg,#f093fb 0%,#f5576c 100%)',
|
|
'linear-gradient(135deg,#4facfe 0%,#00f2fe 100%)',
|
|
'linear-gradient(135deg,#43e97b 0%,#38f9d7 100%)',
|
|
'linear-gradient(135deg,#fa709a 0%,#fee140 100%)',
|
|
'linear-gradient(135deg,#a18cd1 0%,#fbc2eb 100%)'
|
|
];
|
|
|
|
function esc(s) {
|
|
return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
}
|
|
|
|
fetch('/trending?period=1h')
|
|
.then(function (r) { return r.ok ? r.text() : Promise.reject(); })
|
|
.then(function (xml) {
|
|
var doc = new DOMParser().parseFromString(xml, 'application/xml');
|
|
var items = Array.from(doc.querySelectorAll('item')).slice(0, 6);
|
|
if (!items.length) { return; }
|
|
|
|
grid.innerHTML = items.map(function (item, i) {
|
|
var raw = (item.querySelector('title') || { textContent: '' }).textContent;
|
|
var title = raw.replace(/\s*\(\d+\s+visiteurs?\)$/, '');
|
|
var link = ((item.querySelector('link') || {}).textContent || '#').trim();
|
|
var pd = (item.querySelector('pubDate') || { textContent: '' }).textContent;
|
|
var date = '';
|
|
try { if (pd) { date = new Date(pd).toLocaleDateString('fr-FR'); } } catch (err) {}
|
|
var grad = gradients[i % gradients.length];
|
|
|
|
return '<article class="card">'
|
|
+ '<div class="card-cover" style="background:' + grad + '"></div>'
|
|
+ '<div class="card-body d-flex flex-column">'
|
|
+ '<h2 class="card-title"><a href="' + esc(link) + '">' + esc(title) + '</a></h2>'
|
|
+ '<div class="post-entry-meta mt-auto">'
|
|
+ (date ? '<span>' + esc(date) + '</span>' : '')
|
|
+ '<a href="' + esc(link) + '" class="post-entry-read">→ lire</a>'
|
|
+ '</div></div>'
|
|
+ '<a href="' + esc(link) + '" class="stretched-link"></a>'
|
|
+ '</article>';
|
|
}).join('');
|
|
|
|
var section = document.getElementById('home-audiences-section');
|
|
if (section) { section.hidden = false; }
|
|
})
|
|
.catch(function () {});
|
|
}());
|