Windows 11 国旗 Emoji 修复器

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

// ==UserScript==
// @name         Windows 11 国旗 Emoji 修复器
// @name:zh      Windows 11 国旗 Emoji 修复器
// @name:en      Windows 11 Flag Emoji Fixer
// @namespace    http://tampermonkey.net/
// @version      2.3
// @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/gh/mozilla/twemoji-colr@latest/assets/TwemojiMozilla-colr.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/gh/mozilla/twemoji-colr@latest/assets/TwemojiMozilla-colr.woff2') format('woff2'),
                 url('https://cdn.jsdelivr.net/gh/mozilla/twemoji-colr@latest/fonts/TwemojiMozilla.ttf') format('truetype');
            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);
    });

})();