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

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

MediaWiki界面页面
第1行: 第1行:
(function() {
(() => {
     "use strict";
     "use strict";
     $(function() {
     $((() => (async () => {
        (async function() {
        if (
            if (
            ![0, 2, 4, 10, 12, 14, 828, 274].includes(mw.config.get("wgNamespaceNumber")) ||
                ![0, 2, 4, 10, 12, 14, 828, 274].includes(mw.config.get("wgNamespaceNumber")) ||
            0 === mw.config.get("wgArticleId") ||
                0 === mw.config.get("wgArticleId") ||
            !["view", "history"].includes(mw.config.get("wgAction"))
                !["view", "history"].includes(mw.config.get("wgAction"))
        )
            )
            return;
                return;
       
           
        mw.loader.addStyleTag(`
            mw.loader.addStyleTag(`
            #show-contributor-button {
                #show-contributor-button {
                float: right;
                    float: right;
                margin-left: .5em;
                    margin-left: .5em;
                margin-right: 0;
                    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;
                 }
                 }
                 #show-contributor-header {
                 .skin-citizen .citizen-page-heading {
                    background: #fff;
                     flex-grow: 1;
                    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;
                 }
                 }
            }
            @media (max-width: 1119px) {
                 .skin-citizen #show-contributor-button {
                 .skin-citizen #show-contributor-button {
                    float: none;
                     margin: 0.5em 0;
                     margin: 0 0.5em 0 0;
                     display: block;
                     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([
        await mw.loader.using([
                "mediawiki.api",
            "mediawiki.api",
                "mediawiki.notification",
            "mediawiki.notification",
                "oojs-ui",
            "oojs-ui",
                "oojs-ui.styles.icons-interactions",
            "oojs-ui.styles.icons-interactions",
                "jquery.tablesorter"
            "jquery.tablesorter"
            ]);
        ]);


            class t extends OO.ui.Dialog {
        class t extends OO.ui.Dialog {
                $table = $('<table id="show-contributor-table" class="wikitable" />');
            $table = $('<table id="show-contributor-table" class="wikitable" />');
                $tbody = $("<tbody />");
            $tbody = $("<tbody />");
                $body;
            $body;
                got = !1;
            got = !1;
                static static = {...super.static,name:"ShowContributor",tagName:"div"};
            static static = {...super.static,name:"ShowContributor",tagName:"div"};
                initialize() {
            initialize() {
                    return super.initialize(),
                return super.initialize(),
                    this.$body.append(
                this.$body.append(
                        $('<div id="show-contributor-header" />').append(
                    $('<div id="show-contributor-header" />').append(
                            $('<div id="show-contributor-headline">本页贡献统计</div>'),
                        $('<div id="show-contributor-headline">本页贡献统计</div>'),
                            new OO.ui.IconWidget({icon:"close",id:"show-contributor-close"}).$element.on("click",(() => this.close()))
                        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
                     this.$table.append(
                 }
                        $("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"),
                getContributors = async () => {
                        this.$tbody
                    const t = new mw.Api,
                    )
                        e = {};
                 ),
                    let o = "",
                this
                        i = 0;
            }
                    const r = {
            getContributors = async () => {
                        action:"query",
                const t = new mw.Api,
                        format:"json",
                    e = {};
                        prop:"revisions",
                let o = "",
                        titles:mw.config.get("wgPageName"),
                    i = 0;
                        rvprop:"user|size",
                const r = {
                        rvlimit:"max",
                    action:"query",
                        rvdir:"newer"
                    format:"json",
                    };
                    prop:"revisions",
                    do {
                    titles:mw.config.get("wgPageName"),
                        o && (r.rvcontinue = o);
                    rvprop:"user|size",
                        try {
                    rvlimit:"max",
                            const n = await t.get(r);
                    rvdir:"newer"
                            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}) => {
                 do {
                    t.append(
                    o && (r.rvcontinue = o);
                        $("<tr />").append(
                    try {
                            $("<td />").append(
                        const n = await t.get(r);
                                $(`<a href="${mw.config.get("wgArticlePath").replace("$1",`User:${e}`)}" />`).text(e)
                        o = n.continue?.rvcontinue;
                            ),
                        for (const {user:t,size:o} of Object.values(n.query.pages)[0].revisions)
                            `<td>${o}</td>`,
                            e[t] ||= [],
                            `<td>${i}</td>`,
                            e[t].push(o - i),
                            `<td>${r}</td>`
                            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();
            showContributors = t => {
                    for (const e in t)
                this.$tbody.empty();
                        this.addRow(this.$tbody, {
                for (const e in t)
                            user:e,
                    this.addRow(this.$tbody, {
                            count:t[e].length,
                        user:e,
                            add:t[e].reduce((s,n)=>n>0?s+n:s,0),
                        count:t[e].length,
                            remove:t[e].reduce((s,n)=>n<0?s+n:s,0)
                        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
                    });
                }
                this.got = !0
             }
             }
        }


            const e = new OO.ui.WindowManager({id:"show-contributor"});
        const e = new OO.ui.WindowManager({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"
            });
        });


            const insertButton = () => {
        const insertButton = () => {
                $("#show-contributor-button").detach();
            $("#show-contributor-button").detach();
                const skin = mw.config.get("skin");
            const skin = mw.config.get("skin");
                if (skin === "citizen") {
            if (skin === "citizen") {
                    if (window.innerWidth >= 1120) {
                if (window.innerWidth >= 1120) {
                        $(".page-actions").prepend(i.$element);
                    $(".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 {
                 } else {
                     $("#bodyContent").prepend(i.$element);
                     $(".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();
        insertButton();


            // 仅在断点穿越时更新插入位置
        // 仅在断点穿越时更新插入位置
            let isWide = window.innerWidth >= 1120;
        let isWide = window.innerWidth >= 1120;
            $(window).on("resize", () => {
        $(window).on("resize", () => {
                clearTimeout(window.__showContributorResizeTimer);
            clearTimeout(window.__showContributorResizeTimer);
                window.__showContributorResizeTimer = setTimeout(() => {
            window.__showContributorResizeTimer = setTimeout(() => {
                    const nowWide = window.innerWidth >= 1120;
                const nowWide = window.innerWidth >= 1120;
                    if (nowWide !== isWide) {
                if (nowWide !== isWide) {
                        isWide = nowWide;
                    isWide = nowWide;
                        insertButton();
                    insertButton();
                    }
                }
                }, 200);
            }, 200);
            });
        });


            // 点击事件
        // 点击事件
            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月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);
        });
    })()))
})();