Aller au contenu

« MediaWiki:Mobile.js » : différence entre les versions

De Militothèque
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();
	}
});