MediaWiki:Gadget-ShowContributors.js:修订间差异
MediaWiki界面页面
更多操作
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
第16行: | 第16行: | ||
"#show-contributor-table{margin:0;width:100%}" + | "#show-contributor-table{margin:0;width:100%}" + | ||
"#show-contributor-table .user-avatar{border-radius:50%;height:20px;width:20px}" + | "#show-contributor-table .user-avatar{border-radius:50%;height:20px;width:20px}" + | ||
// Citizen 皮肤专用样式 | // 添加 Citizen 皮肤专用样式 | ||
".skin-citizen #show-contributor-button{float:none;margin-left:0;margin-right:.5em;display:inline-flex;align-items:center}" + | ".skin-citizen #show-contributor-button{float:none;margin-left:0;margin-right:.5em;display:inline-flex;align-items:center}" + | ||
".skin-citizen .page-actions{display:flex;align-items:center;gap:.5em | ".skin-citizen .page-actions{display:flex;align-items:center;gap:.5em}" | ||
), | ), | ||
await mw.loader.using([ | await mw.loader.using([ | ||
第141行: | 第137行: | ||
// 修改后的插入位置逻辑 | // 修改后的插入位置逻辑 | ||
if ("citizen" === mw.config.get("skin")) { | if ("citizen" === mw.config.get("skin")) { | ||
// | // 插入到 page-actions 容器中 | ||
$(".page-actions").prepend(i.$element); | $(".page-actions").prepend(i.$element); | ||
} else { | } else { | ||
// 其他皮肤:保持原逻辑 | // 其他皮肤:保持原逻辑 |
2025年6月10日 (二) 23:01的版本
(() => {
"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}" +
// 添加 Citizen 皮肤专用样式
".skin-citizen #show-contributor-button{float:none;margin-left:0;margin-right:.5em;display:inline-flex;align-items:center}" +
".skin-citizen .page-actions{display:flex;align-items:center;gap:.5em}"
),
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}`)}" />`).append(
`<img class="user-avatar" src="https://commons.moegirl.org.cn/extensions/Avatar/avatar.php?user=${e}" />`,
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(((t, e) => e > 0 ? t + e : t), 0),
remove: t[e].reduce(((t, e) => e < 0 ? t + e : t), 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"
});
// 修改后的插入位置逻辑
if ("citizen" === mw.config.get("skin")) {
// 插入到 page-actions 容器中
$(".page-actions").prepend(i.$element);
} else {
// 其他皮肤:保持原逻辑
$("#bodyContent").prepend(i.$element);
}
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)
}))
})()))
})();