日期改色

日期绿色

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         日期改色
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  日期绿色
// @author       ChenHongJiang
// @match        *://*/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // '',// 👉
    // 定义日期格式的正则表达式

    // 空格                         ' +kg+ '
    const kg = '(?: |\\s*)?';
    // 前后非数字                   ' +noNum+ '
    const noNum = '(?!\\d)';
    // 汉字数字                     ' +hanNum+ '
    const hanNum = '(?:十|二十|三十|四十|五十|六十|七十|八十|九十)?(?:一|单|單|兩|两|二|三|四|两|五|六|七|八|九|十)';
    // 量词                         ' +liangCi+ '
    const liangCi = '(?:亿万|万亿|千亿|百亿|十亿|千万|百万|十万|億萬|萬億|千億|百億|十億|千萬|百萬|十萬|萬|億|亿|万|千|百|十|\\+)?';
    // 前面词 2000                  ' +qmcEN+ '
    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 datePatterns = [


        noNum+ '\\d{4}' +noNum +kg+ '(?:-|.)' +kg+ noNum+ '\\d{2}' +noNum +kg+ '(?:-|.)' +kg+ noNum+ '\\d{2}' +noNum, // 👉 0000-00-00
        '\\b\\d{4}' +kg+ '-' +kg+ '\\d{2}' +kg+ '-' +kg+ '\\d{2}\\b', // 👉 0000-00-00
        '(截(?:至|止))?\\d+' +kg+ '年' +kg+ '\\d+' +kg+ '月' +kg+ '\\d+' +kg+ '日', // 👉 0000年00月00日
        '\\d+' +kg+ '年' +kg+ '\\d+' +kg+ '(?:月)?' +kg+ '(?:-|~)' +kg+ '\\d+月', // 👉 0000年00-00月
        '\\d+' +kg+ '(?:年|月)' +kg+ '\\d+' +kg+ '(?:月|日)', // 👉 0000年00月
        '(?:(\\d+)|(?:上个|最新|春节|今|去|前|明|本))' +kg+ '年?' +kg+ '第?' +hanNum+ '?个?(?:季度|多月|月份)', // 👉 0000年一季度
        '\\b' +noNum+ '\\d{1,2}' +noNum +kg+ '-' +kg+ noNum+ '\\d{1,2}' +kg+ '(?=\\s|$)', // 👉 00-00
        '(?:(截(?:至|止))|(?:前年|今年|明年))?' +kg+ '(?:(\\d{1,12})|' +hanNum+ ')' +kg+ '月'+kg+ '(?:(\\d{1,12})|' +hanNum+ ')?' +kg+ '(?:日|底|号)?', // 今年0月0日

        noNum+ '(?:\\d{2}|\\d{4})' +kg+ '(?:财年|年)?' +kg+ '(?:-|~|、|—|to|至|到)' +kg+ '(?:\\d{2}|\\d{4})' +noNum +kg+ '(?:财年|年|个月|月)?', //👉 0000年 - 0000年

        '\\d+' +kg+ '(?:财年|年)?' +kg+ '((?:Q|H)\\d+)', // 👉 0000年Q1
        '(?:过去|最近|未来|那|这|上|下)?' +kg+ '(?:7(?:x|X|×))?(?:\\d{1,4}|' +hanNum+ ')' +kg+ liangCi+ '(?:周年|财年|年底|小时|分钟|个月|月份|(?:世纪|年代)|月|天|分|周|年|秒|点)' +kg+ '(?:之前|前|来|(?:中期|初|中|末))?', // 👉 0000 年

        '(?:\\b)?(?:昨天|今天)' +kg+ '(?:\\d{1}' +noNum+ '|\\d{2}' +noNum+ ')' +kg+ '(?:(:)|:)' +kg+ '(?:\\d{1}' +noNum+ '|\\d{2}' +noNum+ ')', // 👉 昨/今天 00:00

        '(?:\\b)?(?:\\d+)?(?:(?:前|昨|今|大后|后)天|(?:上|下)?半年|最近|近' +hanNum+ '年(半)?|(?:中上|中下|上|下|本|下|上)(?:季度|财年|午)|(?:近|长|中)期|短期内|(?:当|次)(?:季|月|年|日)|(?:年|季|月|旬)(?:初|中|末)|(?:近|长)期趋势|(?:短|长|中)期(?:波动|增长|调整|稳定)|(?:季节|周期)性|(?:年|季|月|周|日)度)|' +hanNum+ '岁',// 👉 前天,补漏单独词

        '(?: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|$)', // 👉 Wed April 30, 2025
        '(?: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}',// 👉 May 05, 2025
        '\\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}',// 👉 26 February 2024
        'Q\\d+' +kg+ '\\d{4}' +noNum,// 👉 Q4 2023
        qmcEN +kg+ '\\d{4}(?!.)' +noNum,// 👉 in 2024
        'q' +kg+ '\\d+' +kg+ qmcEN +kg+ '\\d{4}' +noNum,// 👉 Q4 of 2023
        '\\d+' +kg+ '(?:\\+)?' +kg+  '(?:min|minute)', // 10 min

    ];
    const dateFormatRegex = new RegExp(datePatterns.join('|'), 'gi');


    //    亮绿:#6bd167✔ 	暗绿:#338143    英伟达绿:#76B900    鼠标绿:#BFFF00    微信绿:#52CE42✔    沉浸式翻译绿:#67CC51✔    鹦鹉绿:#5bae23✔
    //    #41b349    #43b244    #41ae3c
    // 定义要应用的样式
    const style = `
        color: #5bae23 !important;
        font-weight: 600 !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);

                    // 创建一个新 <font> 元素
                    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);
                }
            }
        });
    });

   }, 1000); // 延迟 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;
    }



})();