打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

MediaWiki:Gadget-ShowContributors.js:修订间差异

MediaWiki界面页面
OctoberSama
OctoberSama留言 | 贡献 (dicksuck写坏了)
第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}" +
                float: right;
            "#show-contributor-headline{font-size:1.3em}" +
                margin-left: .5em;
            "#show-contributor-close{border-radius:50%;cursor:pointer;position:absolute;right:5px;top:5px}" +
                 margin-right: 0
            "#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
             }
             }
             #show-contributor-header {
             getContributors = async () => {
                 background: #fff;
                 const t = new mw.Api,
                 border-bottom: 1px solid #aaa;
                    e = {};
                 font-weight: 600;
                 let o = "",
                 padding: .3em;
                    i = 0;
                position: sticky;
                 const r = {
                text-align: center;
                    action: "query",
                top: 0
                    format: "json",
            }
                    prop: "revisions",
            #show-contributor-headline {
                    titles: mw.config.get("wgPageName"),
                 font-size: 1.3em
                    rvprop: "user|size",
             }
                    rvlimit: "max",
             #show-contributor-close {
                    rvdir: "newer"
                 border-radius: 50%;
                };
                 cursor: pointer;
                 do {
                 position: absolute;
                    o && (r.rvcontinue = o);
                 right: 5px;
                    try {
                 top: 5px
                        const n = await t.get(r);
            }
                        o = n.continue?.rvcontinue;
            #show-contributor-close:hover {
                        for (const {
                background-color: #eee
                            user: t,
            }
                            size: o
            #show-contributor-table {
                        } of Object.values(n.query.pages)[0].revisions)
                margin: 0;
                            e[t] ||= [],
                 width: 100%
                                e[t].push(o - i),
             }
                                i = o
             #show-contributor-table .user-avatar {
                    } catch (t) {
                 border-radius: 50%;
                        mw.notify(`获取编辑记录失败:${t}`, {
                 height: 20px;
                            type: "error"
                width: 20px
                        })
            }
                    }
            /* Citizen 皮肤响应式样式 */
                } while (o);
            .skin-citizen #show-contributor-button {
                 return e
                margin: 0 0 0 0.5em;
             };
                display: inline-flex;
             addRow = (t, {
                 align-items: center;
                 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
             }
             }
            /* 移动端样式 */
            @media (max-width: 1119px) {
                .skin-citizen .citizen-page-heading {
                    position: relative;
                }
                .skin-citizen #show-contributor-button {
                    position: absolute;
                    right: 0;
                    top: 50%;
                    transform: translateY(-50%);
                    margin: 0;
                }
            }
            /* 桌面端样式 */
            @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;
                    position: relative;
                }
                .skin-citizen .page-actions {
                    display: flex;
                    align-items: center;
                    gap: 0.5em;
                }
            }
        `);
        await mw.loader.using(["mediawiki.api","mediawiki.notification","oojs-ui","oojs-ui.styles.icons-interactions","jquery.tablesorter"]);
        class t extends OO.ui.Dialog {
            // ...保持原有对话框类定义不变...
         }
         }
 
         const e = new OO.ui.WindowManager({
         const e = new OO.ui.WindowManager({id:"show-contributor"});
            id: "show-contributor"
        });
         $(document.body).append(e.$element);
         $(document.body).append(e.$element);
         const o = new t({size:"large"});
         const o = new t({
            size: "large"
        });
         e.addWindows([o]);
         e.addWindows([o]);
         const i = new OO.ui.ButtonWidget({
         const i = new OO.ui.ButtonWidget({
             label:"本页贡献者",
             label: "本页贡献者",
             icon:"search",
             icon: "search",
             flags:"progressive",
             flags: "progressive",
             id:"show-contributor-button"
             id: "show-contributor-button"
         });
         });
 
       
         // 响应式插入逻辑
         // 修改后的插入位置逻辑
         if ("citizen" === mw.config.get("skin")) {
         if ("citizen" === mw.config.get("skin")) {
             const handleResize = () => {
             // 插入到 page-actions 容器中
                $("#show-contributor-button").detach();
            $(".page-actions").prepend(i.$element);
                if (window.matchMedia("(min-width: 1120px)").matches) {
                    // 桌面端:插入到.page-actions
                    $(".page-actions").prepend(i.$element);
                } else {
                    // 移动端:插入到.citizen-page-heading并右浮动
                    $(".citizen-page-heading").append(i.$element);
                }
            };
 
            // 初始执行
            handleResize();
           
            // 监听窗口变化
            $(window).on("resize", handleResize);
         } else {
         } else {
             // 其他皮肤:保持原逻辑
             // 其他皮肤:保持原逻辑
             $("#bodyContent").prepend(i.$element);
             $("#bodyContent").prepend(i.$element);
         }
         }
 
       
         i.on("click", async () => {
         i.on("click", (async () => {
             if (!o.got) {
             if (!o.got) {
                 i.setLabel("正在查询");
                 i.setLabel("正在查询");
                 const t = await o.getContributors();
                 const t = await o.getContributors();
                 o.showContributors(t),
                 o.showContributors(t),
                o.$table.tablesorter(),
                    o.$table.tablesorter(),
                i.setLabel("本页贡献者")
                    i.setLabel("本页贡献者")
             }
             }
             e.openWindow(o);
             e.openWindow(o)
         });
         }))
     })()))
     })()))
})();
})();

2025年6月11日 (三) 00:28的版本

(() => {
    "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)
        }))
    })()))
})();