User: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);
});
})()))
})();