用户:OctoberSama/ShowContributors.js
来自电棍ottowiki
更多操作
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
(() => { "use strict"; $((() => (async () => { 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.addStyleTag(` #show-contributor-button { float: right; margin-left: .5em; margin-right: 0; } #show-contributor-header { background: #fff; border-bottom: 1px solid #aaa; font-weight: 600; padding: .3em; position: sticky; text-align: center; top: 0; } #show-contributor-headline { font-size: 1.3em; } #show-contributor-close { border-radius: 50%; cursor: pointer; position: absolute; right: 5px; top: 5px; } #show-contributor-close:hover { background-color: #eee; } #show-contributor-table { margin: 0; width: 100%; } #show-contributor-table .user-avatar { border-radius: 50%; height: 20px; width: 20px; } .skin-citizen #show-contributor-button { float: none; margin: 0 0.5em 0 0; display: inline-flex; align-items: center; vertical-align: middle; } @media (min-width: 1120px) { .skin-citizen .citizen-page-header-inner { display: flex; justify-content: space-between; align-items: center; } .skin-citizen .citizen-page-heading { flex-grow: 1; } } @media (max-width: 1119px) { .skin-citizen #show-contributor-button { margin: 0.5em 0; display: block; } } `); await mw.loader.using([ "mediawiki.api", "mediawiki.notification", "oojs-ui", "oojs-ui.styles.icons-interactions", "jquery.tablesorter" ]); class t extends OO.ui.Dialog { $table = $('<table id="show-contributor-table" class="wikitable" />'); $tbody = $("<tbody />"); $body; got = !1; static static = {...super.static,name:"ShowContributor",tagName:"div"}; initialize() { return super.initialize(), 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",(()=>this.close())) ), this.$table.append( $("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"), this.$tbody ) ), this } getContributors = async () => { const t = new mw.Api, e = {}; let o = "", i = 0; const r = { action:"query", format:"json", prop:"revisions", titles:mw.config.get("wgPageName"), rvprop:"user|size", rvlimit:"max", rvdir:"newer" }; do { o && (r.rvcontinue = o); try { const n = await t.get(r); o = n.continue?.rvcontinue; for (const {user:t,size:o} of Object.values(n.query.pages)[0].revisions) e[t] ||= [], e[t].push(o - i), i = o } catch (t) { mw.notify(`获取编辑记录失败:${t}`,{type:"error"}) } } while (o); return e }; addRow = (t,{user:e,count:o,add:i,remove:r}) => { t.append( $("<tr />").append( $("<td />").append( $(`<a href="${mw.config.get("wgArticlePath").replace("$1",`User:${e}`)}" />`).text(e) ), `<td>${o}</td>`, `<td>${i}</td>`, `<td>${r}</td>` ) ) }; showContributors = t => { this.$tbody.empty(); for (const e in t) this.addRow(this.$tbody, { user:e, count:t[e].length, add:t[e].reduce((s,n)=>n>0?s+n:s,0), remove:t[e].reduce((s,n)=>n<0?s+n:s,0) }); this.got = !0 } } const e = new OO.ui.WindowManager({id:"show-contributor"}); $(document.body).append(e.$element); const o = new t({size:"large"}); e.addWindows([o]); const i = new OO.ui.ButtonWidget({ label:"本页贡献者", icon:"search", flags:"progressive", id:"show-contributor-button" }); const insertButton = () => { $("#show-contributor-button").detach(); const skin = mw.config.get("skin"); if (skin === "citizen") { if (window.innerWidth >= 1120) { $(".page-actions").prepend(i.$element); } else { $(".firstHeading-container").append(i.$element); } } else if (skin === "vector-2022") { $("header.mw-body-header.vector-page-titlebar").append(i.$element); } else { $("#bodyContent").prepend(i.$element); } }; // 初始插入 insertButton(); // 仅在断点穿越时更新插入位置 let isWide = window.innerWidth >= 1120; $(window).on("resize", () => { clearTimeout(window.__showContributorResizeTimer); window.__showContributorResizeTimer = setTimeout(() => { const nowWide = window.innerWidth >= 1120; if (nowWide !== isWide) { isWide = nowWide; insertButton(); } }, 200); }); // 点击事件 i.on("click", async () => { if (!o.got) { i.setLabel("正在查询"); const t = await o.getContributors(); o.showContributors(t); o.$table.tablesorter(); i.setLabel("本页贡献者"); } e.openWindow(o); }); })())) })();