MediaWiki:Gadget-ShowContributors.js:修订间差异
MediaWiki界面页面
更多操作
![]() OctoberSama(留言 | 贡献) 小 |
![]() 小 |
||
第8行: | 第8行: | ||
) | ) | ||
return; | return; | ||
mw.loader.addStyleTag( | |||
mw.loader.addStyleTag( | "#show-contributor-button{float:right;margin-left:.5em;margin-right:0}" + | ||
#show-contributor-button { | "#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({ | const i = new OO.ui.ButtonWidget({ | ||
label: "本页贡献者", | label: "本页贡献者", | ||
第88行: | 第134行: | ||
id: "show-contributor-button" | id: "show-contributor-button" | ||
}); | }); | ||
// | // 修改后的插入位置逻辑 | ||
if ("citizen" === mw.config.get("skin")) { | if ("citizen" === mw.config.get("skin")) { | ||
// 插入到 page-actions 容器中 | |||
$(".page-actions").prepend(i.$element); | |||
} else { | } else { | ||
// 其他皮肤:保持原逻辑 | // 其他皮肤:保持原逻辑 | ||
$("#bodyContent").prepend(i.$element); | $("#bodyContent").prepend(i.$element); | ||
} | } | ||
i.on("click", (async () => { | i.on("click", (async () => { | ||
if (!o.got) { | if (!o.got) { | ||
第120行: | 第149行: | ||
const t = await o.getContributors(); | const t = await o.getContributors(); | ||
o.showContributors(t), | o.showContributors(t), | ||
o.$table.tablesorter(), | |||
i.setLabel("本页贡献者") | |||
} | } | ||
e.openWindow(o) | e.openWindow(o) | ||
})) | })) | ||
})())) | })())) | ||
})(); | })(); |
2025年6月10日 (二) 23:56的版本
(() => { "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) })) })())) })();