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();
  }
})();