Zum Inhalt springen
Das Halloween-Event (Süßes oder Saures) findet vom 24.10.2025 bis 07.11.2025 statt.

MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Firestone Idle RPG Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
/* Das folgende JavaScript wird für alle Benutzer geladen. */
/* Das folgende JavaScript wird für alle Benutzer geladen. */
/* ==== Sidebar: klickbare Kopfzeile + Gruppen mit Auf/Zu (Vector-2022) ==== */
/* ==== Sidebar: klickbare Kopfzeile + Gruppen mit Auf/Zu (Vector-2022, auch im Drawer) ==== */
(function () {
(function () {
   if ( mw.config.get('skin') !== 'vector-2022' ) return;
   if (mw.config.get('skin') !== 'vector-2022') return;


   // --- Helpers --------------------------------------------------------------
   // ---------- helpers ----------
   function extractDirective(a) {
   function extractDirective(a) {
     if (!a) return null;
     if (!a) return null;
Zeile 14: Zeile 14:
     return null;
     return null;
   }
   }
 
   function stripDirectiveHash(a){ if(a){ a.setAttribute('href',(a.getAttribute('href')||'').replace(/#(?:link|group):.*$/i,'')); } }
  // entfernt #link:… / #group:… aus einem <a>
   function stripDirectiveHash(a) {
    if (!a) return;
    var raw = a.getAttribute('href') || '';
    a.setAttribute('href', raw.replace(/#(?:link|group):.*$/i, ''));
  }


   function makeHead(li, keepLink) {
   function makeHead(li, keepLink) {
    // Kopf: [Pfeil] [Link oder Text]
     var a = li.querySelector(':scope > a');
     var a = li.querySelector(':scope > a');
     var head = document.createElement('div');
     var head = document.createElement('div');
     head.className = 'kr-head';
     head.className = 'kr-head';
     var btn = document.createElement('button');
     var btn = document.createElement('button');
     btn.type = 'button';
     btn.type = 'button';
Zeile 34: Zeile 26:
     head.appendChild(btn);
     head.appendChild(btn);


     if (keepLink && a) {
     if (keepLink && a) { stripDirectiveHash(a); head.appendChild(a); }
      stripDirectiveHash(a);       // <<< HIER: #link:… aus der URL entfernen
     else {
      head.appendChild(a);
     } else {
       var span = document.createElement('span');
       var span = document.createElement('span');
       span.className = 'kr-title';
       span.className = 'kr-title';
       span.textContent = (a && a.textContent) || '';
       span.textContent = (a && a.textContent) || '';
       head.appendChild(span);
       head.appendChild(span);
       if (a) a.remove();           // kein Link im Kopf behalten
       if (a) a.remove();
     }
     }
     li.insertBefore(head, li.firstChild);
     li.insertBefore(head, li.firstChild);
     return head;
     return head;
Zeile 51: Zeile 40:
   function buildGroups(ul) {
   function buildGroups(ul) {
     var lis = Array.from(ul.querySelectorAll(':scope > li.mw-list-item'));
     var lis = Array.from(ul.querySelectorAll(':scope > li.mw-list-item'));
     var currentGroup = null;
     var current = null;


     lis.forEach(function (li) {
     lis.forEach(function (li) {
Zeile 58: Zeile 47:


       if (d && d.kind === 'group') {
       if (d && d.kind === 'group') {
        // Gruppen-Header (ohne Link)
         li.classList.add('kr-group');
         li.classList.add('kr-group');
         makeHead(li, false);
         makeHead(li, false);
        // Unterliste
         var sub = document.createElement('ul');
         var sub = document.createElement('ul');
         sub.className = 'kr-sub';
         sub.className = 'kr-sub';
         li.appendChild(sub);
         li.appendChild(sub);
         currentGroup = sub;
         current = sub;
 
         if (a) a.remove(); // Direktiven-Link raus
        // Direktiven-Link vollständig aus dem DOM entfernen
         if (a) a.remove();
         return;
         return;
       }
       }
 
       if (current && !(d && (d.kind === 'group' || d.kind === 'link'))) current.appendChild(li);
      // Normale Einträge in die gerade offene Gruppe schieben
       if (currentGroup && !(d && (d.kind === 'group' || d.kind === 'link'))) {
        currentGroup.appendChild(li);
      }
     });
     });


    // Auf/Zu
     ul.addEventListener('click', function (e) {
     ul.addEventListener('click', function (e) {
       if (e.target.classList.contains('kr-arrow')) {
       if (e.target.classList.contains('kr-arrow')) {
Zeile 92: Zeile 71:


   function buildPortlets(root) {
   function buildPortlets(root) {
     var lists = root.querySelectorAll('#mw-panel .vector-menu-content-list');
     var lists = root.querySelectorAll('.vector-menu .vector-menu-content-list');
    lists.forEach(function (ul) {
      if (ul.dataset.krSbDone) return;      // nicht doppelt
      ul.dataset.krSbDone = '1';


    lists.forEach(function (ul) {
       var items = Array.from(ul.querySelectorAll(':scope > li.mw-list-item'));
       var items = Array.from(ul.querySelectorAll(':scope > li.mw-list-item'));
       var topIdx = items.findIndex(function (li) {
       var topIdx = items.findIndex(function (li) {
Zeile 105: Zeile 86:
         var top = items[topIdx];
         var top = items[topIdx];
         top.classList.add('kr-top');
         top.classList.add('kr-top');
         makeHead(top, true); // Link bleibt – aber ohne #link:…
         makeHead(top, true);


        // Unterliste unter dem Kopf, Rest hinein
         var sub = document.createElement('ul');
         var sub = document.createElement('ul');
         sub.className = 'kr-sub';
         sub.className = 'kr-sub';
         top.appendChild(sub);
         top.appendChild(sub);
         for (var i = topIdx + 1; i < items.length; i++) sub.appendChild(items[i]);
         for (var i = topIdx + 1; i < items.length; i++) sub.appendChild(items[i]);
         buildGroups(sub);
         buildGroups(sub);
       } else {
       } else {
Zeile 118: Zeile 97:
       }
       }


       // Sicherheit: alle verbleibenden Direktiven aus hrefs entfernen
       // Reste säubern
       ul.querySelectorAll('a[href*="#link:"], a[href*="#group:"]').forEach(stripDirectiveHash);
       ul.querySelectorAll('a[href*="#link:"], a[href*="#group:"]').forEach(stripDirectiveHash);


       // Original-Portlet-Heading (H3) ENTFERNEN
       // Original-Portlet-Heading wirklich entfernen (auch im Drawer)
       var portlet = ul.closest('.vector-menu');
       var portlet = ul.closest('.vector-menu');
       if (portlet) {
       var heading = portlet && portlet.querySelector(':scope > .vector-menu-heading');
        var heading = portlet.querySelector(':scope > .vector-menu-heading');
      if (heading) heading.remove();
        if (heading) heading.remove();
      }
     });
     });
  }
  function processRoot(root){
    if (!root || root.dataset.krSbRootDone) return;
    root.dataset.krSbRootDone = '1';
    root.classList.add('kr-sb');
    buildPortlets(root);
   }
   }


   function init() {
   function init() {
     var panel = document.getElementById('mw-panel');
     // klassische Sidebar + Drawer-Varianten
    if (!panel) return;
    document.querySelectorAll('#mw-panel, #vector-main-menu, #vector-main-menu-pinned, .vector-drawer')
    panel.classList.add('kr-sb');
      .forEach(processRoot);
    buildPortlets(panel);
   }
   }


  // Erstes Rendering
  init();
   mw.hook('wikipage.content').add(init);
   mw.hook('wikipage.content').add(init);
   init();
 
   // Reagiere auf nachträglich eingefügte Drawer-Inhalte
  var mo = new MutationObserver(function (muts) {
    muts.forEach(function (m) {
      m.addedNodes && m.addedNodes.forEach(function (n) {
        if (!(n instanceof Element)) return;
        if (n.matches('#vector-main-menu, #vector-main-menu-pinned, .vector-drawer, #mw-panel')) processRoot(n);
        n.querySelectorAll && n.querySelectorAll('#vector-main-menu, #vector-main-menu-pinned, .vector-drawer, #mw-panel')
          .forEach(processRoot);
      });
    });
  });
  mo.observe(document.body, { childList: true, subtree: true });
})();
})();

Version vom 10. Oktober 2025, 15:01 Uhr

/* Das folgende JavaScript wird für alle Benutzer geladen. */
/* ==== Sidebar: klickbare Kopfzeile + Gruppen mit Auf/Zu (Vector-2022, auch im Drawer) ==== */
(function () {
  if (mw.config.get('skin') !== 'vector-2022') return;

  // ---------- helpers ----------
  function extractDirective(a) {
    if (!a) return null;
    var href = a.getAttribute('href') || '';
    try { href = new URL(href, location.href).hash || ''; } catch (e) {}
    var s = (href || '').trim().toLowerCase();
    if (s.indexOf('#group:') >= 0) return { kind: 'group', value: decodeURIComponent(s.split('#group:').pop()) };
    if (s.indexOf('#link:')  >= 0) return { kind: 'link',  value: decodeURIComponent(s.split('#link:').pop())  };
    return null;
  }
  function stripDirectiveHash(a){ if(a){ a.setAttribute('href',(a.getAttribute('href')||'').replace(/#(?:link|group):.*$/i,'')); } }

  function makeHead(li, keepLink) {
    var a = li.querySelector(':scope > a');
    var head = document.createElement('div');
    head.className = 'kr-head';
    var btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'kr-arrow';
    btn.setAttribute('aria-expanded', 'true');
    head.appendChild(btn);

    if (keepLink && a) { stripDirectiveHash(a); head.appendChild(a); }
    else {
      var span = document.createElement('span');
      span.className = 'kr-title';
      span.textContent = (a && a.textContent) || '';
      head.appendChild(span);
      if (a) a.remove();
    }
    li.insertBefore(head, li.firstChild);
    return head;
  }

  function buildGroups(ul) {
    var lis = Array.from(ul.querySelectorAll(':scope > li.mw-list-item'));
    var current = null;

    lis.forEach(function (li) {
      var a = li.querySelector(':scope > a');
      var d = extractDirective(a);

      if (d && d.kind === 'group') {
        li.classList.add('kr-group');
        makeHead(li, false);
        var sub = document.createElement('ul');
        sub.className = 'kr-sub';
        li.appendChild(sub);
        current = sub;
        if (a) a.remove(); // Direktiven-Link raus
        return;
      }
      if (current && !(d && (d.kind === 'group' || d.kind === 'link'))) current.appendChild(li);
    });

    ul.addEventListener('click', function (e) {
      if (e.target.classList.contains('kr-arrow')) {
        var li = e.target.closest('li.kr-group, li.kr-top');
        if (li) {
          var collapsed = li.classList.toggle('is-collapsed');
          e.target.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
        }
      }
    });
  }

  function buildPortlets(root) {
    var lists = root.querySelectorAll('.vector-menu .vector-menu-content-list');
    lists.forEach(function (ul) {
      if (ul.dataset.krSbDone) return;       // nicht doppelt
      ul.dataset.krSbDone = '1';

      var items = Array.from(ul.querySelectorAll(':scope > li.mw-list-item'));
      var topIdx = items.findIndex(function (li) {
        var a = li.querySelector(':scope > a');
        var d = extractDirective(a);
        return d && d.kind === 'link';
      });

      if (topIdx >= 0) {
        var top = items[topIdx];
        top.classList.add('kr-top');
        makeHead(top, true);

        var sub = document.createElement('ul');
        sub.className = 'kr-sub';
        top.appendChild(sub);
        for (var i = topIdx + 1; i < items.length; i++) sub.appendChild(items[i]);
        buildGroups(sub);
      } else {
        buildGroups(ul);
      }

      // Reste säubern
      ul.querySelectorAll('a[href*="#link:"], a[href*="#group:"]').forEach(stripDirectiveHash);

      // Original-Portlet-Heading wirklich entfernen (auch im Drawer)
      var portlet = ul.closest('.vector-menu');
      var heading = portlet && portlet.querySelector(':scope > .vector-menu-heading');
      if (heading) heading.remove();
    });
  }

  function processRoot(root){
    if (!root || root.dataset.krSbRootDone) return;
    root.dataset.krSbRootDone = '1';
    root.classList.add('kr-sb');
    buildPortlets(root);
  }

  function init() {
    // klassische Sidebar + Drawer-Varianten
    document.querySelectorAll('#mw-panel, #vector-main-menu, #vector-main-menu-pinned, .vector-drawer')
      .forEach(processRoot);
  }

  // Erstes Rendering
  init();
  mw.hook('wikipage.content').add(init);

  // Reagiere auf nachträglich eingefügte Drawer-Inhalte
  var mo = new MutationObserver(function (muts) {
    muts.forEach(function (m) {
      m.addedNodes && m.addedNodes.forEach(function (n) {
        if (!(n instanceof Element)) return;
        if (n.matches('#vector-main-menu, #vector-main-menu-pinned, .vector-drawer, #mw-panel')) processRoot(n);
        n.querySelectorAll && n.querySelectorAll('#vector-main-menu, #vector-main-menu-pinned, .vector-drawer, #mw-panel')
          .forEach(processRoot);
      });
    });
  });
  mo.observe(document.body, { childList: true, subtree: true });
})();