MediaWiki:Common.js:修订间差异

来自Mindustry中文wiki
无编辑摘要
无编辑摘要
第12行: 第12行:
     });
     });
});
});
/* Mindustry 顶部导航栏  
// Mindustry 顶部导航栏  
$(document).ready(function() {
$(document).ready(function() {
     // 1. 定义菜单内容 (直接写死白色字体,防止看不见)
     // 1. 定义菜单内容 (直接写死白色字体,防止看不见)
第39行: 第39行:
     console.log("Mindustry 导航栏脚本已执行");
     console.log("Mindustry 导航栏脚本已执行");
});
});
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;


     var navSel =
     var siteNav = document.getElementById('mw-site-navigation');
      '#mw-site-navigation ' +
     if (!siteNav) return;
      '#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 pageFromHref(href) {
     var pNav = siteNav.querySelector('#p-navigation');
      try {
    if (!pNav) return;
        var url = new URL(href, location.origin);
        var t = url.searchParams.get('title');
        if (t) return t.replace(/ /g, '_');


        var marker = '/index.php/';
    var root = pNav.querySelector('.mw-portlet-body > ul');
        var i = url.pathname.indexOf(marker);
    if (!root) return;
        if (i === -1) return null;


        var p = url.pathname.slice(i + marker.length);
    var KEY = 'mdtNavTreeOpen';
        return decodeURIComponent(p).replace(/ /g, '_');
    var store = {};
      } catch (e) {}
    try { store = JSON.parse(localStorage.getItem(KEY) || '{}'); }
      return null;
    catch (e) {}
    }


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


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


     function ensureGroup(parentLi) {
     function ensureGroup(li) {
       parentLi.classList.add('mdt-nav__group');
       li.classList.add('mdtNavGroup');


       var sub = parentLi.querySelector('ul.mdt-nav__sublist');
       var sub = li.querySelector('ul.mdtNavSublist');
       if (!sub) {
       if (!sub) {
         sub = document.createElement('ul');
         sub = document.createElement('ul');
         sub.className = 'mdt-nav__sublist';
         sub.className = 'mdtNavSublist';
         parentLi.appendChild(sub);
         li.appendChild(sub);
       }
       }


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


         btn.addEventListener('click', function (ev) {
         btn.addEventListener('click', function (ev) {
           ev.preventDefault();
           ev.preventDefault();
           ev.stopPropagation();
           ev.stopPropagation();
           var group = ev.target.closest('li.mdt-nav__group');
           setOpen(li, !li.classList.contains('mdtNavOpen'));
          if (!group) return;
          setOpen(group, !group.classList.contains('mdt-
  nav__group--open'));
         });
         });
       }
       }


       var key = getKey(parentLi);
       var k = getKey(li);
       if (key) parentLi.dataset.mdtKey = key;
       if (store[k] === true) li.classList.add('mdtNavOpen');
      if (persisted[key] === true) setOpen(parentLi, true);
 
       return sub;
       return sub;
     }
     }


     var items = Array.from(navRoot.children);
     var items = Array.prototype.slice.call(root.children);
     var lastAtDepth = [];
     var lastAtDepth = [];


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


第138行: 第112行:


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


       var depth = 0;
       var depth = 0;
第146行: 第120行:
       }
       }


       li.classList.add('mdt-nav__item');
       li.classList.add('mdtNavItem');
 
      if (depth > 0) {
        li.classList.add('mdt-nav__item--sub');
        li.classList.add('mdt-nav__item--depth-' + depth);
      }
 
      if (depth > 0 && !lastAtDepth[depth - 1]) depth = 0;


       if (depth > 0) {
       if (depth > 0 && lastAtDepth[depth - 1]) {
        var parentLi = lastAtDepth[depth - 1];
        li.classList.add('mdtNavSubItem');
         var sublist = ensureGroup(parentLi);
        li.classList.add('mdtNavDepth' + depth);
         var sublist = ensureGroup(lastAtDepth[depth - 1]);
         sublist.appendChild(li);
         sublist.appendChild(li);
      } else {
        depth = 0;
       }
       }


第166行: 第136行:


     var current = mw.config.get('wgPageName');
     var current = mw.config.get('wgPageName');
     var links = navRoot.querySelectorAll('a');
     var links = pNav.querySelectorAll('a');
    var active = null;


     for (var j = 0; j < links.length; j++) {
     for (var j = 0; j < links.length; j++) {
       var page = pageFromHref(links[j].href);
       var href = links[j].getAttribute('href') || '';
       if (page && page === current) { active = links[j]; break; }
      var page = mw.util.getParamValue('title', href);
    }
 
      if (!page) {
        var mark = '/index.php/';
        var pos = href.indexOf(mark);
        if (pos !== -1) {
          page = decodeURIComponent(href.slice(pos + mark.length));
        }
      }
 
       if (page) page = page.replace(/ /g, '_');
 
      if (page === current) {
        links[j].classList.add('mdtNavActive');


    if (active) {
        var n = links[j].parentNode;
      active.classList.add('mdt-nav__link--active');
        while (n && n !== root) {
      var group = active.closest('li.mdt-nav__group');
          if (n.tagName === 'LI' &&
      if (group) setOpen(group, true);
              n.classList.contains('mdtNavGroup')) {
            setOpen(n, true);
          }
          n = n.parentNode;
        }
        break;
      }
     }
     }
   });
   });

2026年1月8日 (四) 14:22的版本

/* 这里的任何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 siteNav = document.getElementById('mw-site-navigation');
    if (!siteNav) return;

    var pNav = siteNav.querySelector('#p-navigation');
    if (!pNav) return;

    var root = pNav.querySelector('.mw-portlet-body > ul');
    if (!root) return;

    var KEY = 'mdtNavTreeOpen';
    var store = {};
    try { store = JSON.parse(localStorage.getItem(KEY) || '{}'); }
    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('mdtNavOpen', open);
      var k = getKey(li);
      if (!k) return;
      store[k] = open;
      localStorage.setItem(KEY, JSON.stringify(store));
    }

    function ensureGroup(li) {
      li.classList.add('mdtNavGroup');

      var sub = li.querySelector('ul.mdtNavSublist');
      if (!sub) {
        sub = document.createElement('ul');
        sub.className = 'mdtNavSublist';
        li.appendChild(sub);
      }

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

        btn.addEventListener('click', function (ev) {
          ev.preventDefault();
          ev.stopPropagation();
          setOpen(li, !li.classList.contains('mdtNavOpen'));
        });
      }

      var k = getKey(li);
      if (store[k] === true) li.classList.add('mdtNavOpen');
      return sub;
    }

    var items = Array.prototype.slice.call(root.children);
    var lastAtDepth = [];

    for (var i = 0; i < items.length; i++) {
      var li = items[i];
      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('mdtNavItem');

      if (depth > 0 && lastAtDepth[depth - 1]) {
        li.classList.add('mdtNavSubItem');
        li.classList.add('mdtNavDepth' + depth);
        var sublist = ensureGroup(lastAtDepth[depth - 1]);
        sublist.appendChild(li);
      } else {
        depth = 0;
      }

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

    var current = mw.config.get('wgPageName');
    var links = pNav.querySelectorAll('a');

    for (var j = 0; j < links.length; j++) {
      var href = links[j].getAttribute('href') || '';
      var page = mw.util.getParamValue('title', href);

      if (!page) {
        var mark = '/index.php/';
        var pos = href.indexOf(mark);
        if (pos !== -1) {
          page = decodeURIComponent(href.slice(pos + mark.length));
        }
      }

      if (page) page = page.replace(/ /g, '_');

      if (page === current) {
        links[j].classList.add('mdtNavActive');

        var n = links[j].parentNode;
        while (n && n !== root) {
          if (n.tagName === 'LI' &&
              n.classList.contains('mdtNavGroup')) {
            setOpen(n, true);
          }
          n = n.parentNode;
        }
        break;
      }
    }
  });