// ==UserScript==
// @name JVC 18-25 - Masquer topics suffixe 3 caractères
// @namespace jvc18-25-hide-3suffix
// @version 1.0
// @description Cache les topics dont le titre se termine par un dernier mot de 3 caractères alphanum (ex: laS, 5Qr, PFQ).
// @match https://www.jeuxvideo.com/forums/0-51-0-*-0-1-0-blabla-18-25-ans.htm*
// @run-at document-end
// @grant none
// ==/UserScript==
(function () {
'use strict';
const DEBUG = false;
const HIDE_STYLE = 'display:none !important;';
// Dernier mot = exactement 3 caractères lettres/chiffres (case-insensitive)
// Ex: " ... laS" / " ... 5Qr" / " ... PFQ"
const SUFFIX_3_RE = /\b[a-z0-9]{3}\b\s*$/i;
function getTopicLinks() {
// Titres de topics = liens vers /forums/
return Array.from(document.querySelectorAll('a[href*="/forums/"]'))
.filter(a => a.textContent && a.textContent.trim().length > 0);
}
function getRowElement(link) {
// Remonte au conteneur de ligne (mobile/desktop)
return (
link.closest('li') ||
link.closest('tr') ||
link.closest('article') ||
link.closest('.topic') ||
link.closest('.topic-item') ||
link.closest('div')
) || link;
}
function process() {
const links = getTopicLinks();
for (const a of links) {
const row = getRowElement(a);
if (!row || row.dataset.jvcHide3Done === '1') continue;
const title = a.textContent.trim();
if (SUFFIX_3_RE.test(title)) {
row.setAttribute('style', (row.getAttribute('style') || '') + ';' + HIDE_STYLE);
if (DEBUG) console.log('[JVC hide-3] hidden:', title);
} else {
if (DEBUG) console.log('[JVC hide-3] keep:', title);
}
row.dataset.jvcHide3Done = '1';
}
}
// Première passe
process();
// Observe les ajouts (scroll / refresh)
const obs = new MutationObserver(() => {
if (process._raf) cancelAnimationFrame(process._raf);
process._raf = requestAnimationFrame(process);
});
obs.observe(document.documentElement, { childList: true, subtree: true });
})();