MediaWiki:Common.js:修订间差异

来自Mindustry中文wiki
无编辑摘要
无编辑摘要
第1行: 第1行:
/* 这里的任何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 所在的容器中
  /* MediaWiki:Common.js */
    // Vector 2022 的 Logo 容器通常叫 .vector-header-start
  (function () {
    var target = $('.vector-header-start');
    'use strict';
      
 
     // 如果找不到,尝试找 .mw-logo (旧版兼容)
    function fallbackCopy(text) {
     if (target.length === 0) {
      if (!window.jQuery) return;
         target = $('.mw-logo').parent();
      var $ = window.jQuery;
      var $temp = $('<textarea>');
      $('body').append($temp);
      $temp.val(text).select();
      document.execCommand('copy');
      $temp.remove();
      alert('复制成功!');
     }
 
     // 点击按钮复制内容:<button class="copy-button" data-text="...">复
  制</button>
     if (window.jQuery) {
      window.jQuery(function ($) {
         $(document).on('click', '.copy-button', function () {
          var text = $(this).attr('data-text') || '';
          if (navigator.clipboard && navigator.clipboard.writeText) {
            navigator.clipboard.writeText(text).then(function () {
              alert('复制成功!');
            }, function () {
              fallbackCopy(text);
            });
          } else {
            fallbackCopy(text);
          }
        });
      });
     }
     }


     // 执行插入
     // Timeless:把 Sidebar 里以 "-- " 开头的条目变成可折叠子项
     target.append(myMenu);
     mw.loader.using(['mediawiki.util'], function () {
   
      if (mw.config.get('skin') !== 'timeless') return;
    // 3. 调试信息 (按F12看控制台用)
    console.log("Mindustry 导航栏脚本已执行");
});


mw.loader.using(['mediawiki.util'], function () {
      function initNavTree() {
    if (mw.config.get('skin') !== 'timeless') return;
        var siteNav = document.getElementById('mw-site-navigation');
        if (!siteNav) return;


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


    var pNav = siteNav.querySelector('#p-navigation');
        var root = pNav.querySelector('.mw-portlet-body > ul') ||
    if (!pNav) return;
          pNav.querySelector('ul');
        if (!root) return;


    var root = pNav.querySelector('.mw-portlet-body > ul');
        if (root.getAttribute('data-mdtNav') === '1') return;
    if (!root) return;
        root.setAttribute('data-mdtNav', '1');


    var KEY = 'mdtNavTreeOpen';
        var KEY = 'mdtNavTreeOpen';
    var store = {};
        var store = {};
    try { store = JSON.parse(localStorage.getItem(KEY) || '{}'); }
        try {
    catch (e) {}
          store = JSON.parse(localStorage.getItem(KEY) || '{}');
        } catch (e) {
          store = {};
        }


    function getKey(li) {
        function getKey(li) {
      if (li.id) return li.id;
          if (li && li.id) return li.id;
      var a = li.querySelector('a');
          var a = li ? li.querySelector('a') : null;
      return a ? (a.getAttribute('href') || '') : '';
          return a ? (a.getAttribute('href') || '') : '';
    }
        }
 
        function setStored(li, open) {
          var k = getKey(li);
          if (!k) return;
          store[k] = open;
          try {
            localStorage.setItem(KEY, JSON.stringify(store));
          } catch (e) {}
        }
 
        function setOpen(li, open, persist) {
          li.classList.toggle('mdtNavOpen', open);
          if (persist) setStored(li, open);
        }
 
        function ensureGroup(li) {
          li.classList.add('mdtNavGroup');


    function setOpen(li, open) {
          var sub = li.querySelector('ul.mdtNavSublist');
      li.classList.toggle('mdtNavOpen', open);
          if (!sub) {
      var k = getKey(li);
            sub = document.createElement('ul');
      if (!k) return;
            sub.className = 'mdtNavSublist';
      store[k] = open;
            li.appendChild(sub);
      localStorage.setItem(KEY, JSON.stringify(store));
          }
    }


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


      var sub = li.querySelector('ul.mdtNavSublist');
            btn.addEventListener('click', function (ev) {
      if (!sub) {
              ev.preventDefault();
        sub = document.createElement('ul');
              ev.stopPropagation();
        sub.className = 'mdtNavSublist';
              var isOpen = li.classList.contains('mdtNavOpen');
        li.appendChild(sub);
              setOpen(li, !isOpen, true);
      }
              btn.setAttribute('aria-expanded', String(!isOpen));
            });
          }


      var btn = li.querySelector('button.mdtNavToggle');
          var k = getKey(li);
      if (!btn) {
          if (store[k] === true) {
        btn = document.createElement('button');
            li.classList.add('mdtNavOpen');
        btn.type = 'button';
            btn.setAttribute('aria-expanded', 'true');
        btn.className = 'mdtNavToggle';
          }
        btn.setAttribute('aria-label', '展开/收起');
        li.insertBefore(btn, sub);


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


      var k = getKey(li);
        var items = Array.prototype.slice.call(root.children);
      if (store[k] === true) li.classList.add('mdtNavOpen');
        var lastAtDepth = [];
      return sub;
    }


    var items = Array.prototype.slice.call(root.children);
        for (var i = 0; i < items.length; i++) {
    var lastAtDepth = [];
          var li = items[i];
          if (!li || li.tagName !== 'LI') continue;


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


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


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


      var depth = 0;
          li.classList.add('mdtNavItem');
      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' + String(depth));
            var sublist = ensureGroup(lastAtDepth[depth - 1]);
            sublist.appendChild(li);
          } else {
            depth = 0;
          }


      if (depth > 0 && lastAtDepth[depth - 1]) {
          lastAtDepth[depth] = li;
        li.classList.add('mdtNavSubItem');
          lastAtDepth.length = depth + 1;
        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') || '').replace(/ /
    }
  g, '_');
        var links = pNav.querySelectorAll('a');


    var current = mw.config.get('wgPageName');
        function titleFromHref(href) {
    var links = pNav.querySelectorAll('a');
          var t = mw.util.getParamValue('title', href);
          if (t) return t.replace(/ /g, '_');


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


      if (!page) {
          return '';
        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, '_');
        for (var j = 0; j < links.length; j++) {
          var href = links[j].getAttribute('href') || '';
          var page = titleFromHref(href);


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


        var n = links[j].parentNode;
            var n = links[j].parentNode;
        while (n && n !== root) {
            while (n && n !== root) {
          if (n.tagName === 'LI' &&
              if (n.tagName === 'LI' &&
              n.classList.contains('mdtNavGroup')) {
  n.classList.contains('mdtNavGroup')) {
            setOpen(n, true);
                setOpen(n, true, false);
                var btn = n.querySelector('button.mdtNavToggle');
                if (btn) btn.setAttribute('aria-expanded', 'true');
              }
              n = n.parentNode;
            }
            break;
           }
           }
          n = n.parentNode;
         }
         }
        break;
       }
       }
     }
 
   });
      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initNavTree);
      } else {
        initNavTree();
      }
     });
   })();

2026年1月8日 (四) 15:30的版本


  /* MediaWiki:Common.js */
  (function () {
    'use strict';

    function fallbackCopy(text) {
      if (!window.jQuery) return;
      var $ = window.jQuery;
      var $temp = $('<textarea>');
      $('body').append($temp);
      $temp.val(text).select();
      document.execCommand('copy');
      $temp.remove();
      alert('复制成功!');
    }

    // 点击按钮复制内容:<button class="copy-button" data-text="...">复
  制</button>
    if (window.jQuery) {
      window.jQuery(function ($) {
        $(document).on('click', '.copy-button', function () {
          var text = $(this).attr('data-text') || '';
          if (navigator.clipboard && navigator.clipboard.writeText) {
            navigator.clipboard.writeText(text).then(function () {
              alert('复制成功!');
            }, function () {
              fallbackCopy(text);
            });
          } else {
            fallbackCopy(text);
          }
        });
      });
    }

    // Timeless:把 Sidebar 里以 "-- " 开头的条目变成可折叠子项
    mw.loader.using(['mediawiki.util'], function () {
      if (mw.config.get('skin') !== 'timeless') return;

      function initNavTree() {
        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') ||
          pNav.querySelector('ul');
        if (!root) return;

        if (root.getAttribute('data-mdtNav') === '1') return;
        root.setAttribute('data-mdtNav', '1');

        var KEY = 'mdtNavTreeOpen';
        var store = {};
        try {
          store = JSON.parse(localStorage.getItem(KEY) || '{}');
        } catch (e) {
          store = {};
        }

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

        function setStored(li, open) {
          var k = getKey(li);
          if (!k) return;
          store[k] = open;
          try {
            localStorage.setItem(KEY, JSON.stringify(store));
          } catch (e) {}
        }

        function setOpen(li, open, persist) {
          li.classList.toggle('mdtNavOpen', open);
          if (persist) setStored(li, open);
        }

        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', '展开/收起');
            btn.setAttribute('aria-expanded', 'false');
            li.insertBefore(btn, sub);

            btn.addEventListener('click', function (ev) {
              ev.preventDefault();
              ev.stopPropagation();
              var isOpen = li.classList.contains('mdtNavOpen');
              setOpen(li, !isOpen, true);
              btn.setAttribute('aria-expanded', String(!isOpen));
            });
          }

          var k = getKey(li);
          if (store[k] === true) {
            li.classList.add('mdtNavOpen');
            btn.setAttribute('aria-expanded', 'true');
          }

          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' + String(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') || '').replace(/ /
  g, '_');
        var links = pNav.querySelectorAll('a');

        function titleFromHref(href) {
          var t = mw.util.getParamValue('title', href);
          if (t) return t.replace(/ /g, '_');

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

          return '';
        }

        for (var j = 0; j < links.length; j++) {
          var href = links[j].getAttribute('href') || '';
          var page = titleFromHref(href);

          if (page && 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, false);
                var btn = n.querySelector('button.mdtNavToggle');
                if (btn) btn.setAttribute('aria-expanded', 'true');
              }
              n = n.parentNode;
            }
            break;
          }
        }
      }

      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initNavTree);
      } else {
        initNavTree();
      }
    });
  })();