|
|
(未显示同一用户的4个中间版本) |
第33行: |
第33行: |
|
| |
|
| //贡献者统计 | | //贡献者统计 |
| (() => {
| | // mw.loader.load("/index.php?title=User:OctoberSama/ShowContributors.js&action=raw&ctype=text/javascript"); |
| "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);
| |
| });
| |
| })()))
| |
| })();
| |