Greasy Fork

Greasy Fork is available in English.

日期金额改色

点击按钮后刷新页面并启动日期高亮

当前为 2025-12-08 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

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