MediaWiki:Gadget-ShowContributors.js:修订间差异
MediaWiki界面页面
更多操作
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
(未显示同一用户的2个中间版本) | |||
第1行: | 第1行: | ||
// 原作者萌娘百科BearBin | // 原作者萌娘百科BearBin | ||
//遵循BSD 3-Clause License使用代码 | //遵循BSD 3-Clause License使用代码 | ||
//全文请参见上方文档 | |||
//GitHub仓库地址:https://github.com/BearBin1215/MoegirlPedia | //GitHub仓库地址:https://github.com/BearBin1215/MoegirlPedia | ||
(function() { | (function() { | ||
第42行: | 第13行: | ||
) | ) | ||
return; | return; | ||
mw.loader.using([ | mw.loader.using([ |
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); } })(); }); }); })(); }); })();