MediaWiki:Common.js:修订间差异
来自Mindustry中文wiki
无编辑摘要 |
无编辑摘要 |
||
| 第39行: | 第39行: | ||
console.log("Mindustry 导航栏脚本已执行"); | console.log("Mindustry 导航栏脚本已执行"); | ||
}); | }); | ||
mw.loader.using(['mediawiki.util'], function () { | |||
if (mw.config.get('skin') !== 'timeless') return; | if (mw.config.get('skin') !== 'timeless') return; | ||
var navSel = '#mw-site-navigation #p-navigation ' + | var navSel = | ||
'#mw-site-navigation ' + | |||
'#p-navigation ' + | |||
'.mw-portlet-body > ul'; | '.mw-portlet-body > ul'; | ||
var navRoot = document.querySelector(navSel); | var navRoot = document.querySelector(navSel); | ||
if (!navRoot) return; | if (!navRoot) return; | ||
| 第50行: | 第52行: | ||
var storageKey = 'mdt.sidebar.tree.v2'; | var storageKey = 'mdt.sidebar.tree.v2'; | ||
var persisted = {}; | var persisted = {}; | ||
try { | try { | ||
persisted = JSON.parse(localStorage.getItem(storageKey) || '{}'); | persisted = JSON.parse( | ||
localStorage.getItem(storageKey) || '{}' | |||
); | |||
} catch (e) {} | } catch (e) {} | ||
function pageFromHref(href) { | function pageFromHref(href) { | ||
| 第74行: | 第64行: | ||
var t = url.searchParams.get('title'); | var t = url.searchParams.get('title'); | ||
if (t) return t.replace(/ /g, '_'); | if (t) return t.replace(/ /g, '_'); | ||
var marker = '/index.php/'; | var marker = '/index.php/'; | ||
var i = url.pathname.indexOf(marker); | var i = url.pathname.indexOf(marker); | ||
if (i === -1) return null; | if (i === -1) return null; | ||
var p = url.pathname.slice(i + marker.length); | var p = url.pathname.slice(i + marker.length); | ||
return decodeURIComponent(p).replace(/ /g, '_'); | return decodeURIComponent(p).replace(/ /g, '_'); | ||
| 第83行: | 第75行: | ||
} | } | ||
var | function getKey(li) { | ||
if (li.dataset.mdtKey) return li.dataset.mdtKey; | |||
if (li.id) return li.id; | |||
var a = li.querySelector('a'); | |||
if (!a) return ''; | |||
return a.getAttribute('href') || ''; | |||
} | |||
function setOpen(li, open) { | |||
li.classList.toggle('mdt-nav__group--open', open); | |||
var key = getKey(li); | |||
if (!key) return; | |||
persisted[key] = open; | |||
localStorage.setItem(storageKey, JSON.stringify(persisted)); | |||
} | |||
function ensureGroup( | function ensureGroup(parentLi) { | ||
var sub = | parentLi.classList.add('mdt-nav__group'); | ||
var sub = parentLi.querySelector('ul.mdt-nav__sublist'); | |||
if (!sub) { | if (!sub) { | ||
sub = document.createElement('ul'); | sub = document.createElement('ul'); | ||
sub.className = 'mdt-nav__sublist'; | sub.className = 'mdt-nav__sublist'; | ||
parentLi.appendChild(sub); | |||
} | } | ||
var btn = parentLi.querySelector('button.mdt-nav__toggle'); | |||
var btn = | |||
if (!btn) { | if (!btn) { | ||
btn = document.createElement('button'); | btn = document.createElement('button'); | ||
| 第103行: | 第108行: | ||
btn.className = 'mdt-nav__toggle'; | btn.className = 'mdt-nav__toggle'; | ||
btn.setAttribute('aria-label', '展开/收起'); | btn.setAttribute('aria-label', '展开/收起'); | ||
parentLi.insertBefore(btn, sub); | |||
btn.addEventListener('click', function (ev) { | btn.addEventListener('click', function (ev) { | ||
ev.preventDefault(); | ev.preventDefault(); | ||
ev.stopPropagation(); | ev.stopPropagation(); | ||
var group = ev. | var group = ev.target.closest('li.mdt-nav__group'); | ||
if (!group) return; | |||
setOpen(group, !group.classList.contains('mdt- | setOpen(group, !group.classList.contains('mdt- | ||
nav__group--open')); | nav__group--open')); | ||
| 第114行: | 第120行: | ||
} | } | ||
var key = | var key = getKey(parentLi); | ||
if (key) | if (key) parentLi.dataset.mdtKey = key; | ||
if ( | if (persisted[key] === true) setOpen(parentLi, true); | ||
return sub; | return sub; | ||
} | } | ||
var items = Array.from(navRoot.children); | |||
var lastAtDepth = []; | |||
for (var idx = 0; idx < items.length; idx++) { | for (var idx = 0; idx < items.length; idx++) { | ||
| 第130行: | 第139行: | ||
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; | ||
if (m) { | if (m) { | ||
depth = Math.min(Math.floor(m[1].length / 2), 3); | depth = Math.min(Math.floor(m[1].length / 2), 3); | ||
| 第138行: | 第147行: | ||
li.classList.add('mdt-nav__item'); | li.classList.add('mdt-nav__item'); | ||
if (depth > 0) { | if (depth > 0) { | ||
li.classList.add('mdt-nav__item--sub'); | li.classList.add('mdt-nav__item--sub'); | ||
| 第143行: | 第153行: | ||
} | } | ||
if (depth > 0 && ! | if (depth > 0 && !lastAtDepth[depth - 1]) depth = 0; | ||
if (depth > 0) { | if (depth > 0) { | ||
var | var parentLi = lastAtDepth[depth - 1]; | ||
var sublist = ensureGroup( | var sublist = ensureGroup(parentLi); | ||
sublist.appendChild(li); | sublist.appendChild(li); | ||
} | } | ||
lastAtDepth[depth] = li; | |||
lastAtDepth.length = depth + 1; | |||
} | } | ||
var current = mw.config.get('wgPageName'); | |||
var links = navRoot.querySelectorAll('a'); | var links = navRoot.querySelectorAll('a'); | ||
var active = null; | var active = null; | ||
for (var | |||
var | for (var j = 0; j < links.length; j++) { | ||
if ( | var page = pageFromHref(links[j].href); | ||
if (page && page === current) { active = links[j]; break; } | |||
} | } | ||
if (active) { | if (active) { | ||
active.classList.add('mdt-nav__link--active'); | active.classList.add('mdt-nav__link--active'); | ||
var | var group = active.closest('li.mdt-nav__group'); | ||
if (group) setOpen(group, true); | |||
} | } | ||
}); | }); | ||
2026年1月8日 (四) 13:53的版本
/* 这里的任何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 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;
}
function getKey(li) {
if (li.dataset.mdtKey) return li.dataset.mdtKey;
if (li.id) return li.id;
var a = li.querySelector('a');
if (!a) return '';
return a.getAttribute('href') || '';
}
function setOpen(li, open) {
li.classList.toggle('mdt-nav__group--open', open);
var key = getKey(li);
if (!key) return;
persisted[key] = open;
localStorage.setItem(storageKey, JSON.stringify(persisted));
}
function ensureGroup(parentLi) {
parentLi.classList.add('mdt-nav__group');
var sub = parentLi.querySelector('ul.mdt-nav__sublist');
if (!sub) {
sub = document.createElement('ul');
sub.className = 'mdt-nav__sublist';
parentLi.appendChild(sub);
}
var btn = parentLi.querySelector('button.mdt-nav__toggle');
if (!btn) {
btn = document.createElement('button');
btn.type = 'button';
btn.className = 'mdt-nav__toggle';
btn.setAttribute('aria-label', '展开/收起');
parentLi.insertBefore(btn, sub);
btn.addEventListener('click', function (ev) {
ev.preventDefault();
ev.stopPropagation();
var group = ev.target.closest('li.mdt-nav__group');
if (!group) return;
setOpen(group, !group.classList.contains('mdt-
nav__group--open'));
});
}
var key = getKey(parentLi);
if (key) parentLi.dataset.mdtKey = key;
if (persisted[key] === true) setOpen(parentLi, true);
return sub;
}
var items = Array.from(navRoot.children);
var lastAtDepth = [];
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 && !lastAtDepth[depth - 1]) depth = 0;
if (depth > 0) {
var parentLi = lastAtDepth[depth - 1];
var sublist = ensureGroup(parentLi);
sublist.appendChild(li);
}
lastAtDepth[depth] = li;
lastAtDepth.length = depth + 1;
}
var current = mw.config.get('wgPageName');
var links = navRoot.querySelectorAll('a');
var active = null;
for (var j = 0; j < links.length; j++) {
var page = pageFromHref(links[j].href);
if (page && page === current) { active = links[j]; break; }
}
if (active) {
active.classList.add('mdt-nav__link--active');
var group = active.closest('li.mdt-nav__group');
if (group) setOpen(group, true);
}
});
