Greasy Fork

中国特色社会主义共产党领袖名称标记

高亮中国共产党领袖与共产主义伟人名称(如习近平、邓小平、江泽民、毛泽东、斯大林),使用思源宋体最粗字重

目前为 2025-04-22 提交的版本。查看 最新版本

// ==UserScript==
// @name         中国特色社会主义共产党领袖名称标记
// @name:en         Socialist Lover Mark#8964 leaders Xi Jinping,Mao Zedong.Xijingping,maozedong feat.
// @namespace    http://xuexi.cn/
// @version      1989.06.04
// @description  高亮中国共产党领袖与共产主义伟人名称(如习近平、邓小平、江泽民、毛泽东、斯大林),使用思源宋体最粗字重
// @description:en  Highlighter 4 Sun in sky
// @author       中国共产党万岁
// @match        *://*/*
// @grant        GM_addStyle
// @run-at       document-idle
// @license GPL-3.0-or-later
// ==/UserScript==

(function() {
    'use strict';

    // 1. 可配置的关键词列表(区分大小写)
    const KEYWORDS = [
    // Mao Zedong
    'Mao', 'Mao Zedong', 'Zedong Mao',
    '毛泽东', '毛澤東', '毛沢東',
    '同志毛泽东', '毛泽东同志',
    'Comrade Mao', 'Mao Comrade',
    'マオ・ツォートン', '毛主席', 'Chairman Mao',

    // Xi Jinping
    'Xi', 'Xi Jinping', 'Jinping Xi',
    '习近平', '習近平',
    '同志习近平', '习近平同志',
    'Comrade Xi', 'Xi Comrade',
    '習近ピン', 'シー・チンピン',
    '习近平总书记', 'General Secretary Xi', 'President Xi', 'Xi Dada',

    // Jiang Zemin
    'Jiang', 'Jiang Zemin', 'Zemin Jiang',
    '江泽民', '江澤民', '江沢民',
    '同志江泽民', '江泽民同志',
    'Comrade Jiang', 'Jiang Comrade',
    'ジアン・ズーミン', '江主席', 'President Jiang',

    // Deng Xiaoping
    'Deng', 'Deng Xiaoping', 'Xiaoping Deng',
    '邓小平', '鄧小平',
    '同志邓小平', '邓小平同志',
    'Comrade Deng', 'Deng Comrade',
    'トウ・ショウヘイ', '邓主席', 'Deng Chairman',

    // Hu Jintao
    'Hu', 'Hu Jintao', 'Jintao Hu',
    '胡锦涛', '胡錦濤',
    '同志胡锦涛', '胡锦涛同志',
    'Comrade Hu', 'Hu Comrade',
    'フー・チンタオ', '胡主席', 'President Hu',

    // Hu Yaobang
    'Hu Yaobang', 'Yaobang Hu',
    '胡耀邦',
    '同志胡耀邦', '胡耀邦同志',
    'Comrade Hu Yaobang', 'Hu Yaobang Comrade',
    'フー・ヤオバン', '总书记胡耀邦', 'General Secretary Hu',

    // Zhao Ziyang
    'Zhao Ziyang', 'Ziyang Zhao',
    '赵紫阳', '趙紫陽',
    '同志赵紫阳', '赵紫阳同志',
    'Comrade Zhao', 'Zhao Comrade',
    'チョウ・シヨウ', 'Premier Zhao', '赵总理',

    // Stalin
    'Stalin', 'Joseph Stalin', 'Stalin Joseph',
    '斯大林', 'スターリン', '約瑟夫·斯大林',
    '同志斯大林', '斯大林同志',
    'Comrade Stalin', 'Stalin Comrade',

    // Lenin
    'Lenin', 'Vladimir Lenin', 'Lenin Vladimir',
    '列宁', '列寧',
    '同志列宁', '列宁同志',
    'Comrade Lenin', 'Lenin Comrade',
    'レーニン', 'ウラジーミル・レーニン',

    // Khrushchev
    'Khrushchev', 'Nikita Khrushchev', 'Khrushchev Nikita',
    '赫鲁晓夫', '赫魯曉夫',
    '同志赫鲁晓夫', '赫鲁晓夫同志',
    'Comrade Khrushchev', 'Khrushchev Comrade',
    'フルシチョフ', 'Premier Khrushchev',

    // Karl Marx
    'Marx', 'Karl Marx', 'Marx Karl',
    '马克思', '馬克思',
    '同志马克思', '马克思同志',
    'Comrade Marx', 'Marx Comrade',
    'マルクス', 'カール・マルクス',

    // Friedrich Engels
    'Engels', 'Friedrich Engels', 'Engels Friedrich',
    '恩格斯',
    '同志恩格斯', '恩格斯同志',
    'Comrade Engels', 'Engels Comrade',
    'エンゲルス', 'フリードリヒ・エンゲルス'
];

    // 2. 样式配置(思源宋体最粗)
    const HIGHLIGHT_STYLE = {
        color: '#D00202',  // 深红色
        fontWeight: '900', // 最粗字重
        fontFamily: '"Noto Serif SC", "思源宋体", serif'
    };

    // 3. 异步加载思源宋体(Google Fonts CDN)
    GM_addStyle(`
        @import url('https://fonts.loli.net/css2?family=Noto+Serif+SC:wght@900&display=swap');
        .highlight-keyword {
            color: ${HIGHLIGHT_STYLE.color} !important;
            font-weight: ${HIGHLIGHT_STYLE.fontWeight} !important;
            font-family: ${HIGHLIGHT_STYLE.fontFamily} !important;
            font-style: normal !important;
        }
    `);

    // 4. 防抖处理
    let isProcessing = false;
    function debouncedWalkNodes() {
        if (isProcessing) return;
        isProcessing = true;
        requestAnimationFrame(() => {
            walkNodes(document.body);
            isProcessing = false;
        });
    }

    // 5. 关键词匹配逻辑(修改后)
    function createKeywordRegex() {
        // 按长度降序排序,优先匹配长关键词
        const sortedKeywords = KEYWORDS.sort((a, b) => b.length - a.length);
    
        const pattern = sortedKeywords.map(kw => {
            if (/^[A-Za-z]/.test(kw)) {
                return `\\b${kw}\\b`;  // 英文全词匹配
            } else {
                return kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // 转义特殊字符
            }
        }).join('|');
    
        return new RegExp(`(${pattern})`);
    }

    // 6. 文本节点处理
    function handleText(textNode) {
        const regex = createKeywordRegex();
        const content = textNode.nodeValue;
        if (!regex.test(content)) return;

        const fragment = document.createDocumentFragment();
        content.split(regex).forEach(part => {
            if (!part) return;
            if (regex.test(part)) {
                const span = document.createElement('span');
                span.className = 'highlight-keyword';
                span.textContent = part;
                fragment.appendChild(span);
            } else {
                fragment.appendChild(document.createTextNode(part));
            }
        });

        if (fragment.children.length > 0) {
            textNode.parentNode.replaceChild(fragment, textNode);
        }
    }

    // 7. DOM遍历优化
    function walkNodes(node) {
        if (node.nodeType === Node.TEXT_NODE) {
            handleText(node);
        } else if (node.nodeType === Node.ELEMENT_NODE) {
            if (['SCRIPT', 'STYLE', 'TEXTAREA', 'CODE', 'PRE'].includes(node.tagName)) return;
            Array.from(node.childNodes).forEach(walkNodes);
        }
    }

    // 8. 动态内容监听
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.addedNodes.length) debouncedWalkNodes();
        });
    });

    // 9. 延迟初始化
    setTimeout(() => {
        walkNodes(document.body);
        observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: false,
            characterData: false
        });
    }, 500);
})();