Greasy Fork is available in English.
点击按钮后刷新页面并启动日期高亮
当前为
// ==UserScript==
// @name 日期金额改色
// @namespace http://tampermonkey.net/
// @version 2.0
// @description 点击按钮后刷新页面并启动日期高亮
// @author ChenHongJiang
// @match *://*/*
// @grant none
// @license MIT
// ==/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;
}
}
})();