MediaWiki:Common.js: Difference between revisions
From AnarchyMU Wiki
Created page with "→Any JavaScript here will be loaded for all users on every page load.: // Ensures class card images use the intended foreground image if data-src is present. (function () { function applyDataSrc() { var images = document.querySelectorAll('.mw-card-image img[data-src]'); for (var i = 0; i < images.length; i++) { var img = images[i]; var dataSrc = img.getAttribute('data-src'); if (dataSrc && img.getAttribute('src') !== dataSrc) { img..." |
No edit summary |
||
| Line 17: | Line 17: | ||
} else { | } else { | ||
applyDataSrc(); | applyDataSrc(); | ||
} | |||
})(); | |||
/* Update 041: make Stage 1-4 nested dropdown groups inside Stages System menu */ | |||
(function () { | |||
function txt(el) { | |||
return (el && el.textContent ? el.textContent : '').trim(); | |||
} | |||
function normalize(s) { | |||
return s.replace(/\s+/g, ' ').trim().toLowerCase(); | |||
} | |||
function findStagesSystemList() { | |||
var links = Array.prototype.slice.call(document.querySelectorAll('a')); | |||
for (var i = 0; i < links.length; i++) { | |||
var label = normalize(txt(links[i])); | |||
if (label === 'stages system') { | |||
var li = links[i].closest('li'); | |||
if (!li) continue; | |||
var ul = li.querySelector(':scope > ul, :scope > .submenu'); | |||
if (ul) return ul; | |||
} | |||
} | |||
return null; | |||
} | |||
function isStageLabel(label) { | |||
return /^stage\s+[1-4]$/i.test(label); | |||
} | |||
function isMiniLabel(label) { | |||
return /^mini\s+stage\s+\d+$/i.test(label); | |||
} | |||
function applyNestedStages() { | |||
var ul = findStagesSystemList(); | |||
if (!ul || ul.dataset.stagesNestedApplied === '1') return; | |||
var items = Array.prototype.slice.call(ul.children).filter(function (n) { | |||
return n.tagName && n.tagName.toLowerCase() === 'li'; | |||
}); | |||
if (!items.length) return; | |||
var rebuilt = []; | |||
var currentStageLi = null; | |||
var currentMiniUl = null; | |||
items.forEach(function (li) { | |||
var a = li.querySelector(':scope > a'); | |||
var label = txt(a); | |||
if (isStageLabel(label)) { | |||
currentStageLi = li.cloneNode(true); | |||
currentStageLi.classList.add('stages-inner-parent'); | |||
currentMiniUl = document.createElement('ul'); | |||
currentMiniUl.className = 'stages-inner-submenu'; | |||
var toggle = document.createElement('button'); | |||
toggle.type = 'button'; | |||
toggle.className = 'stages-inner-toggle'; | |||
toggle.setAttribute('aria-expanded', 'false'); | |||
toggle.textContent = '▸'; | |||
toggle.addEventListener('click', function (ev) { | |||
ev.preventDefault(); | |||
ev.stopPropagation(); | |||
var open = currentStageLi.classList.toggle('open'); | |||
toggle.setAttribute('aria-expanded', open ? 'true' : 'false'); | |||
toggle.textContent = open ? '▾' : '▸'; | |||
}); | |||
currentStageLi.appendChild(toggle); | |||
currentStageLi.appendChild(currentMiniUl); | |||
rebuilt.push(currentStageLi); | |||
return; | |||
} | |||
if (isMiniLabel(label) && currentMiniUl) { | |||
currentMiniUl.appendChild(li.cloneNode(true)); | |||
return; | |||
} | |||
currentStageLi = null; | |||
currentMiniUl = null; | |||
rebuilt.push(li.cloneNode(true)); | |||
}); | |||
ul.innerHTML = ''; | |||
rebuilt.forEach(function (n) { ul.appendChild(n); }); | |||
ul.dataset.stagesNestedApplied = '1'; | |||
} | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', applyNestedStages); | |||
} else { | |||
applyNestedStages(); | |||
} | } | ||
})(); | })(); | ||
Revision as of 08:52, 20 March 2026
/* Any JavaScript here will be loaded for all users on every page load. */
// Ensures class card images use the intended foreground image if data-src is present.
(function () {
function applyDataSrc() {
var images = document.querySelectorAll('.mw-card-image img[data-src]');
for (var i = 0; i < images.length; i++) {
var img = images[i];
var dataSrc = img.getAttribute('data-src');
if (dataSrc && img.getAttribute('src') !== dataSrc) {
img.setAttribute('src', dataSrc);
}
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', applyDataSrc);
} else {
applyDataSrc();
}
})();
/* Update 041: make Stage 1-4 nested dropdown groups inside Stages System menu */
(function () {
function txt(el) {
return (el && el.textContent ? el.textContent : '').trim();
}
function normalize(s) {
return s.replace(/\s+/g, ' ').trim().toLowerCase();
}
function findStagesSystemList() {
var links = Array.prototype.slice.call(document.querySelectorAll('a'));
for (var i = 0; i < links.length; i++) {
var label = normalize(txt(links[i]));
if (label === 'stages system') {
var li = links[i].closest('li');
if (!li) continue;
var ul = li.querySelector(':scope > ul, :scope > .submenu');
if (ul) return ul;
}
}
return null;
}
function isStageLabel(label) {
return /^stage\s+[1-4]$/i.test(label);
}
function isMiniLabel(label) {
return /^mini\s+stage\s+\d+$/i.test(label);
}
function applyNestedStages() {
var ul = findStagesSystemList();
if (!ul || ul.dataset.stagesNestedApplied === '1') return;
var items = Array.prototype.slice.call(ul.children).filter(function (n) {
return n.tagName && n.tagName.toLowerCase() === 'li';
});
if (!items.length) return;
var rebuilt = [];
var currentStageLi = null;
var currentMiniUl = null;
items.forEach(function (li) {
var a = li.querySelector(':scope > a');
var label = txt(a);
if (isStageLabel(label)) {
currentStageLi = li.cloneNode(true);
currentStageLi.classList.add('stages-inner-parent');
currentMiniUl = document.createElement('ul');
currentMiniUl.className = 'stages-inner-submenu';
var toggle = document.createElement('button');
toggle.type = 'button';
toggle.className = 'stages-inner-toggle';
toggle.setAttribute('aria-expanded', 'false');
toggle.textContent = '▸';
toggle.addEventListener('click', function (ev) {
ev.preventDefault();
ev.stopPropagation();
var open = currentStageLi.classList.toggle('open');
toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
toggle.textContent = open ? '▾' : '▸';
});
currentStageLi.appendChild(toggle);
currentStageLi.appendChild(currentMiniUl);
rebuilt.push(currentStageLi);
return;
}
if (isMiniLabel(label) && currentMiniUl) {
currentMiniUl.appendChild(li.cloneNode(true));
return;
}
currentStageLi = null;
currentMiniUl = null;
rebuilt.push(li.cloneNode(true));
});
ul.innerHTML = '';
rebuilt.forEach(function (n) { ul.appendChild(n); });
ul.dataset.stagesNestedApplied = '1';
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', applyNestedStages);
} else {
applyNestedStages();
}
})();