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