MediaWiki:Common.js

来自Mindustry中文wiki
绿豆留言 | 贡献2026年1月8日 (四) 15:30的版本

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5

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