MediaWiki:Gadget-ShowContributors.js:修订间差异
MediaWiki界面页面
更多操作
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
第1行: | 第1行: | ||
( | (() => { | ||
"use strict"; | "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 { | .skin-citizen #show-contributor-button { | ||
margin: 0.5em 0; | |||
margin: | display: block; | ||
display: | |||
} | } | ||
} | |||
`); | |||
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 | 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" | |||
}; | }; | ||
addRow = (t,{user:e,count:o,add:i,remove:r}) => { | 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 { | } 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); | |||
}); | |||
})())) | |||
})(); | })(); |
2025年6月17日 (二) 16:47的版本
(() => {
"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);
});
})()))
})();