Windows 11 国旗 Emoji 修复器

通过精确包裹旗帜 Emoji 的方式,修复 Windows 11 上的显示问题,不影响任何网站原有字体。

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Windows 11 国旗 Emoji 修复器
// @name:zh      Windows 11 国旗 Emoji 修复器
// @name:en      Windows 11 Flag Emoji Fixer
// @namespace    http://tampermonkey.net/
// @version      2.4
// @icon         data:image/webp;base64,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
// @description  通过精确包裹旗帜 Emoji 的方式,修复 Windows 11 上的显示问题,不影响任何网站原有字体。
// @description:zh 通过精确包裹旗帜 Emoji 的方式,修复 Windows 11 上的显示问题,不影响任何网站原有字体。
// @description:en Fixes Windows 11 flag emoji display issues by precisely wrapping flag characters, without affecting website fonts.
// @author       DeepSeek 3.2 & Gemini 2.5 pro
// @match        *://*/*
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 预加载字体
    const preloadLink = document.createElement('link');
    preloadLink.rel = 'preload';
    preloadLink.href = 'https://cdn.jsdelivr.net/npm/twemoji-colr-font@latest/twemoji.woff2';
    preloadLink.as = 'font';
    preloadLink.type = 'font/woff2';
    preloadLink.crossOrigin = 'anonymous';

    // 字体加载失败处理
    preloadLink.onerror = function() {
        console.warn('Windows 11 Flag Emoji Fixer: 字体加载失败,使用备用方案');
    };

    document.head.appendChild(preloadLink);

    // CSS保持精简
    const css = `
        @font-face {
            font-family: 'Windows11FlagFix';
            src: local('Twemoji Mozilla'),
                 local('TwemojiMozilla'),
                 url('https://cdn.jsdelivr.net/npm/twemoji-colr-font@latest/twemoji.woff2') format('woff2');
            unicode-range: U+1F1E6-1F1FF;
            font-display: swap;
        }

        .flag-emoji-fix-wrapper {
            font-family: 'Windows11FlagFix', 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif !important;
            /* 确保包裹元素不会破坏布局 */
            display: inline !important;
            font-size: inherit !important;
            font-weight: inherit !important;
            font-style: inherit !important;
            line-height: inherit !important;
            letter-spacing: inherit !important;
            word-spacing: inherit !important;
        }
    `;

    GM_addStyle(css);

    // --- 优化后的 JavaScript 逻辑 ---

    // 将测试用的正则提到外部,避免重复创建
    const flagTestRegex = /[\u{1F1E6}-\u{1F1FF}]{2}/u;

    function fixFlagEmojisInNode(contextNode) {
        // 用于匹配两个连续的区域指示符号的正则表达式
        const flagRegex = /([\u{1F1E6}-\u{1F1FF}]{2})/gu;

        // 创建 TreeWalker 来遍历文本节点
        const walker = document.createTreeWalker(
            contextNode || document.body,
            NodeFilter.SHOW_TEXT,
            {
                acceptNode: function(node) {
                    // 过滤掉不可见、脚本、样式或已处理的节点
                    if (!node.textContent ||
                        node.parentElement.offsetParent === null ||
                        ['SCRIPT', 'STYLE', 'TEXTAREA', 'NOSCRIPT'].includes(node.parentElement.tagName) ||
                        node.parentElement.isContentEditable ||
                        node.parentElement.closest('.flag-emoji-fix-wrapper')) {
                        return NodeFilter.FILTER_REJECT;
                    }

                    // 使用外部定义的正则表达式
                    return flagTestRegex.test(node.textContent) ?
                        NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
                }
            }
        );

        const nodesToProcess = [];
        let currentNode;
        while ((currentNode = walker.nextNode())) {
            nodesToProcess.push(currentNode);
        }

        nodesToProcess.forEach(node => {
            // 再次检查节点是否已被处理
            if (!node.parentNode || node.parentNode.closest('.flag-emoji-fix-wrapper')) {
                return;
            }

            const parent = node.parentNode;
            const fragment = document.createDocumentFragment();
            let lastIndex = 0;
            let match;

            // 重置正则表达式的状态
            flagRegex.lastIndex = 0;

            while ((match = flagRegex.exec(node.textContent)) !== null) {
                // 添加旗帜前的文本
                if (match.index > lastIndex) {
                    fragment.appendChild(document.createTextNode(node.textContent.slice(lastIndex, match.index)));
                }

                // 创建并添加包裹旗帜的 span
                const wrapper = document.createElement('span');
                wrapper.className = 'flag-emoji-fix-wrapper';
                wrapper.textContent = match[0];
                fragment.appendChild(wrapper);

                lastIndex = flagRegex.lastIndex;
            }

            // 仅当正则表达式至少匹配到一次时才执行替换
            if (lastIndex > 0) {
                // 如果文本末尾还有内容,则追加
                if (lastIndex < node.textContent.length) {
                    fragment.appendChild(document.createTextNode(node.textContent.slice(lastIndex)));
                }
                parent.replaceChild(fragment, node);
            }
        });
    }

    // 初始执行
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => fixFlagEmojisInNode(document.body));
    } else {
        fixFlagEmojisInNode(document.body);
    }

    // 使用防抖优化性能
    let fixTimeout;
    function debouncedFix(mutations) {
        clearTimeout(fixTimeout);
        fixTimeout = setTimeout(() => {
            // 使用 Set 存储待处理的根节点,自动去重
            const nodesToScan = new Set();

            for (const mutation of mutations) {
                if (mutation.type === 'childList') {
                    for (const addedNode of mutation.addedNodes) {
                        if (addedNode.nodeType === Node.ELEMENT_NODE) {
                            nodesToScan.add(addedNode);
                        } else if (addedNode.nodeType === Node.TEXT_NODE && addedNode.parentElement) {
                            nodesToScan.add(addedNode.parentElement);
                        }
                    }
                } else if (mutation.type === 'characterData') {
                    if (mutation.target && mutation.target.parentElement) {
                        nodesToScan.add(mutation.target.parentElement);
                    }
                }
            }

            // 遍历去重后的节点集合,执行修复
            for (const node of nodesToScan) {
                // 检查节点是否仍然在 DOM 中
                if (document.body.contains(node)) {
                   fixFlagEmojisInNode(node);
                }
            }
        }, 100);
    }

    // 监听动态内容变化 - 增加 characterData 监听
    const observer = new MutationObserver(debouncedFix);

    observer.observe(document.body, {
        childList: true,
        subtree: true,
        characterData: true
    });

    // 处理AJAX加载的内容
    const originalPushState = history.pushState;
    const originalReplaceState = history.replaceState;

    history.pushState = function() {
        originalPushState.apply(this, arguments);
        setTimeout(() => fixFlagEmojisInNode(document.body), 500);
    };

    history.replaceState = function() {
        originalReplaceState.apply(this, arguments);
        setTimeout(() => fixFlagEmojisInNode(document.body), 500);
    };

    // 监听hashchange事件
    window.addEventListener('hashchange', () => {
        setTimeout(() => fixFlagEmojisInNode(document.body), 500);
    });

})();