// ==UserScript== // @name 日期金额改色 // @namespace http://tampermonkey.net/ // @version 2.0 // @description 点击按钮后刷新页面并启动日期高亮 // @author ChenHongJiang // @match *://*/* // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/558352/%E6%97%A5%E6%9C%9F%E9%87%91%E9%A2%9D%E6%94%B9%E8%89%B2.user.js // @updateURL https://update.greasyfork.icu/scripts/558352/%E6%97%A5%E6%9C%9F%E9%87%91%E9%A2%9D%E6%94%B9%E8%89%B2.meta.js // ==/UserScript== (function () { "use strict"; /**************************************** * 1. 按钮 UI ****************************************/ const btn = document.createElement("div"); btn.textContent = ""; btn.style.position = "fixed"; btn.style.top = "0px"; btn.style.left = "7px"; btn.style.zIndex = 99999999; btn.style.backgroundColor = "rgba(0,0,0,0)"; btn.style.color = "white"; btn.style.border = "none"; btn.style.borderRadius = "0 0 10px 10px"; btn.style.cursor = "pointer"; btn.style.width = "25px"; btn.style.height = "20px"; // 定义背景色 const dateStyle = `#333F2A`; // 添加鼠标悬停事件 btn.addEventListener("mouseenter", () => { btn.style.background = dateStyle; // 鼠标悬停时显示黄色 }); // 添加鼠标离开事件 btn.addEventListener("mouseleave", () => { btn.style.background = "transparent"; // 鼠标离开时恢复透明背景 }); document.body.appendChild(btn); /**************************************** * 2. 点击按钮触发 ****************************************/ btn.addEventListener("click", () => { localStorage.setItem("highlight_date_flag", "1"); location.reload(); }); /**************************************** * 3. 执行真正的日期高亮逻辑(只在刷新后) ****************************************/ const shouldRun = localStorage.getItem("highlight_date_flag") === "1"; if (!shouldRun) return; localStorage.removeItem("highlight_date_flag"); // ⬇️ 以下是你的原始逻辑(保持不动,只封装到函数中) window.addEventListener("load", () => { runDateHighlight(); highlightMoney(); }); /******************************************** * 日期改色函数 ********************************************/ function runDateHighlight() { // 你的所有正则变量(原样保留) const kg = "(?: |\\s*)?"; const noNum = "(?!\\d)"; const hanNum = "(?:二|三|四|五|六|七|八|九|十)?(?:一|单|單|兩|两|二|三|四|两|五|六|七|八|九|十)"; const liangCi = "(?:亿万|万亿|千亿|百亿|十亿|千万|百万|十万|億萬|萬億|千億|百億|十億|千萬|百萬|十萬|萬|億|亿|万|千|百|十|\\+)?"; const qmcEN = "(?:in|to|for|into|of|by|since|at|on|with|from|about|through|over|under|between|among|across|toward|towards|against|beside|before|after|except|including|like|without|year|trends)"; const notEnd = "(?!公里|辆|次|个|台|件|机器人|倍|亿件)"; const datePatterns = [ noNum + '\\d{4}' + noNum + kg + '(?:-|.|/)' + kg + noNum + '\\d{2}' + noNum + kg + '(?:-|.|/)' + kg + noNum + '\\d{2}' + noNum, '\\b\\d{4}' + kg + '-' + kg + '\\d{2}' + kg + '-' + kg + '\\d{2}\\b', '(截(?:至|止))?\\d+' + kg + '(?:年|小时|时)' + kg + '\\d+' + kg + '(?:月|分钟|分)' + kg + '\\d+' + kg + '(?:日|秒钟|秒)', '\\d+' + kg + '年' + kg + '\\d+' + kg + '(?:月)?' + kg + '(?:-|~)' + kg + '\\d+月', '\\d+' + kg + '(?:年|月)' + kg + '\\d+' + kg + '(?:月|日)', '(?:(\\d+)|(?:上个|最新|春节|连续|今|去|前|明|本))' + kg + '(年)?(的)?(整个)?' + kg + '第?' + hanNum + '?个?(?:季度|多月|月份)', '\\b' + noNum + '\\d{1,2}' + noNum + kg + '-' + kg + noNum + '\\d{1,2}' + kg + '(?=\\s|$)', '(?:(截(?:至|止))|((?:前|今|明|去|后|同)年))?' + kg + '(?:(\\d+)|' + hanNum + ')' + kg + '(?:月份|月)' + kg + '(?:(\\d+)|' + hanNum + ')?' + kg + '(?:日|底|号|初|中|末)?', '(?:过去|最近|未来|半年|凌晨|那|这|上|下|第)?(的)?' + kg + noNum + '(?:\\d{1,4}|' + hanNum + ')(?:财年|年)?(?:-|~|、|—|to|至|到)(?:\\d{1,4}|' + hanNum + ')' + noNum + '(?:财年|年|个月|月)?' + notEnd, '(?:过去|最近|未来|半年|凌晨|那|这|上|下|第|到了|到|接下来|前面|后面)?(?:的|每)?' + kg + '(?:7(?:x|X|×))?(?:\\d{1,4}(.\\d+)?|' + hanNum + ')' + kg + liangCi + '(?:周年|财年|年底|小时|分钟|个月|月份|秒钟|毫秒|微秒|(?:世纪|世紀|年代)|月|天|周|年|秒|点)' + kg + '(?:之前|前|来|内|中期|初|中|末|多|之后|后)?(?:之内|内)?', '(?:\\b)?(?:昨天|今天)' + kg + '(?:\\d{1}' + noNum + '|\\d{2}' + noNum + ')' + kg + '(?:(:)|:)' + kg + '(?:\\d{1}' + noNum + '|\\d{2}' + noNum + ')', qmcEN + '?(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)' + kg + '[A-Za-z]' + kg + '\\d{1,2},' + kg + '\\d{4}' + kg + '(?=\\s|$)', qmcEN + '?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December|early)' + kg + '\\d{1,2}' + kg + ',' + kg + '\\d{4}', qmcEN + '?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December|early)' + kg + '\\d{1,2}', qmcEN + '?\\d{1,2}?' + kg + '(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December|early)' + kg + '\\d{4}', qmcEN + '?Q\\d+' + kg + '\\d{4}' + noNum, qmcEN + kg + '\\d{4}(?!.)' + noNum, qmcEN + '?q' + kg + '\\d+' + kg + qmcEN + kg + '\\d{4}' + noNum, qmcEN + '?\\d+' + kg + '(?:\\+)?' + kg + '((?:days|day|hours|hour|years|year|minutes|minute|minute|min|weeks|week|seconds|second) (?:ago|later)?)', ]; const dateFormatRegex = new RegExp(datePatterns.join("|"), "g"); const style = ` color: #5bae23 !important; text-shadow: none !important; `; const elements = document.querySelectorAll("*"); setTimeout(() => { elements.forEach((el) => { const nodes = getTextNodes(el); nodes.forEach((node) => { if (!dateFormatRegex.test(node.nodeValue)) return; const matches = node.nodeValue.match(dateFormatRegex); for (let i = matches.length - 1; i >= 0; i--) { const match = matches[i]; const idx = node.nodeValue.indexOf(match); const span = document.createElement("font"); span.style.cssText = style; span.textContent = match; const range = new Range(); range.setStart(node, idx); range.setEnd(node, idx + match.length); range.deleteContents(); range.insertNode(span); } }); }); }, 300); function getTextNodes(node) { let out = []; if (node.nodeType === Node.TEXT_NODE) return [node]; for (let c of node.childNodes) out.push(...getTextNodes(c)); return out; } } /******************************************** * 金额改色函数 ********************************************/ function highlightMoney() { const kg = "(?:\\s)?"; const hanNum = "(?:二|三|四|五|六|七|八|九|十)?(?:一|单|單|兩|两|二|三|四|两|五|六|七|八|九|十)?"; const notEnd = "(?!公里|辆|次|个|台|件|机器人|倍|亿件|人)"; const patterns = [ '(?:$|¥|USD|HK$|HK)?' + kg + '\\d+' + kg + '(.\\d+)?' + kg + '(?:-)?' + kg + '(?:\\d+)?' + kg + '(.\\d+)?' + hanNum + kg + '(?:亿万|万亿|千亿|百亿|十亿|亿|千万|百万|十万|块钱|千块|毛钱|分钱|万|千|百)(多)?' + kg + '(?:美|港|欧|日|韩|澳大利亚|加拿大|瑞士|新西兰|新加坡|瑞典|挪威|墨西哥|南非|俄罗斯|马来西亚|阿联酋|沙特|圆|元|币)?' + kg + '(?:块钱|千块|毛钱|分钱|人民币|英镑|法郎|克朗|比索|兰特|卢布|林吉特|迪拉姆|里亚尔|分钱|USD|圆|金|元|块|币|角)?' + notEnd, '(?:$|¥|USD|HK$|HK)?' + kg + '\\d+' + kg + '(.\\d+)?' + kg + '(?:-)?' + kg + '(?:\\d+)?' + kg + '(.\\d+)?' + hanNum + kg + '(?:億萬|萬億|千億|百億|十億|億|千萬|百萬|十萬|塊錢|千塊|毛錢|分錢|萬|千|百)(多)?' + kg + '(?:美|港|歐|日|韓|澳大利亞|加拿大|瑞士|新西蘭|新加坡|瑞典|挪威|墨西哥|南非|俄羅斯|馬來西亞|阿聯酋|沙特|圓|元|幣)?' + kg + '(?:塊錢|千塊|毛錢|分錢|人民幣|英鎊|法郎|克朗|比索|蘭特|盧佈|林吉特|迪拉姆|裡亞爾|分錢|USD|圓|金|元|塊|幣|角)?', '\\d+(.\\d+)?(?:块钱|千块|毛钱|分钱|人民币|英镑|美元|法郎|克朗|比索|兰特|卢布|林吉特|迪拉姆|里亚尔|分钱|USD|圆|元|币|角)', '(?:$|¥|USD|HK$|HK)?' + kg + '\\d+' + kg + '(?:.\\d+)?' + kg + '(?:-)?' + kg + '(?:\\d+)?' + kg + '(?:.\\d+)?' + kg + '(?:Trillion|Billion|Million)', '\\d+(.\\d+)?' + hanNum + kg + '(?:.\\d+)?' + kg + '(?:-)?' + kg + '(?:\\d+)?' + kg + '(?:.\\d+)?' + kg + '(?:亿万|万亿|千亿|百亿|十亿|千万|百万|十万|亿|万|千|百|十)' + notEnd, '\\d+(.\\d+)?' + hanNum + kg + '(?:.\\d+)?' + kg + '(?:-)?' + kg + '(?:\\d+)?' + kg + '(?:.\\d+)?' + kg + '(?:億萬|萬億|千億|百億|十億|千萬|百萬|十萬|億|萬|千|百|十)', '(?:免费)' ]; const reg = new RegExp(patterns.join("|"), "gi"); const style = `color:#F18A00!important;`; const elements = document.querySelectorAll("*"); setTimeout(() => { elements.forEach((el) => { const textNodes = getTextNodes(el); textNodes.forEach((node) => { if (reg.test(node.nodeValue)) { const matches = node.nodeValue.match(reg); for (let i = matches.length - 1; i >= 0; i--) { const m = matches[i]; const idx = node.nodeValue.indexOf(m); const span = document.createElement("font"); span.style.cssText = style; span.textContent = m; const r = new Range(); r.setStart(node, idx); r.setEnd(node, idx + m.length); r.deleteContents(); r.insertNode(span); } } }); }); }, 300); function getTextNodes(node) { let out = []; if (node.nodeType === Node.TEXT_NODE) return [node]; for (let c of node.childNodes) out.push(...getTextNodes(c)); return out; } } })();