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

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

MediaWiki界面页面
(未显示同一用户的8个中间版本)
第1行: 第1行:
// 原作者萌娘百科BearBin
//遵循BSD 3-Clause License使用代码
//全文请参见上方文档
//GitHub仓库地址:https://github.com/BearBin1215/MoegirlPedia
(function() {
(function() {
     "use strict";
     "use strict";
     jQuery(document).ready(function() {
     $(function() {
         console.log('ShowContributors.js 开始执行', {
         (function() {
             mediaWikiVersion: mw.config.get('wgVersion'),
             if (
            skin: mw.config.get('skin'),
                ![0, 2, 4, 10, 12, 14, 828, 274].includes(mw.config.get("wgNamespaceNumber")) ||
            namespace: mw.config.get('wgNamespaceNumber'),
                0 === mw.config.get("wgArticleId") ||
            action: mw.config.get('wgAction'),
                !["view", "history"].includes(mw.config.get("wgAction"))
             articleId: mw.config.get('wgArticleId')
             )
        });
                return;


        if (
             mw.loader.using([
             ![0, 2, 4, 10, 12, 14, 828, 274].includes(mw.config.get("wgNamespaceNumber")) ||
                "mediawiki.api",
            0 === mw.config.get("wgArticleId") ||
                "mediawiki.notification",
            !["view", "history"].includes(mw.config.get("wgAction"))
                "oojs-ui",
        ) {
                "oojs-ui.styles.icons-interactions",
            console.log('脚本因条件不满足退出');
                "jquery.tablesorter"
            return;
            ]).then(function() {
        }
                function ShowContributorDialog(config) {
                    OO.ui.Dialog.call(this, config);
                    this.$table = $('<table id="show-contributor-table" class="wikitable" />');
                    this.$tbody = $("<tbody />");
                    this.got = false;
                }
                OO.inheritClass(ShowContributorDialog, OO.ui.Dialog);
                ShowContributorDialog.static = ShowContributorDialog.static || {};
                ShowContributorDialog.static.name = "ShowContributor";
                ShowContributorDialog.static.tagName = "div";


        mw.loader.addStyleTag(
                ShowContributorDialog.prototype.initialize = function() {
            '#show-contributor-button {' +
                    OO.ui.Dialog.prototype.initialize.call(this);
                'float: right;' +
                    this.$body.append(
                'margin-left: .5em;' +
                        $('<div id="show-contributor-header" />').append(
                'margin-right: 0;' +
                            $('<div id="show-contributor-headline">本页贡献统计</div>'),
            '}' +
                            new OO.ui.IconWidget({icon:"close",id:"show-contributor-close"}).$element.on("click", function() {
            '#show-contributor-header {' +
                                this.close();
                'background: #fff;' +
                            }.bind(this))
                'border-bottom: 1px solid #aaa;' +
                        ),
                'font-weight: 600;' +
                        this.$table.append(
                'padding: .3em;' +
                            $("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"),
                'position: sticky;' +
                            this.$tbody
                'text-align: center;' +
                        )
                'top: 0;' +
                     );
            '}' +
                     return this;
            '#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;' +
                 '}' +
            '}'
        );


        mw.loader.using([
                ShowContributorDialog.prototype.getContributors = function() {
            "mediawiki.api",
                    var self = this;
            "mediawiki.notification",
                    return new Promise(function(resolve, reject) {
            "oojs-ui",
                        var api = new mw.Api();
            "oojs-ui.styles.icons-interactions",
                        var contributors = {};
            "jquery.tablesorter"
                        var continueToken = "";
        ]).then(function() {
                        var prevSize = 0;
            console.log('依赖模块加载成功');
                        var params = {
                            action: "query",
                            format: "json",
                            prop: "revisions",
                            titles: mw.config.get("wgPageName"),
                            rvprop: "user|size",
                            rvlimit: "max",
                            rvdir: "newer"
                        };
                        function fetchRevisions() {
                            if (continueToken) params.rvcontinue = continueToken;
                            api.get(params).then(function(response) {
                                continueToken = response.continue ? response.continue.rvcontinue : undefined;
                                var revisions = Object.values(response.query.pages)[0].revisions;
                                for (var i = 0; i < revisions.length; i++) {
                                    var user = revisions[i].user;
                                    var size = revisions[i].size;
                                    contributors[user] = contributors[user] || [];
                                    contributors[user].push(size - prevSize);
                                    prevSize = size;
                                }
                                if (continueToken) {
                                    fetchRevisions();
                                } else {
                                    resolve(contributors);
                                }
                            }).catch(function(error) {
                                mw.notify('获取编辑记录失败:' + error, { type: "error" });
                                reject(error);
                            });
                        }
                        fetchRevisions();
                    });
                };


            function ShowContributorDialog(config) {
                ShowContributorDialog.prototype.addRow = function(tbody, data) {
                OO.ui.Dialog.call(this, config);
                    var user = data.user;
                this.$table = jQuery('<table id="show-contributor-table" class="wikitable" />');
                    var count = data.count;
                this.$tbody = jQuery("<tbody />");
                    var add = data.add;
                this.got = false;
                    var remove = data.remove;
            }
                    tbody.append(
            OO.inheritClass(ShowContributorDialog, OO.ui.Dialog);
                        $("<tr />").append(
            ShowContributorDialog.static.name = "ShowContributor";
                            $("<td />").append(
            ShowContributorDialog.static.tagName = "div";
                                $(`<a href="${mw.config.get("wgArticlePath").replace("$1", `User:${user}`)}" />`).text(user)
 
                            ),
            ShowContributorDialog.prototype.initialize = function() {
                            `<td>${count}</td>`,
                OO.ui.Dialog.prototype.initialize.call(this);
                            `<td>${add}</td>`,
                this.$body.append(
                            `<td>${remove}</td>`
                    jQuery('<div id="show-contributor-header" />').append(
                         )
                        jQuery('<div id="show-contributor-headline">本页贡献统计</div>'),
                     );
                        new OO.ui.IconWidget({ icon: "close", id: "show-contributor-close" }).$element.on("click", function() {
                 };
                            this.close();
                        }.bind(this))
                    ),
                    this.$table.append(
                        jQuery("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"),
                         this.$tbody
                     )
                );
                 return this;
            };


            ShowContributorDialog.prototype.getContributors = async function() {
                ShowContributorDialog.prototype.showContributors = function(contributors) {
                console.log('开始获取贡献者数据');
                    this.$tbody.empty();
                var api = new mw.Api();
                    for (var user in contributors) {
                var contributors = {};
                        if (contributors.hasOwnProperty(user)) {
                var continueToken = "";
                            var edits = contributors[user];
                var prevSize = 0;
                            var add = edits.reduce(function(sum, delta) {
                var params = {
                                return delta > 0 ? sum + delta : sum;
                    action: "query",
                            }, 0);
                    format: "json",
                            var remove = edits.reduce(function(sum, delta) {
                    prop: "revisions",
                                return delta < 0 ? sum + delta : sum;
                    titles: mw.config.get("wgPageName"),
                            }, 0);
                    rvprop: "user|size",
                            this.addRow(this.$tbody, {
                    rvlimit: "max",
                                user: user,
                    rvdir: "newer"
                                count: edits.length,
                };
                                add: add,
                do {
                                remove: remove
                    if (continueToken) params.rvcontinue = continueToken;
                             });
                    try {
                        var response = await api.get(params);
                        continueToken = response.continue ? response.continue.rvcontinue : undefined;
                        var revisions = Object.values(response.query.pages)[0].revisions;
                        for (var i = 0; i < revisions.length; i++) {
                            var user = revisions[i].user;
                            var size = revisions[i].size;
                            contributors[user] = contributors[user] || [];
                             contributors[user].push(size - prevSize);
                            prevSize = size;
                         }
                         }
                    } catch (error) {
                        console.error('API 请求失败:', error);
                        mw.notify('获取编辑记录失败:' + error, { type: "error" });
                     }
                     }
                } while (continueToken);
                     this.got = true;
                console.log('贡献者数据:', contributors);
                };
                return contributors;
            };
 
            ShowContributorDialog.prototype.addRow = function(tbody, data) {
                var user = data.user;
                var count = data.count;
                var add = data.add;
                var remove = data.remove;
                tbody.append(
                    jQuery("<tr />").append(
                        jQuery("<td />").append(
                            jQuery('<a href="' + mw.config.get("wgArticlePath").replace("$1", "User:" + user) + '" />').text(user)
                        ),
                        jQuery('<td>' + count + '</td>'),
                        jQuery('<td>' + add + '</td>'),
                        jQuery('<td>' + remove + '</td>')
                    )
                );
            };
 
            ShowContributorDialog.prototype.showContributors = function(contributors) {
                this.$tbody.empty();
                for (var user in contributors) {
                    if (contributors.hasOwnProperty(user)) {
                        var edits = contributors[user];
                        var add = edits.reduce(function(sum, delta) {
                            return delta > 0 ? sum + delta : sum;
                        }, 0);
                        var remove = edits.reduce(function(sum, delta) {
                            return delta < 0 ? sum + delta : sum;
                        }, 0);
                        this.addRow(this.$tbody, {
                            user: user,
                            count: edits.length,
                            add: add,
                            remove: remove
                        });
                     }
                }
                this.got = true;
            };


            var windowManager = new OO.ui.WindowManager({ id: "show-contributor" });
                var windowManager = new OO.ui.WindowManager({id:"show-contributor"});
            jQuery(document.body).append(windowManager.$element);
                $(document.body).append(windowManager.$element);
            var dialog = new ShowContributorDialog({ size: "large" });
                var dialog = new ShowContributorDialog({size:"large"});
            windowManager.addWindows([dialog]);
                windowManager.addWindows([dialog]);


            var button = new OO.ui.ButtonWidget({
                var button = new OO.ui.ButtonWidget({
                label: "本页贡献者",
                    label:"本页贡献者",
                icon: "search",
                    icon:"search",
                flags: "progressive",
                    flags:"progressive",
                id: "show-contributor-button"
                    id:"show-contributor-button"
            });
                });


            function insertButton() {
                var insertButton = function() {
                jQuery("#show-contributor-button").detach();
                    $("#show-contributor-button").detach();
                var skin = mw.config.get("skin");
                    var skin = mw.config.get("skin");
                console.log('插入按钮,当前皮肤:', skin);
                    if (skin === "citizen") {
                if (skin === "citizen") {
                        if (window.innerWidth >= 1120) {
                    if (window.innerWidth >= 1120) {
                             $(".page-actions").prepend(button.$element);
                        if (jQuery(".page-actions").length) {
                             jQuery(".page-actions").prepend(button.$element);
                         } else {
                         } else {
                             console.error('未找到 .page-actions 容器');
                             $(".firstHeading-container").append(button.$element);
                         }
                         }
                    } else if (skin === "vector-2022") {
                        $("header.mw-body-header.vector-page-titlebar").append(button.$element);
                     } else {
                     } else {
                         if (jQuery(".firstHeading-container").length) {
                         $("#bodyContent").prepend(button.$element);
                            jQuery(".firstHeading-container").append(button.$element);
                        } else {
                            console.error('未找到 .firstHeading-container 容器');
                        }
                     }
                     }
                 } else if (skin === "vector-2022") {
                 };
                    if (jQuery("header.mw-body-header.vector-page-titlebar").length) {
                        jQuery("header.mw-body-header.vector-page-titlebar").append(button.$element);
                    } else {
                        console.error('未找到 header.mw-body-header.vector-page-titlebar 容器');
                    }
                } else {
                    if (jQuery("#bodyContent").length) {
                        jQuery("#bodyContent").prepend(button.$element);
                    } else {
                        console.error('未找到 #bodyContent 容器');
                    }
                }
                console.log('按钮是否存在:', jQuery("#show-contributor-button").length);
            }


            insertButton();
                // 初始插入
                insertButton();


            var isWide = window.innerWidth >= 1120;
                // 仅在断点穿越时更新插入位置
            jQuery(window).on("resize", function() {
                var isWide = window.innerWidth >= 1120;
                clearTimeout(window.__showContributorResizeTimer);
                $(window).on("resize", function() {
                window.__showContributorResizeTimer = setTimeout(function() {
                    clearTimeout(window.__showContributorResizeTimer);
                    var nowWide = window.innerWidth >= 1120;
                    window.__showContributorResizeTimer = setTimeout(function() {
                    if (nowWide !== isWide && mw.config.get("skin") === "citizen") {
                        var nowWide = window.innerWidth >= 1120;
                        isWide = nowWide;
                        if (nowWide !== isWide) {
                        insertButton();
                            isWide = nowWide;
                    }
                            insertButton();
                }, 200);
                        }
            });
                    }, 200);
                });


            button.on("click", function() {
                // 点击事件
                console.log('按钮点击,尝试打开窗口');
                button.on("click", function() {
                if (!dialog.got) {
                    (function() {
                    button.setLabel("正在查询");
                        if (!dialog.got) {
                    dialog.getContributors().then(function(contributors) {
                            button.setLabel("正在查询");
                        dialog.showContributors(contributors);
                            dialog.getContributors().then(function(contributors) {
                        dialog.$table.tablesorter();
                                dialog.showContributors(contributors);
                        button.setLabel("本页贡献者");
                                dialog.$table.tablesorter();
                        windowManager.openWindow(dialog);
                                button.setLabel("本页贡献者");
                        console.log('窗口打开状态:', windowManager);
                                windowManager.openWindow(dialog);
                    }).catch(function(error) {
                            }).catch(function(error) {
                        console.error('打开窗口失败:', error);
                                console.error('获取贡献者数据失败:', error);
                    });
                                button.setLabel("本页贡献者");
                } else {
                            });
                    windowManager.openWindow(dialog);
                        } else {
                     console.log('窗口打开状态:', windowManager);
                            windowManager.openWindow(dialog);
                 }
                        }
                     })();
                 });
             });
             });
         }).catch(function(err) {
         })();
            console.error('模块加载失败:', err);
        });
     });
     });
})();
})();

2025年6月17日 (二) 19:06的版本

// 原作者萌娘百科BearBin
//遵循BSD 3-Clause License使用代码
//全文请参见上方文档
//GitHub仓库地址:https://github.com/BearBin1215/MoegirlPedia
(function() {
    "use strict";
    $(function() {
        (function() {
            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.using([
                "mediawiki.api",
                "mediawiki.notification",
                "oojs-ui",
                "oojs-ui.styles.icons-interactions",
                "jquery.tablesorter"
            ]).then(function() {
                function ShowContributorDialog(config) {
                    OO.ui.Dialog.call(this, config);
                    this.$table = $('<table id="show-contributor-table" class="wikitable" />');
                    this.$tbody = $("<tbody />");
                    this.got = false;
                }
                OO.inheritClass(ShowContributorDialog, OO.ui.Dialog);
                ShowContributorDialog.static = ShowContributorDialog.static || {};
                ShowContributorDialog.static.name = "ShowContributor";
                ShowContributorDialog.static.tagName = "div";

                ShowContributorDialog.prototype.initialize = function() {
                    OO.ui.Dialog.prototype.initialize.call(this);
                    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", function() {
                                this.close();
                            }.bind(this))
                        ),
                        this.$table.append(
                            $("<thead><th>用户</th><th>编辑数</th><th>增加字节数</th><th>删减字节数</th></thead>"),
                            this.$tbody
                        )
                    );
                    return this;
                };

                ShowContributorDialog.prototype.getContributors = function() {
                    var self = this;
                    return new Promise(function(resolve, reject) {
                        var api = new mw.Api();
                        var contributors = {};
                        var continueToken = "";
                        var prevSize = 0;
                        var params = {
                            action: "query",
                            format: "json",
                            prop: "revisions",
                            titles: mw.config.get("wgPageName"),
                            rvprop: "user|size",
                            rvlimit: "max",
                            rvdir: "newer"
                        };
                        function fetchRevisions() {
                            if (continueToken) params.rvcontinue = continueToken;
                            api.get(params).then(function(response) {
                                continueToken = response.continue ? response.continue.rvcontinue : undefined;
                                var revisions = Object.values(response.query.pages)[0].revisions;
                                for (var i = 0; i < revisions.length; i++) {
                                    var user = revisions[i].user;
                                    var size = revisions[i].size;
                                    contributors[user] = contributors[user] || [];
                                    contributors[user].push(size - prevSize);
                                    prevSize = size;
                                }
                                if (continueToken) {
                                    fetchRevisions();
                                } else {
                                    resolve(contributors);
                                }
                            }).catch(function(error) {
                                mw.notify('获取编辑记录失败:' + error, { type: "error" });
                                reject(error);
                            });
                        }
                        fetchRevisions();
                    });
                };

                ShowContributorDialog.prototype.addRow = function(tbody, data) {
                    var user = data.user;
                    var count = data.count;
                    var add = data.add;
                    var remove = data.remove;
                    tbody.append(
                        $("<tr />").append(
                            $("<td />").append(
                                $(`<a href="${mw.config.get("wgArticlePath").replace("$1", `User:${user}`)}" />`).text(user)
                            ),
                            `<td>${count}</td>`,
                            `<td>${add}</td>`,
                            `<td>${remove}</td>`
                        )
                    );
                };

                ShowContributorDialog.prototype.showContributors = function(contributors) {
                    this.$tbody.empty();
                    for (var user in contributors) {
                        if (contributors.hasOwnProperty(user)) {
                            var edits = contributors[user];
                            var add = edits.reduce(function(sum, delta) {
                                return delta > 0 ? sum + delta : sum;
                            }, 0);
                            var remove = edits.reduce(function(sum, delta) {
                                return delta < 0 ? sum + delta : sum;
                            }, 0);
                            this.addRow(this.$tbody, {
                                user: user,
                                count: edits.length,
                                add: add,
                                remove: remove
                            });
                        }
                    }
                    this.got = true;
                };

                var windowManager = new OO.ui.WindowManager({id:"show-contributor"});
                $(document.body).append(windowManager.$element);
                var dialog = new ShowContributorDialog({size:"large"});
                windowManager.addWindows([dialog]);

                var button = new OO.ui.ButtonWidget({
                    label:"本页贡献者",
                    icon:"search",
                    flags:"progressive",
                    id:"show-contributor-button"
                });

                var insertButton = function() {
                    $("#show-contributor-button").detach();
                    var skin = mw.config.get("skin");
                    if (skin === "citizen") {
                        if (window.innerWidth >= 1120) {
                            $(".page-actions").prepend(button.$element);
                        } else {
                            $(".firstHeading-container").append(button.$element);
                        }
                    } else if (skin === "vector-2022") {
                        $("header.mw-body-header.vector-page-titlebar").append(button.$element);
                    } else {
                        $("#bodyContent").prepend(button.$element);
                    }
                };

                // 初始插入
                insertButton();

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

                // 点击事件
                button.on("click", function() {
                    (function() {
                        if (!dialog.got) {
                            button.setLabel("正在查询");
                            dialog.getContributors().then(function(contributors) {
                                dialog.showContributors(contributors);
                                dialog.$table.tablesorter();
                                button.setLabel("本页贡献者");
                                windowManager.openWindow(dialog);
                            }).catch(function(error) {
                                console.error('获取贡献者数据失败:', error);
                                button.setLabel("本页贡献者");
                            });
                        } else {
                            windowManager.openWindow(dialog);
                        }
                    })();
                });
            });
        })();
    });
})();