MediaWiki:Gadget-ShowContributors.js:修订间差异
MediaWiki界面页面
更多操作
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
(未显示同一用户的30个中间版本) | |||
第1行: | 第1行: | ||
(() | // 原作者萌娘百科BearBin | ||
//遵循BSD 3-Clause License使用代码 | |||
//全文请参见上方文档 | |||
//GitHub仓库地址:https://github.com/BearBin1215/MoegirlPedia | |||
(function() { | |||
"use strict"; | "use strict"; | ||
$(() | $(function() { | ||
(function() { | |||
if ( | |||
![0, 2, 4, 10, 12, 14, 828, 274].includes(mw.config.get("wgNamespaceNumber")) || | |||
0 === mw.config.get("wgArticleId") || | |||
!["view", "history"].includes(mw.config.get("wgAction")) | |||
) | |||
return; | |||
mw.loader.using([ | |||
"mediawiki.api", | |||
"mediawiki.notification", | |||
"oojs-ui", | |||
"oojs-ui.styles.icons-interactions", | |||
"jquery.tablesorter" | |||
]).then(function() { | |||
function ShowContributorDialog(config) { | |||
OO.ui.Dialog.call(this, config); | |||
this.$table = $('<table id="show-contributor-table" class="wikitable" />'); | |||
this.$tbody = $("<tbody />"); | |||
this.got = false; | |||
} | |||
OO.inheritClass(ShowContributorDialog, OO.ui.Dialog); | |||
ShowContributorDialog.static = ShowContributorDialog.static || {}; | |||
ShowContributorDialog.static.name = "ShowContributor"; | |||
ShowContributorDialog.static.tagName = "div"; | |||
} | |||
. | |||
ShowContributorDialog.prototype.initialize = function() { | |||
OO.ui.Dialog.prototype.initialize.call(this); | |||
this.$body.append( | |||
$('<div id="show-contributor-header" />').append( | |||
$('<div id="show-contributor-headline">本页贡献统计</div>'), | |||
new OO.ui.IconWidget({icon:"close",id:"show-contributor-close"}).$element.on("click", function() { | |||
this.close(); | |||
}.bind(this)) | |||
), | |||
this.$table.append( | |||
$("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"), | |||
this.$tbody | |||
) | |||
); | |||
return this; | |||
}; | |||
ShowContributorDialog.prototype.getContributors = function() { | |||
var self = this; | |||
return new Promise(function(resolve, reject) { | |||
var api = new mw.Api(); | |||
var contributors = {}; | |||
var continueToken = ""; | |||
var prevSize = 0; | |||
var params = { | |||
action: "query", | |||
format: "json", | |||
prop: "revisions", | |||
titles: mw.config.get("wgPageName"), | |||
rvprop: "user|size", | |||
rvlimit: "max", | |||
rvdir: "newer" | |||
}; | |||
function fetchRevisions() { | |||
if (continueToken) params.rvcontinue = continueToken; | |||
api.get(params).then(function(response) { | |||
}). | continueToken = response.continue ? response.continue.rvcontinue : undefined; | ||
var revisions = Object.values(response.query.pages)[0].revisions; | |||
for (var i = 0; i < revisions.length; i++) { | |||
var user = revisions[i].user; | |||
var size = revisions[i].size; | |||
contributors[user] = contributors[user] || []; | |||
contributors[user].push(size - prevSize); | |||
prevSize = size; | |||
} | |||
if (continueToken) { | |||
fetchRevisions(); | |||
} else { | |||
resolve(contributors); | |||
} | |||
}).catch(function(error) { | |||
mw.notify('获取编辑记录失败:' + error, { type: "error" }); | |||
reject(error); | |||
}); | |||
} | |||
fetchRevisions(); | |||
}); | |||
}; | |||
ShowContributorDialog.prototype.addRow = function(tbody, data) { | |||
var user = data.user; | |||
var count = data.count; | |||
var add = data.add; | |||
var remove = data.remove; | |||
tbody.append( | |||
$("<tr />").append( | |||
$("<td />").append( | |||
$(`<a href="${mw.config.get("wgArticlePath").replace("$1", `User:${user}`)}" />`).text(user) | |||
), | |||
`<td>${count}</td>`, | |||
`<td>${add}</td>`, | |||
`<td>${remove}</td>` | |||
) | |||
); | |||
}; | }; | ||
ShowContributorDialog.prototype.showContributors = function(contributors) { | |||
this.$tbody.empty(); | |||
for (var user in contributors) { | |||
if (contributors.hasOwnProperty(user)) { | |||
var edits = contributors[user]; | |||
var add = edits.reduce(function(sum, delta) { | |||
return delta > 0 ? sum + delta : sum; | |||
}, 0); | |||
var remove = edits.reduce(function(sum, delta) { | |||
return delta < 0 ? sum + delta : sum; | |||
}, 0); | |||
this.addRow(this.$tbody, { | |||
user: user, | |||
count: edits.length, | |||
add: add, | |||
remove: remove | |||
}); | |||
} | } | ||
} | } | ||
} | this.got = true; | ||
}; | |||
var windowManager = new OO.ui.WindowManager({id:"show-contributor"}); | |||
$(document.body).append(windowManager.$element); | |||
var dialog = new ShowContributorDialog({size:"large"}); | |||
windowManager.addWindows([dialog]); | |||
var button = new OO.ui.ButtonWidget({ | |||
label:"本页贡献者", | |||
icon:"search", | |||
flags:"progressive", | |||
id:"show-contributor-button" | |||
}); | |||
var insertButton = function() { | |||
$("#show-contributor-button").detach(); | |||
var skin = mw.config.get("skin"); | |||
if (skin === "citizen") { | |||
if (window.innerWidth >= 1120) { | |||
$(".page-actions").prepend(button.$element); | |||
} else { | |||
$(".firstHeading-container").append(button.$element); | |||
} | |||
} else if (skin === "vector-2022") { | |||
$("header.mw-body-header.vector-page-titlebar").append(button.$element); | |||
} else { | |||
$("#bodyContent").prepend(button.$element); | |||
$ | |||
} | } | ||
}; | |||
// 初始插入 | |||
insertButton(); | |||
// 仅在断点穿越时更新插入位置 | |||
var isWide = window.innerWidth >= 1120; | |||
$(window).on("resize", function() { | |||
clearTimeout(window.__showContributorResizeTimer); | |||
window.__showContributorResizeTimer = setTimeout(function() { | |||
var nowWide = window.innerWidth >= 1120; | |||
if (nowWide !== isWide) { | |||
isWide = nowWide; | |||
insertButton(); | |||
} | |||
}, 200); | |||
}); | |||
// 点击事件 | |||
button.on("click", function() { | |||
(function() { | |||
if (!dialog.got) { | |||
button.setLabel("正在查询"); | |||
dialog.getContributors().then(function(contributors) { | |||
dialog.showContributors(contributors); | |||
dialog.$table.tablesorter(); | |||
button.setLabel("本页贡献者"); | |||
windowManager.openWindow(dialog); | |||
}).catch(function(error) { | |||
console.error('获取贡献者数据失败:', error); | |||
button.setLabel("本页贡献者"); | |||
}); | |||
} else { | |||
windowManager.openWindow(dialog); | |||
} | |||
})(); | |||
}); | |||
}); | |||
})(); | |||
}); | |||
})(); | })(); |
2025年6月17日 (二) 19:06的版本
// 原作者萌娘百科BearBin
//遵循BSD 3-Clause License使用代码
//全文请参见上方文档
//GitHub仓库地址:https://github.com/BearBin1215/MoegirlPedia
(function() {
"use strict";
$(function() {
(function() {
if (
![0, 2, 4, 10, 12, 14, 828, 274].includes(mw.config.get("wgNamespaceNumber")) ||
0 === mw.config.get("wgArticleId") ||
!["view", "history"].includes(mw.config.get("wgAction"))
)
return;
mw.loader.using([
"mediawiki.api",
"mediawiki.notification",
"oojs-ui",
"oojs-ui.styles.icons-interactions",
"jquery.tablesorter"
]).then(function() {
function ShowContributorDialog(config) {
OO.ui.Dialog.call(this, config);
this.$table = $('<table id="show-contributor-table" class="wikitable" />');
this.$tbody = $("<tbody />");
this.got = false;
}
OO.inheritClass(ShowContributorDialog, OO.ui.Dialog);
ShowContributorDialog.static = ShowContributorDialog.static || {};
ShowContributorDialog.static.name = "ShowContributor";
ShowContributorDialog.static.tagName = "div";
ShowContributorDialog.prototype.initialize = function() {
OO.ui.Dialog.prototype.initialize.call(this);
this.$body.append(
$('<div id="show-contributor-header" />').append(
$('<div id="show-contributor-headline">本页贡献统计</div>'),
new OO.ui.IconWidget({icon:"close",id:"show-contributor-close"}).$element.on("click", function() {
this.close();
}.bind(this))
),
this.$table.append(
$("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"),
this.$tbody
)
);
return this;
};
ShowContributorDialog.prototype.getContributors = function() {
var self = this;
return new Promise(function(resolve, reject) {
var api = new mw.Api();
var contributors = {};
var continueToken = "";
var prevSize = 0;
var params = {
action: "query",
format: "json",
prop: "revisions",
titles: mw.config.get("wgPageName"),
rvprop: "user|size",
rvlimit: "max",
rvdir: "newer"
};
function fetchRevisions() {
if (continueToken) params.rvcontinue = continueToken;
api.get(params).then(function(response) {
continueToken = response.continue ? response.continue.rvcontinue : undefined;
var revisions = Object.values(response.query.pages)[0].revisions;
for (var i = 0; i < revisions.length; i++) {
var user = revisions[i].user;
var size = revisions[i].size;
contributors[user] = contributors[user] || [];
contributors[user].push(size - prevSize);
prevSize = size;
}
if (continueToken) {
fetchRevisions();
} else {
resolve(contributors);
}
}).catch(function(error) {
mw.notify('获取编辑记录失败:' + error, { type: "error" });
reject(error);
});
}
fetchRevisions();
});
};
ShowContributorDialog.prototype.addRow = function(tbody, data) {
var user = data.user;
var count = data.count;
var add = data.add;
var remove = data.remove;
tbody.append(
$("<tr />").append(
$("<td />").append(
$(`<a href="${mw.config.get("wgArticlePath").replace("$1", `User:${user}`)}" />`).text(user)
),
`<td>${count}</td>`,
`<td>${add}</td>`,
`<td>${remove}</td>`
)
);
};
ShowContributorDialog.prototype.showContributors = function(contributors) {
this.$tbody.empty();
for (var user in contributors) {
if (contributors.hasOwnProperty(user)) {
var edits = contributors[user];
var add = edits.reduce(function(sum, delta) {
return delta > 0 ? sum + delta : sum;
}, 0);
var remove = edits.reduce(function(sum, delta) {
return delta < 0 ? sum + delta : sum;
}, 0);
this.addRow(this.$tbody, {
user: user,
count: edits.length,
add: add,
remove: remove
});
}
}
this.got = true;
};
var windowManager = new OO.ui.WindowManager({id:"show-contributor"});
$(document.body).append(windowManager.$element);
var dialog = new ShowContributorDialog({size:"large"});
windowManager.addWindows([dialog]);
var button = new OO.ui.ButtonWidget({
label:"本页贡献者",
icon:"search",
flags:"progressive",
id:"show-contributor-button"
});
var insertButton = function() {
$("#show-contributor-button").detach();
var skin = mw.config.get("skin");
if (skin === "citizen") {
if (window.innerWidth >= 1120) {
$(".page-actions").prepend(button.$element);
} else {
$(".firstHeading-container").append(button.$element);
}
} else if (skin === "vector-2022") {
$("header.mw-body-header.vector-page-titlebar").append(button.$element);
} else {
$("#bodyContent").prepend(button.$element);
}
};
// 初始插入
insertButton();
// 仅在断点穿越时更新插入位置
var isWide = window.innerWidth >= 1120;
$(window).on("resize", function() {
clearTimeout(window.__showContributorResizeTimer);
window.__showContributorResizeTimer = setTimeout(function() {
var nowWide = window.innerWidth >= 1120;
if (nowWide !== isWide) {
isWide = nowWide;
insertButton();
}
}, 200);
});
// 点击事件
button.on("click", function() {
(function() {
if (!dialog.got) {
button.setLabel("正在查询");
dialog.getContributors().then(function(contributors) {
dialog.showContributors(contributors);
dialog.$table.tablesorter();
button.setLabel("本页贡献者");
windowManager.openWindow(dialog);
}).catch(function(error) {
console.error('获取贡献者数据失败:', error);
button.setLabel("本页贡献者");
});
} else {
windowManager.openWindow(dialog);
}
})();
});
});
})();
});
})();