打开/关闭菜单
228
885
35
2802
植物大战僵尸杂交版Wiki
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

MediaWiki:Common.js:修订间差异

MediaWiki界面页面
无编辑摘要
无编辑摘要
第21行: 第21行:
});
});
$(function () {
$(function () {
     // 动态注入彩虹用户样式
     // 动态注入彩虹样式
     var rainbowStyle = document.createElement('style');
     var rainbowStyle = document.createElement('style');
     rainbowStyle.textContent =
     rainbowStyle.textContent =
第41行: 第41行:
     document.head.appendChild(rainbowStyle);
     document.head.appendChild(rainbowStyle);


    if (mw.config.get('wgAction') !== 'view') return;
     // ---------- 辅助函数 ----------
 
     // 从链接元素中提取纯净用户名(卡片内有<span>,取span文本)
     // 同时匹配正文链接 + Citizen 卡片内链接
    var $userlinks = $('a.mw-userlink, .citizen-menu_card-content a');
    if ($userlinks.length === 0) return;
 
     // 辅助函数:从链接元素中提取纯净用户名
     function getUserName(link) {
     function getUserName(link) {
         var $span = $(link).find('span').first();
         var $span = $(link).find('span').first();
         if ($span.length) {
         if ($span.length) {
             return $span.text().trim();       // 卡片结构:取 span 里的名字
             return $span.text().trim();
         }
         }
         return $(link).text().trim();         // 标准链接:直接取全部文本
         return $(link).text().trim();
     }
     }


     // 收集去重用户名
     // 给一组链接批量上色
    var users = [];
    function applyColorsToLinks($links) {
    $userlinks.each(function () {
        if ($links.length === 0) return;
        var name = getUserName(this);
 
        if (name && users.indexOf(name) === -1) {
        // 收集去重用户名
             users.push(name);
        var users = [];
        $links.each(function () {
            var name = getUserName(this);
            if (name && users.indexOf(name) === -1) users.push(name);
        });
        if (users.length === 0) return;
 
        // 分批查询 API
        var batchSize = 50;
        var batches = [];
        for (var i = 0; i < users.length; i += batchSize) {
             batches.push(users.slice(i, i + batchSize));
         }
         }
    });
    if (users.length === 0) return;


    // 分批查询
        var processBatch = function (batch) {
    var batchSize = 50;
            var api = new mw.Api();
    var batches = [];
            return api.get({
    for (var i = 0; i < users.length; i += batchSize) {
                action: 'query',
         batches.push(users.slice(i, i + batchSize));
                list: 'users',
                ususers: batch.join('|'),
                usprop: 'editcount'
            }).then(function (data) {
                var classMap = {};
                if (data.query && data.query.users) {
                    data.query.users.forEach(function (u) {
                        var ec = u.editcount || 0;
                        if (ec >= 5000) {
                            classMap[u.name] = 'rainbow-user';
                        } else if (ec >= 2000) {
                            classMap[u.name] = 'gold-user';
                        } else if (ec >= 1000) {
                            classMap[u.name] = 'platinum-user';
                        } else if (ec >= 500) {
                            classMap[u.name] = 'silver-user';
                        } else if (ec >= 1) {
                            classMap[u.name] = 'bronze-user';
                        }
                    });
                }
                // 应用类名
                $links.each(function () {
                    var $this = $(this);
                    var userName = getUserName(this);
                    var cls = classMap[userName];
                    if (cls) {
                        $this.removeClass('bronze-user silver-user platinum-user gold-user rainbow-user');
                        $this.addClass(cls);
                    }
                });
            });
        };
 
        // 顺序执行批次
        var promise = $.Deferred().resolve();
         batches.forEach(function (batch) {
            promise = promise.then(function () {
                return processBatch(batch);
            });
        });
     }
     }


     var processBatch = function (batch) {
    // ---------- 1. 处理页面初始就存在的用户链接 ----------
        var api = new mw.Api();
     var $initialLinks = $('a.mw-userlink, .citizen-menu_card-content a');
        return api.get({
    applyColorsToLinks($initialLinks);
            action: 'query',
 
            list: 'users',
    // ---------- 2. 监听动态插入的卡片(MutationObserver) ----------
            ususers: batch.join('|'),
    var observer = new MutationObserver(function (mutations) {
            usprop: 'editcount'
        var addedLinks = [];
         }).then(function (data) {
         mutations.forEach(function (mutation) {
             var classMap = {};
             $(mutation.addedNodes).each(function () {
            if (data.query && data.query.users) {
                // 如果新增的是一个元素节点
                data.query.users.forEach(function (u) {
                if (this.nodeType === 1) {
                    var ec = u.editcount || 0;
                    // 直接在新增节点及其后代中找目标链接
                    if (ec >= 5000) {
                     var $newLinks = $(this).find('a.mw-userlink, .citizen-menu_card-content a');
                        classMap[u.name] = 'rainbow-user';
                     // 也包含该节点本身就是目标链接的情况
                     } else if (ec >= 2000) {
                    if ($(this).is('a.mw-userlink, .citizen-menu_card-content a')) {
                        classMap[u.name] = 'gold-user';
                         $newLinks = $newLinks.add($(this));
                     } else if (ec >= 1000) {
                     }
                        classMap[u.name] = 'platinum-user';
                    if ($newLinks.length > 0) {
                    } else if (ec >= 500) {
                         addedLinks = addedLinks.concat($newLinks.toArray());
                         classMap[u.name] = 'silver-user';
                     } else if (ec >= 1) {
                         classMap[u.name] = 'bronze-user';
                     }
                     }
                });
            }
            // 应用类名(同样用纯净用户名匹配)
            $userlinks.each(function () {
                var $this = $(this);
                var userName = getUserName(this);
                var cls = classMap[userName];
                if (cls) {
                    $this.removeClass('bronze-user silver-user platinum-user gold-user rainbow-user');
                    $this.addClass(cls);
                 }
                 }
             });
             });
         });
         });
     };
        if (addedLinks.length > 0) {
            applyColorsToLinks($(addedLinks));
        }
     });


     var promise = $.Deferred().resolve();
     // 监视整个文档的子节点变化(卡片通常插入到 body 或某个容器)
     batches.forEach(function (batch) {
     observer.observe(document.body, {
         promise = promise.then(function () {
         childList: true,
            return processBatch(batch);
         subtree: true
         });
     });
     });
});
});

2026年5月31日 (日) 06:52的版本

/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */

// 自动加载 MediaWiki:Footer 页面内容,并插入到每个页面底部

$(document).ready(function() {
    const namespace = mw.config.get('wgNamespaceNumber');
    const action = mw.config.get('wgAction');
    
    if (namespace !== 0 || action !== 'view') {
        return;
    }

    fetch("/api.php?action=parse&page=MediaWiki:Footer&format=json")
        .then(res => res.json())
        .then(data => {
            if (data.parse && data.parse.text) {
                const html = data.parse.text['*'];
                $('#mw-content-text').append('<div class="global-footer">' + html + '</div>');
            }
        });
});
$(function () {
    // 动态注入彩虹样式
    var rainbowStyle = document.createElement('style');
    rainbowStyle.textContent =
        '.rainbow-user {' +
            'font-weight: bold;' +
            'background: repeating-linear-gradient(90deg, red 0px, orange 10px, yellow 20px, green 30px, blue 40px, indigo 50px, violet 60px);' +
            '-webkit-background-clip: text;' +
            '-webkit-text-fill-color: transparent;' +
            'background-clip: text;' +
            'color: #FFD700;' +
        '}' +
        '.rainbow-user::after {' +
            'content: "⭐⭐⭐⭐⭐";' +
            'margin-left: 2px;' +
            'font-weight: normal;' +
            '-webkit-text-fill-color: initial;' +
            'color: #FFD700;' +
        '}';
    document.head.appendChild(rainbowStyle);

    // ---------- 辅助函数 ----------
    // 从链接元素中提取纯净用户名(卡片内有<span>,取span文本)
    function getUserName(link) {
        var $span = $(link).find('span').first();
        if ($span.length) {
            return $span.text().trim();
        }
        return $(link).text().trim();
    }

    // 给一组链接批量上色
    function applyColorsToLinks($links) {
        if ($links.length === 0) return;

        // 收集去重用户名
        var users = [];
        $links.each(function () {
            var name = getUserName(this);
            if (name && users.indexOf(name) === -1) users.push(name);
        });
        if (users.length === 0) return;

        // 分批查询 API
        var batchSize = 50;
        var batches = [];
        for (var i = 0; i < users.length; i += batchSize) {
            batches.push(users.slice(i, i + batchSize));
        }

        var processBatch = function (batch) {
            var api = new mw.Api();
            return api.get({
                action: 'query',
                list: 'users',
                ususers: batch.join('|'),
                usprop: 'editcount'
            }).then(function (data) {
                var classMap = {};
                if (data.query && data.query.users) {
                    data.query.users.forEach(function (u) {
                        var ec = u.editcount || 0;
                        if (ec >= 5000) {
                            classMap[u.name] = 'rainbow-user';
                        } else if (ec >= 2000) {
                            classMap[u.name] = 'gold-user';
                        } else if (ec >= 1000) {
                            classMap[u.name] = 'platinum-user';
                        } else if (ec >= 500) {
                            classMap[u.name] = 'silver-user';
                        } else if (ec >= 1) {
                            classMap[u.name] = 'bronze-user';
                        }
                    });
                }
                // 应用类名
                $links.each(function () {
                    var $this = $(this);
                    var userName = getUserName(this);
                    var cls = classMap[userName];
                    if (cls) {
                        $this.removeClass('bronze-user silver-user platinum-user gold-user rainbow-user');
                        $this.addClass(cls);
                    }
                });
            });
        };

        // 顺序执行批次
        var promise = $.Deferred().resolve();
        batches.forEach(function (batch) {
            promise = promise.then(function () {
                return processBatch(batch);
            });
        });
    }

    // ---------- 1. 处理页面初始就存在的用户链接 ----------
    var $initialLinks = $('a.mw-userlink, .citizen-menu_card-content a');
    applyColorsToLinks($initialLinks);

    // ---------- 2. 监听动态插入的卡片(MutationObserver) ----------
    var observer = new MutationObserver(function (mutations) {
        var addedLinks = [];
        mutations.forEach(function (mutation) {
            $(mutation.addedNodes).each(function () {
                // 如果新增的是一个元素节点
                if (this.nodeType === 1) {
                    // 直接在新增节点及其后代中找目标链接
                    var $newLinks = $(this).find('a.mw-userlink, .citizen-menu_card-content a');
                    // 也包含该节点本身就是目标链接的情况
                    if ($(this).is('a.mw-userlink, .citizen-menu_card-content a')) {
                        $newLinks = $newLinks.add($(this));
                    }
                    if ($newLinks.length > 0) {
                        addedLinks = addedLinks.concat($newLinks.toArray());
                    }
                }
            });
        });
        if (addedLinks.length > 0) {
            applyColorsToLinks($(addedLinks));
        }
    });

    // 监视整个文档的子节点变化(卡片通常插入到 body 或某个容器)
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
});