MediaWiki:Common.js:修订间差异

来自Mindustry中文wiki
无编辑摘要
无编辑摘要
第40行: 第40行:
});
});


mw.loader.using(['mediawiki.util'], function () {
mw.loader.using(['mediawiki.util'], function () {
     if (mw.config.get('skin') !== 'timeless') return;
     if (mw.config.get('skin') !== 'timeless') return;


     const navRoot = document.querySelector('#mw-site-navigation #p-
     var navSel = '#mw-site-navigation #p-navigation ' +
  navigation .mw-portlet-body > ul');
      '.mw-portlet-body > ul';
    var navRoot = document.querySelector(navSel);
     if (!navRoot) return;
     if (!navRoot) return;


     const storageKey = 'mdt.sidebar.tree.v1';
     var storageKey = 'mdt.sidebar.tree.v2';
     let persisted = {};
     var persisted = {};
     try { persisted = JSON.parse(localStorage.getItem(storageKey) ||
     try {
  '{}'); } catch (e) {}
      persisted = JSON.parse(localStorage.getItem(storageKey) || '{}');
    } catch (e) {}


     const currentPage = mw.config.get('wgPageName'); // underscores
     function getKey(li) {
      if (li.id) return li.id;
      var a = li.querySelector('a');
      return a ? (a.getAttribute('href') || '') : '';
    }
 
    function setOpen(li, open) {
      li.classList.toggle('mdt-nav__group--open', open);
      var key = li.dataset.mdtKey || getKey(li);
      if (!key) return;
      li.dataset.mdtKey = key;
      persisted[key] = open;
      localStorage.setItem(storageKey, JSON.stringify(persisted));
    }


     function titleFromHref(href) {
     function pageFromHref(href) {
       try {
       try {
         const url = new URL(href, location.origin);
         var url = new URL(href, location.origin);
         const t = url.searchParams.get('title');
         var t = url.searchParams.get('title');
         if (t) return t.replace(/ /g, '_');
         if (t) return t.replace(/ /g, '_');
         const marker = '/index.php/';
         var marker = '/index.php/';
         const i = url.pathname.indexOf(marker);
         var i = url.pathname.indexOf(marker);
         if (i !== -1) return decodeURIComponent(url.pathname.slice(i +
         if (i === -1) return null;
  marker.length)).replace(/ /g, '_');
        var p = url.pathname.slice(i + marker.length);
        return decodeURIComponent(p).replace(/ /g, '_');
       } catch (e) {}
       } catch (e) {}
       return null;
       return null;
     }
     }


     function keyForGroup(li) {
    var currentPage = mw.config.get('wgPageName');
       return li.id || li.dataset.mdtKey || (li.querySelector(':scope >
    var items = Array.prototype.slice.call(navRoot.children);
  a')?.getAttribute('href') ?? '');
    var parentAt = [];
    }
 
     function ensureGroup(parent) {
       var sub = parent.querySelector('ul.mdt-nav__sublist');
      if (!sub) {
        sub = document.createElement('ul');
        sub.className = 'mdt-nav__sublist';
        parent.appendChild(sub);
      }
 
      parent.classList.add('mdt-nav__group');
 
      var btn = parent.querySelector('button.mdt-nav__toggle');
      if (!btn) {
        btn = document.createElement('button');
        btn.type = 'button';
        btn.className = 'mdt-nav__toggle';
        btn.setAttribute('aria-label', '展开/收起');
        parent.insertBefore(btn, sub);


    function setOpen(li, open) {
        btn.addEventListener('click', function (ev) {
      li.classList.toggle('mdt-nav__group--open', open);
          ev.preventDefault();
      const key = keyForGroup(li);
          ev.stopPropagation();
      if (key) {
          var group = ev.currentTarget.parentElement;
        persisted[key] = open;
          setOpen(group, !group.classList.contains('mdt-
         localStorage.setItem(storageKey, JSON.stringify(persisted));
  nav__group--open'));
         });
       }
       }
      var key = parent.dataset.mdtKey || getKey(parent);
      if (key) parent.dataset.mdtKey = key;
      if (typeof persisted[key] === 'boolean') setOpen(parent,
  persisted[key]);
      return sub;
     }
     }


     const items = Array.from(navRoot.querySelectorAll(':scope > li'));
     for (var idx = 0; idx < items.length; idx++) {
    let currentGroup = null;
      var li = items[idx];
    let sublist = null;
      if (!li || li.tagName !== 'LI') continue;


    for (const li of items) {
       var a = li.querySelector('a');
       const a = li.querySelector(':scope > a');
       if (!a) continue;
       if (!a) continue;


       const raw = a.textContent.trim();
       var raw = (a.textContent || '').trim();
       const m = raw.match(/^(-{2,})\s+(.*)$/);
       var m = raw.match(/^(-{2,})\s+(.*)$/);
      var depth = 0;
 
       if (m) {
       if (m) {
         const depth = Math.min(Math.floor(m[1].length / 2), 3);
         depth = Math.min(Math.floor(m[1].length / 2), 3);
         a.textContent = m[2];
         a.textContent = m[2];
        li.classList.add('mdt-nav__item', 'mdt-nav__item--sub', `mdt-
      }
  nav__item--depth-${depth}`);


        if (!currentGroup) continue;
      li.classList.add('mdt-nav__item');
        if (!sublist) {
      if (depth > 0) {
          sublist = document.createElement('ul');
        li.classList.add('mdt-nav__item--sub');
          sublist.className = 'mdt-nav__sublist';
         li.classList.add('mdt-nav__item--depth-' + depth);
          currentGroup.appendChild(sublist);
          currentGroup.classList.add('mdt-nav__group');
        }
        sublist.appendChild(li);
      } else {
         li.classList.add('mdt-nav__item');
        currentGroup = li;
        sublist = null;
       }
       }
    }


    const groups = Array.from(navRoot.querySelectorAll(':scope > li.mdt-
      if (depth > 0 && !parentAt[depth - 1]) depth = 0;
  nav__group'));
    for (const li of groups) {
      const a = li.querySelector(':scope > a');
      const key = li.id || a?.getAttribute('href') ||
  Math.random().toString(36);
      li.dataset.mdtKey = key;


       const toggle = document.createElement('button');
       if (depth > 0) {
      toggle.type = 'button';
        var parent = parentAt[depth - 1];
      toggle.className = 'mdt-nav__toggle';
        var sublist = ensureGroup(parent);
      toggle.setAttribute('aria-label', '展开/收起');
        sublist.appendChild(li);
      li.insertBefore(toggle, li.querySelector('.mdt-nav__sublist'));
       }
 
       if (typeof persisted[key] === 'boolean') setOpen(li,
  persisted[key]);


       toggle.addEventListener('click', function (e) {
       parentAt[depth] = li;
        e.preventDefault();
       parentAt.length = depth + 1;
        e.stopPropagation();
        setOpen(li, !li.classList.contains('mdt-nav__group--open'));
       });
     }
     }


     let activeLink = null;
     var links = navRoot.querySelectorAll('a');
    for (const a of navRoot.querySelectorAll('a')) {
    var active = null;
       const t = titleFromHref(a.href);
    for (var i2 = 0; i2 < links.length; i2++) {
       if (t && t === currentPage) { activeLink = a; break; }
       var p2 = pageFromHref(links[i2].href);
       if (p2 && p2 === currentPage) { active = links[i2]; break; }
     }
     }


     if (activeLink) {
     if (active) {
       activeLink.classList.add('mdt-nav__link--active');
       active.classList.add('mdt-nav__link--active');
       const activeLi = activeLink.closest('li');
       var g = active.closest('li.mdt-nav__group');
      if (activeLi) activeLi.classList.add('mdt-nav__item--active');
       while (g) {
       const group = activeLink.closest('li.mdt-nav__group');
        setOpen(g, true);
      if (group) {
         g = g.parentElement.closest('li.mdt-nav__group');
         group.classList.add('mdt-nav__group--active');
        setOpen(group, true); // 自动展开包含当前页面的分组
       }
       }
     }
     }
   });
   });

2026年1月8日 (四) 13:46的版本

/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
/* 点击按钮复制内容的脚本 */
$(function() {
    $('.copy-button').click(function() {
        var text = $(this).attr('data-text');
        var $temp = $("<textarea>");
        $("body").append($temp);
        $temp.val(text).select();
        document.execCommand("copy");
        $temp.remove();
        alert("复制成功!");
    });
});
/* Mindustry 顶部导航栏 
$(document).ready(function() {
    // 1. 定义菜单内容 (直接写死白色字体,防止看不见)
    var myMenu = `
    <div id="mindustry-nav" style="display: flex; align-items: center; height: 100%; margin-left: 20px; z-index: 999;">
        <a href="/index.php/首页" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">首页</a>
        <a href="/index.php/单位" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">单位</a>
        <a href="/index.php/建筑" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">建筑</a>
        <a href="/index.php/逻辑" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">逻辑</a>
    </div>
    `;

    // 2. 尝试插入到 Logo 所在的容器中
    // Vector 2022 的 Logo 容器通常叫 .vector-header-start
    var target = $('.vector-header-start');
    
    // 如果找不到,尝试找 .mw-logo (旧版兼容)
    if (target.length === 0) {
        target = $('.mw-logo').parent();
    }

    // 执行插入
    target.append(myMenu);
    
    // 3. 调试信息 (按F12看控制台用)
    console.log("Mindustry 导航栏脚本已执行");
});

 mw.loader.using(['mediawiki.util'], function () {
    if (mw.config.get('skin') !== 'timeless') return;

    var navSel = '#mw-site-navigation #p-navigation ' +
      '.mw-portlet-body > ul';
    var navRoot = document.querySelector(navSel);
    if (!navRoot) return;

    var storageKey = 'mdt.sidebar.tree.v2';
    var persisted = {};
    try {
      persisted = JSON.parse(localStorage.getItem(storageKey) || '{}');
    } catch (e) {}

    function getKey(li) {
      if (li.id) return li.id;
      var a = li.querySelector('a');
      return a ? (a.getAttribute('href') || '') : '';
    }

    function setOpen(li, open) {
      li.classList.toggle('mdt-nav__group--open', open);
      var key = li.dataset.mdtKey || getKey(li);
      if (!key) return;
      li.dataset.mdtKey = key;
      persisted[key] = open;
      localStorage.setItem(storageKey, JSON.stringify(persisted));
    }

    function pageFromHref(href) {
      try {
        var url = new URL(href, location.origin);
        var t = url.searchParams.get('title');
        if (t) return t.replace(/ /g, '_');
        var marker = '/index.php/';
        var i = url.pathname.indexOf(marker);
        if (i === -1) return null;
        var p = url.pathname.slice(i + marker.length);
        return decodeURIComponent(p).replace(/ /g, '_');
      } catch (e) {}
      return null;
    }

    var currentPage = mw.config.get('wgPageName');
    var items = Array.prototype.slice.call(navRoot.children);
    var parentAt = [];

    function ensureGroup(parent) {
      var sub = parent.querySelector('ul.mdt-nav__sublist');
      if (!sub) {
        sub = document.createElement('ul');
        sub.className = 'mdt-nav__sublist';
        parent.appendChild(sub);
      }

      parent.classList.add('mdt-nav__group');

      var btn = parent.querySelector('button.mdt-nav__toggle');
      if (!btn) {
        btn = document.createElement('button');
        btn.type = 'button';
        btn.className = 'mdt-nav__toggle';
        btn.setAttribute('aria-label', '展开/收起');
        parent.insertBefore(btn, sub);

        btn.addEventListener('click', function (ev) {
          ev.preventDefault();
          ev.stopPropagation();
          var group = ev.currentTarget.parentElement;
          setOpen(group, !group.classList.contains('mdt-
  nav__group--open'));
        });
      }

      var key = parent.dataset.mdtKey || getKey(parent);
      if (key) parent.dataset.mdtKey = key;
      if (typeof persisted[key] === 'boolean') setOpen(parent,
  persisted[key]);
      return sub;
    }

    for (var idx = 0; idx < items.length; idx++) {
      var li = items[idx];
      if (!li || li.tagName !== 'LI') continue;

      var a = li.querySelector('a');
      if (!a) continue;

      var raw = (a.textContent || '').trim();
      var m = raw.match(/^(-{2,})\s+(.*)$/);
      var depth = 0;

      if (m) {
        depth = Math.min(Math.floor(m[1].length / 2), 3);
        a.textContent = m[2];
      }

      li.classList.add('mdt-nav__item');
      if (depth > 0) {
        li.classList.add('mdt-nav__item--sub');
        li.classList.add('mdt-nav__item--depth-' + depth);
      }

      if (depth > 0 && !parentAt[depth - 1]) depth = 0;

      if (depth > 0) {
        var parent = parentAt[depth - 1];
        var sublist = ensureGroup(parent);
        sublist.appendChild(li);
      }

      parentAt[depth] = li;
      parentAt.length = depth + 1;
    }

    var links = navRoot.querySelectorAll('a');
    var active = null;
    for (var i2 = 0; i2 < links.length; i2++) {
      var p2 = pageFromHref(links[i2].href);
      if (p2 && p2 === currentPage) { active = links[i2]; break; }
    }

    if (active) {
      active.classList.add('mdt-nav__link--active');
      var g = active.closest('li.mdt-nav__group');
      while (g) {
        setOpen(g, true);
        g = g.parentElement.closest('li.mdt-nav__group');
      }
    }
  });