« MediaWiki:Mobile.js » : différence entre les versions
Page blanchie Balises : Blanchiment Révocation manuelle |
Aucun résumé des modifications Balise : Révoqué |
||
Ligne 1 : | Ligne 1 : | ||
/* Chargé sur le site mobile */ | |||
(function () { | |||
'use strict'; | |||
var MENU_SELECTOR = 'ul#p-navigation'; | |||
var ENHANCED_ATTR = 'data-enhanced-menu'; | |||
function addMenuItem(parent, itemId, linkText, url, imageUrl, insertAtStart) { | |||
if (!parent || document.getElementById(itemId)) return; | |||
var li = document.createElement('li'); | |||
li.id = itemId; | |||
li.classList.add('toggle-list-item'); // <-- classe demandée | |||
li.innerHTML = | |||
'<a href="' + url + '" class="toggle-list-item__anchor menu__item--home">' + | |||
'<span class="menu-item-text toggle-list-item__label">' + linkText + '</span>' + | |||
'</a>'; | |||
if (insertAtStart && parent.firstChild) { | |||
parent.insertBefore(li, parent.firstChild); | |||
} else { | |||
parent.appendChild(li); | |||
} | |||
var label = li.querySelector('.menu-item-text'); | |||
if (label) { | |||
label.style.setProperty('--image-url', 'url(' + imageUrl + ')'); | |||
} | |||
} | |||
function addStylesOnce() { | |||
if (document.getElementById('menu-item-styles')) return; | |||
var style = document.createElement('style'); | |||
style.id = 'menu-item-styles'; | |||
style.textContent = | |||
'#p-navigation li a .menu-item-text {' + | |||
'position: relative; display: inline-block; padding-left: 30px;' + | |||
'}' + | |||
'#p-navigation li a .toggle-list-item__label::before {' + | |||
'content: ""; position: absolute; left: 0; top: 0; width: 20px; height: 20px;' + | |||
'background-size: contain; background-repeat: no-repeat; background-position: center;' + | |||
'opacity: .65; background-image: var(--image-url);' + | |||
'}'; | |||
document.head.appendChild(style); | |||
} | |||
function enhanceMenuIfReady() { | |||
var nav = document.querySelector(MENU_SELECTOR); | |||
if (!nav || nav.getAttribute(ENHANCED_ATTR) === '1') return; | |||
// Ajouter les 3 entrées | |||
addMenuItem(nav, 'pt-all-documentaires', 'Documentaires', 'https://militotheque.org/wiki/Catégorie:Documentaire', '/w/images/8/82/Videographie_noir.svg'); | |||
addMenuItem(nav, 'pt-all-films', 'Films', 'https://militotheque.org/wiki/Catégorie:Film', '/w/images/8/82/Videographie_noir.svg'); | |||
addMenuItem(nav, 'pt-carte-videos', 'Carte des vidéos', 'https://militotheque.org/wiki/Militothèque:Carte_des_vidéos', '/w/images/6/6e/Mappemonde.svg'); | |||
// Réordonner pour placer entre "Accueil" et "Au hasard" | |||
var auHasard = nav.querySelector('li:nth-child(2)'); // après Accueil | |||
['pt-carte-videos', 'pt-all-films', 'pt-all-documentaires'].forEach(function (id) { | |||
var li = nav.querySelector('#' + id); | |||
if (li && auHasard) nav.insertBefore(li, auHasard); | |||
}); | |||
addStylesOnce(); | |||
nav.setAttribute(ENHANCED_ATTR, '1'); // éviter doublons | |||
} | |||
function initObservers() { | |||
// 1) Essai immédiat | |||
enhanceMenuIfReady(); | |||
// 2) Observer les mutations (le menu peut être injecté après) | |||
var obs = new MutationObserver(function () { enhanceMenuIfReady(); }); | |||
obs.observe(document.documentElement, { childList: true, subtree: true }); | |||
// 3) Hook MediaWiki quand dispo | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(enhanceMenuIfReady); | |||
} | |||
} | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', initObservers); | |||
} else { | |||
initObservers(); | |||
} | |||
})(); | |||
/* Pour les utilisateurs connectés, remplace le bouton Modifier le wikicode par Modifier avec formulaire */ | |||
$(document).ready(function () { | |||
if (!$("body").hasClass("is-authenticated")) { | |||
return; | |||
} | |||
var boutonModifier = document.querySelector("#bouton-modifier"); | |||
var caEdit = document.querySelector("#ca-edit"); // Minerva: <a id="ca-edit"> | |||
if (boutonModifier && caEdit) { | |||
var lien = boutonModifier.querySelector("a"); | |||
// On récupère l'attribut "href" tel qu'il est écrit dans le HTML | |||
var nouveauHref = lien && lien.getAttribute("href"); | |||
console.log("lien bouton : " + nouveauHref); | |||
if (!nouveauHref) return; | |||
// Appliquer notre URL et titre | |||
caEdit.setAttribute("href", nouveauHref); | |||
var nouveauTitre = lien.getAttribute("title"); | |||
if (nouveauTitre) caEdit.setAttribute("title", nouveauTitre); | |||
// 1) Empêcher les handlers du skin de rediriger vers ?section=0 | |||
caEdit.addEventListener("click", function (e) { | |||
e.preventDefault(); | |||
e.stopImmediatePropagation(); | |||
window.location.assign(nouveauHref); | |||
}, true); // phase de capture | |||
// 2) Bloquer toute réécriture ultérieure de l'attribut href | |||
var mo = new MutationObserver(function (mutations) { | |||
for (var m of mutations) { | |||
if (m.type === "attributes" && m.attributeName === "href") { | |||
if (caEdit.getAttribute("href") !== nouveauHref) { | |||
caEdit.setAttribute("href", nouveauHref); | |||
} | |||
} | |||
} | |||
}); | |||
mo.observe(caEdit, { attributes: true, attributeFilter: ["href"] }); | |||
// (optionnel) Re-appliquer juste après le paint si un script a couru entre-temps | |||
setTimeout(function(){ caEdit.setAttribute("href", nouveauHref); }, 0); | |||
// Supprimer le bouton custom | |||
boutonModifier.remove(); | |||
} | |||
}); |
Version du 26 août 2025 à 13:37
/* Chargé sur le site mobile */ (function () { 'use strict'; var MENU_SELECTOR = 'ul#p-navigation'; var ENHANCED_ATTR = 'data-enhanced-menu'; function addMenuItem(parent, itemId, linkText, url, imageUrl, insertAtStart) { if (!parent || document.getElementById(itemId)) return; var li = document.createElement('li'); li.id = itemId; li.classList.add('toggle-list-item'); // <-- classe demandée li.innerHTML = '<a href="' + url + '" class="toggle-list-item__anchor menu__item--home">' + '<span class="menu-item-text toggle-list-item__label">' + linkText + '</span>' + '</a>'; if (insertAtStart && parent.firstChild) { parent.insertBefore(li, parent.firstChild); } else { parent.appendChild(li); } var label = li.querySelector('.menu-item-text'); if (label) { label.style.setProperty('--image-url', 'url(' + imageUrl + ')'); } } function addStylesOnce() { if (document.getElementById('menu-item-styles')) return; var style = document.createElement('style'); style.id = 'menu-item-styles'; style.textContent = '#p-navigation li a .menu-item-text {' + 'position: relative; display: inline-block; padding-left: 30px;' + '}' + '#p-navigation li a .toggle-list-item__label::before {' + 'content: ""; position: absolute; left: 0; top: 0; width: 20px; height: 20px;' + 'background-size: contain; background-repeat: no-repeat; background-position: center;' + 'opacity: .65; background-image: var(--image-url);' + '}'; document.head.appendChild(style); } function enhanceMenuIfReady() { var nav = document.querySelector(MENU_SELECTOR); if (!nav || nav.getAttribute(ENHANCED_ATTR) === '1') return; // Ajouter les 3 entrées addMenuItem(nav, 'pt-all-documentaires', 'Documentaires', 'https://militotheque.org/wiki/Catégorie:Documentaire', '/w/images/8/82/Videographie_noir.svg'); addMenuItem(nav, 'pt-all-films', 'Films', 'https://militotheque.org/wiki/Catégorie:Film', '/w/images/8/82/Videographie_noir.svg'); addMenuItem(nav, 'pt-carte-videos', 'Carte des vidéos', 'https://militotheque.org/wiki/Militothèque:Carte_des_vidéos', '/w/images/6/6e/Mappemonde.svg'); // Réordonner pour placer entre "Accueil" et "Au hasard" var auHasard = nav.querySelector('li:nth-child(2)'); // après Accueil ['pt-carte-videos', 'pt-all-films', 'pt-all-documentaires'].forEach(function (id) { var li = nav.querySelector('#' + id); if (li && auHasard) nav.insertBefore(li, auHasard); }); addStylesOnce(); nav.setAttribute(ENHANCED_ATTR, '1'); // éviter doublons } function initObservers() { // 1) Essai immédiat enhanceMenuIfReady(); // 2) Observer les mutations (le menu peut être injecté après) var obs = new MutationObserver(function () { enhanceMenuIfReady(); }); obs.observe(document.documentElement, { childList: true, subtree: true }); // 3) Hook MediaWiki quand dispo if (window.mw && mw.hook) { mw.hook('wikipage.content').add(enhanceMenuIfReady); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initObservers); } else { initObservers(); } })(); /* Pour les utilisateurs connectés, remplace le bouton Modifier le wikicode par Modifier avec formulaire */ $(document).ready(function () { if (!$("body").hasClass("is-authenticated")) { return; } var boutonModifier = document.querySelector("#bouton-modifier"); var caEdit = document.querySelector("#ca-edit"); // Minerva: <a id="ca-edit"> if (boutonModifier && caEdit) { var lien = boutonModifier.querySelector("a"); // On récupère l'attribut "href" tel qu'il est écrit dans le HTML var nouveauHref = lien && lien.getAttribute("href"); console.log("lien bouton : " + nouveauHref); if (!nouveauHref) return; // Appliquer notre URL et titre caEdit.setAttribute("href", nouveauHref); var nouveauTitre = lien.getAttribute("title"); if (nouveauTitre) caEdit.setAttribute("title", nouveauTitre); // 1) Empêcher les handlers du skin de rediriger vers ?section=0 caEdit.addEventListener("click", function (e) { e.preventDefault(); e.stopImmediatePropagation(); window.location.assign(nouveauHref); }, true); // phase de capture // 2) Bloquer toute réécriture ultérieure de l'attribut href var mo = new MutationObserver(function (mutations) { for (var m of mutations) { if (m.type === "attributes" && m.attributeName === "href") { if (caEdit.getAttribute("href") !== nouveauHref) { caEdit.setAttribute("href", nouveauHref); } } } }); mo.observe(caEdit, { attributes: true, attributeFilter: ["href"] }); // (optionnel) Re-appliquer juste après le paint si un script a couru entre-temps setTimeout(function(){ caEdit.setAttribute("href", nouveauHref); }, 0); // Supprimer le bouton custom boutonModifier.remove(); } });