// ==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);
})();