MediaWiki:Common.js:修订间差异
MediaWiki界面页面
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第21行: | 第21行: | ||
}); | }); | ||
$(function () { | $(function () { | ||
// | // 动态注入彩虹样式 | ||
var rainbowStyle = document.createElement('style'); | var rainbowStyle = document.createElement('style'); | ||
rainbowStyle.textContent = | rainbowStyle.textContent = | ||
| 第41行: | 第41行: | ||
document.head.appendChild(rainbowStyle); | document.head.appendChild(rainbowStyle); | ||
// ---------- 辅助函数 ---------- | |||
// 从链接元素中提取纯净用户名(卡片内有<span>,取span文本) | |||
// | |||
// | |||
function getUserName(link) { | function getUserName(link) { | ||
var $span = $(link).find('span').first(); | var $span = $(link).find('span').first(); | ||
if ($span.length) { | if ($span.length) { | ||
return $span.text().trim(); | return $span.text().trim(); | ||
} | } | ||
return $(link).text().trim(); | return $(link).text().trim(); | ||
} | } | ||
// 收集去重用户名 | // 给一组链接批量上色 | ||
function applyColorsToLinks($links) { | |||
if ($links.length === 0) return; | |||
// 收集去重用户名 | |||
users. | var users = []; | ||
$links.each(function () { | |||
var name = getUserName(this); | |||
if (name && users.indexOf(name) === -1) users.push(name); | |||
}); | |||
if (users.length === 0) return; | |||
// 分批查询 API | |||
var batchSize = 50; | |||
var batches = []; | |||
for (var i = 0; i < users.length; i += batchSize) { | |||
batches.push(users.slice(i, i + batchSize)); | |||
} | } | ||
var processBatch = function (batch) { | |||
var api = new mw.Api(); | |||
return api.get({ | |||
action: 'query', | |||
batches. | list: 'users', | ||
ususers: batch.join('|'), | |||
usprop: 'editcount' | |||
}).then(function (data) { | |||
var classMap = {}; | |||
if (data.query && data.query.users) { | |||
data.query.users.forEach(function (u) { | |||
var ec = u.editcount || 0; | |||
if (ec >= 5000) { | |||
classMap[u.name] = 'rainbow-user'; | |||
} else if (ec >= 2000) { | |||
classMap[u.name] = 'gold-user'; | |||
} else if (ec >= 1000) { | |||
classMap[u.name] = 'platinum-user'; | |||
} else if (ec >= 500) { | |||
classMap[u.name] = 'silver-user'; | |||
} else if (ec >= 1) { | |||
classMap[u.name] = 'bronze-user'; | |||
} | |||
}); | |||
} | |||
// 应用类名 | |||
$links.each(function () { | |||
var $this = $(this); | |||
var userName = getUserName(this); | |||
var cls = classMap[userName]; | |||
if (cls) { | |||
$this.removeClass('bronze-user silver-user platinum-user gold-user rainbow-user'); | |||
$this.addClass(cls); | |||
} | |||
}); | |||
}); | |||
}; | |||
// 顺序执行批次 | |||
var promise = $.Deferred().resolve(); | |||
batches.forEach(function (batch) { | |||
promise = promise.then(function () { | |||
return processBatch(batch); | |||
}); | |||
}); | |||
} | } | ||
var | // ---------- 1. 处理页面初始就存在的用户链接 ---------- | ||
var $initialLinks = $('a.mw-userlink, .citizen-menu_card-content a'); | |||
applyColorsToLinks($initialLinks); | |||
// ---------- 2. 监听动态插入的卡片(MutationObserver) ---------- | |||
var observer = new MutationObserver(function (mutations) { | |||
var addedLinks = []; | |||
mutations.forEach(function (mutation) { | |||
$(mutation.addedNodes).each(function () { | |||
// 如果新增的是一个元素节点 | |||
if (this.nodeType === 1) { | |||
// 直接在新增节点及其后代中找目标链接 | |||
var $newLinks = $(this).find('a.mw-userlink, .citizen-menu_card-content a'); | |||
// 也包含该节点本身就是目标链接的情况 | |||
if ($(this).is('a.mw-userlink, .citizen-menu_card-content a')) { | |||
$newLinks = $newLinks.add($(this)); | |||
} | |||
if ($newLinks.length > 0) { | |||
addedLinks = addedLinks.concat($newLinks.toArray()); | |||
} | |||
} | } | ||
} | } | ||
}); | }); | ||
}); | }); | ||
}; | if (addedLinks.length > 0) { | ||
applyColorsToLinks($(addedLinks)); | |||
} | |||
}); | |||
// 监视整个文档的子节点变化(卡片通常插入到 body 或某个容器) | |||
observer.observe(document.body, { | |||
childList: true, | |||
subtree: true | |||
}); | }); | ||
}); | }); | ||
2026年5月31日 (日) 06:52的版本
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
// 自动加载 MediaWiki:Footer 页面内容,并插入到每个页面底部
$(document).ready(function() {
const namespace = mw.config.get('wgNamespaceNumber');
const action = mw.config.get('wgAction');
if (namespace !== 0 || action !== 'view') {
return;
}
fetch("/api.php?action=parse&page=MediaWiki:Footer&format=json")
.then(res => res.json())
.then(data => {
if (data.parse && data.parse.text) {
const html = data.parse.text['*'];
$('#mw-content-text').append('<div class="global-footer">' + html + '</div>');
}
});
});
$(function () {
// 动态注入彩虹样式
var rainbowStyle = document.createElement('style');
rainbowStyle.textContent =
'.rainbow-user {' +
'font-weight: bold;' +
'background: repeating-linear-gradient(90deg, red 0px, orange 10px, yellow 20px, green 30px, blue 40px, indigo 50px, violet 60px);' +
'-webkit-background-clip: text;' +
'-webkit-text-fill-color: transparent;' +
'background-clip: text;' +
'color: #FFD700;' +
'}' +
'.rainbow-user::after {' +
'content: "⭐⭐⭐⭐⭐";' +
'margin-left: 2px;' +
'font-weight: normal;' +
'-webkit-text-fill-color: initial;' +
'color: #FFD700;' +
'}';
document.head.appendChild(rainbowStyle);
// ---------- 辅助函数 ----------
// 从链接元素中提取纯净用户名(卡片内有<span>,取span文本)
function getUserName(link) {
var $span = $(link).find('span').first();
if ($span.length) {
return $span.text().trim();
}
return $(link).text().trim();
}
// 给一组链接批量上色
function applyColorsToLinks($links) {
if ($links.length === 0) return;
// 收集去重用户名
var users = [];
$links.each(function () {
var name = getUserName(this);
if (name && users.indexOf(name) === -1) users.push(name);
});
if (users.length === 0) return;
// 分批查询 API
var batchSize = 50;
var batches = [];
for (var i = 0; i < users.length; i += batchSize) {
batches.push(users.slice(i, i + batchSize));
}
var processBatch = function (batch) {
var api = new mw.Api();
return api.get({
action: 'query',
list: 'users',
ususers: batch.join('|'),
usprop: 'editcount'
}).then(function (data) {
var classMap = {};
if (data.query && data.query.users) {
data.query.users.forEach(function (u) {
var ec = u.editcount || 0;
if (ec >= 5000) {
classMap[u.name] = 'rainbow-user';
} else if (ec >= 2000) {
classMap[u.name] = 'gold-user';
} else if (ec >= 1000) {
classMap[u.name] = 'platinum-user';
} else if (ec >= 500) {
classMap[u.name] = 'silver-user';
} else if (ec >= 1) {
classMap[u.name] = 'bronze-user';
}
});
}
// 应用类名
$links.each(function () {
var $this = $(this);
var userName = getUserName(this);
var cls = classMap[userName];
if (cls) {
$this.removeClass('bronze-user silver-user platinum-user gold-user rainbow-user');
$this.addClass(cls);
}
});
});
};
// 顺序执行批次
var promise = $.Deferred().resolve();
batches.forEach(function (batch) {
promise = promise.then(function () {
return processBatch(batch);
});
});
}
// ---------- 1. 处理页面初始就存在的用户链接 ----------
var $initialLinks = $('a.mw-userlink, .citizen-menu_card-content a');
applyColorsToLinks($initialLinks);
// ---------- 2. 监听动态插入的卡片(MutationObserver) ----------
var observer = new MutationObserver(function (mutations) {
var addedLinks = [];
mutations.forEach(function (mutation) {
$(mutation.addedNodes).each(function () {
// 如果新增的是一个元素节点
if (this.nodeType === 1) {
// 直接在新增节点及其后代中找目标链接
var $newLinks = $(this).find('a.mw-userlink, .citizen-menu_card-content a');
// 也包含该节点本身就是目标链接的情况
if ($(this).is('a.mw-userlink, .citizen-menu_card-content a')) {
$newLinks = $newLinks.add($(this));
}
if ($newLinks.length > 0) {
addedLinks = addedLinks.concat($newLinks.toArray());
}
}
});
});
if (addedLinks.length > 0) {
applyColorsToLinks($(addedLinks));
}
});
// 监视整个文档的子节点变化(卡片通常插入到 body 或某个容器)
observer.observe(document.body, {
childList: true,
subtree: true
});
});