// ==UserScript== // @name 金钱改色 // @namespace http://tampermonkey.net/ // @version 1.0 // @description Detect and highlight date formats xxxx-xx-xx and xxxx年xx月xx日 // @author Chen // @match *://*/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // '',// 👉 // 定义日期格式的正则表达式 // 狗皮膏药空格 :(?:\\s)? ' +kg+ ' const kg = '(?:\\s)?'; const datePatterns = [ '\\d+' +kg+ '(?:.\\d+)?' +kg+ '(?:-)?' +kg+ '(?:\\d+)?' +kg+ '(?:.\\d+)?' +kg+ '(?:万亿|千亿|百亿|十亿|亿|千万|百万|十万|万|千|百)?' + kg + '(?:美|港|欧|日|韩|澳大利亚|加拿大|瑞士|新西兰|新加坡|瑞典|挪威|墨西哥|南非|俄罗斯|马来西亚|阿联酋|沙特)?' + kg + '(?:元|人民币|英镑|法郎|币|克朗|比索|兰特|卢布|林吉特|迪拉姆|里亚尔)', // 👉 1.1亿美元 '(?:$|¥|USD|HK$|HK)' +kg+ '\\d+' +kg+ '(?:.\\d+)?' +kg+ '(?:-)?' +kg+ '(?:\\d+)?' +kg+ '(?:.\\d+)?' +kg+ '(?:Trillion|Billion|Million)',// 👉 $1.1 Trillion ]; const dateFormatRegex = new RegExp(datePatterns.join('|'), 'gi'); // 天气黄色:#FDD56F // 定义要应用的样式 const style = ` color: #F18A00 !important; font-weight: 600 !important; font-size: 14.5px !important; font-family: "Microsoft YaHei" !important; text-shadow: none !important; `; // 遍历页面中所有的元素 const elements = document.querySelectorAll('*'); setTimeout(() => { elements.forEach(element => { // 获取元素的所有文本节点 const textNodes = getTextNodes(element); // 遍历每个文本节点 textNodes.forEach(textNode => { // 检查文本内容是否包含日期格式 if (dateFormatRegex.test(textNode.nodeValue)) { // 匹配所有日期格式 const matches = textNode.nodeValue.match(dateFormatRegex); // 从后向前处理每个匹配项 for (let i = matches.length - 1; i >= 0; i--) { const match = matches[i]; const index = textNode.nodeValue.indexOf(match); // 创建一个新 元素 const span = document.createElement('font'); span.style.cssText = style; span.textContent = match; // 使用 Range 来分割文本节点 const range = new Range(); range.setStart(textNode, index); range.setEnd(textNode, index + match.length); // 替换匹配的文本节点部分 range.deleteContents(); range.insertNode(span); } } }); }); }, 800); // 延迟 0.5 秒 // 获取元素的所有文本节点 function getTextNodes(node) { const textNodes = []; if (node.nodeType === Node.TEXT_NODE) { textNodes.push(node); } else if (node.nodeType === Node.ELEMENT_NODE) { for (let child of node.childNodes) { textNodes.push(...getTextNodes(child)); } } return textNodes; } })();