您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
通过颜色高亮的方式,帮助你快速判断一个 GitHub 仓库是否在更新。
当前为
- // ==UserScript==
- // @name GitHub Freshness
- // @namespace http://tampermonkey.net/
- // @version 0.0.1
- // @description 通过颜色高亮的方式,帮助你快速判断一个 GitHub 仓库是否在更新。
- // @author 向前 https://rational-stars.top/
- // @match https://github.com/*
- // @grant GM_registerMenuCommand
- // @grant GM_setValue
- // @grant GM_getValue
- // ==/UserScript==
- (function () {
- 'use strict';
- // === 配置项 ===
- let HIGHLIGHT_COLOR = GM_getValue('highlightColor', '#82de82'); // 小于指定时间范围的背景色
- let GREY_COLOR = GM_getValue('greyColor', '#e3d711'); // 大于指定时间范围的背景色
- let TIME_THRESHOLD_MONTHS = GM_getValue('timeThresholdMonths', 2); // 时间阈值(月)
- let isHighlighting = false; // 防止重复触发
- let currentURL = location.href;
- // === 创建设置面板 ===
- function createSettingsPanel() {
- const panel = document.createElement('div');
- panel.style.position = 'fixed';
- panel.style.top = '10px';
- panel.style.right = '10px';
- panel.style.padding = '10px';
- panel.style.backgroundColor = '#fff';
- panel.style.border = '1px solid #ccc';
- panel.style.zIndex = '9999';
- panel.style.display = 'none'; // 初始隐藏面板
- panel.innerHTML = `
- <h3>GitHub Freshness 设置</h3>
- <label for="highlightColor">背景色(小于指定时间范围):</label>
- <input type="color" id="highlightColor" value="${HIGHLIGHT_COLOR}" /><br><br>
- <label for="greyColor">背景色(大于指定时间范围):</label>
- <input type="color" id="greyColor" value="${GREY_COLOR}" /><br><br>
- <label for="timeThresholdMonths">时间阈值(月):</label>
- <input type="number" id="timeThresholdMonths" value="${TIME_THRESHOLD_MONTHS}" min="1" /><br><br>
- <button id="saveSettings">保存设置</button>
- `;
- document.body.appendChild(panel);
- // 保存设置
- document.getElementById('saveSettings').addEventListener('click', () => {
- // 获取设置并保存
- HIGHLIGHT_COLOR = document.getElementById('highlightColor').value;
- GREY_COLOR = document.getElementById('greyColor').value;
- TIME_THRESHOLD_MONTHS = parseInt(document.getElementById('timeThresholdMonths').value, 10);
- // 保存到油猴存储
- GM_setValue('highlightColor', HIGHLIGHT_COLOR);
- GM_setValue('greyColor', GREY_COLOR);
- GM_setValue('timeThresholdMonths', TIME_THRESHOLD_MONTHS);
- // 隐藏设置面板
- panel.style.display = 'none';
- // 应用新的设置,立即执行高亮
- highlightDates();
- });
- }
- // === 核心函数 ===
- function highlightDates() {
- if (isHighlighting) return; // 防止重复执行
- isHighlighting = true; // 设置标志为正在执行
- const now = new Date();
- const elements = document.querySelectorAll('.sc-aXZVg');
- if (elements.length === 0) {
- console.log('没有找到日期元素');
- isHighlighting = false;
- return;
- }
- elements.forEach(element => {
- const datetime = element.getAttribute('datetime');
- if (datetime) {
- const date = new Date(datetime);
- const timeDiff = now - date;
- const daysDiff = timeDiff / (1000 * 3600 * 24);
- const monthsDiff = daysDiff / 30;
- // 找到最近的祖先 td 元素
- const tdElement = element.closest('td');
- if (tdElement) {
- element.style.setProperty('color', '#fff', 'important');
- if (monthsDiff <= TIME_THRESHOLD_MONTHS) {
- tdElement.style.setProperty('background-color', HIGHLIGHT_COLOR, 'important');
- } else {
- tdElement.style.setProperty('background-color', GREY_COLOR, 'important');
- }
- }
- }
- });
- isHighlighting = false; // 执行完毕,重置标志
- }
- // === URL 更新后的逻辑 ===
- function onUrlChange() {
- if (currentURL !== location.href) {
- currentURL = location.href;
- console.log('URL 发生变化:', currentURL);
- // 检查 URL 是否符合 https://github.com/*/*/tree/* 格式
- const regex = /^https:\/\/github\.com\/[^/]+\/[^/]+\/tree\/[^/]+/;
- if (regex.test(location.href)) {
- console.log('符合 GitHub 目录树页面格式');
- // 检查 code-tab 是否存在且包含 selected 类名
- const codeTab = document.getElementById('code-tab');
- if (codeTab && codeTab.classList.contains('selected')) {
- console.log('code-tab 存在并被选中,开始执行高亮代码');
- setTimeout(() => {
- highlightDates();
- }, 1000); // 延迟 1 秒,等待页面加载
- } else {
- console.log('code-tab 不存在或未被选中,跳过高亮代码');
- }
- } else {
- console.log('不符合 GitHub 目录树页面格式,跳过高亮代码');
- }
- }
- }
- // === 监听 URL 和 DOM 变化 ===
- const observer = new MutationObserver(() => {
- const codeTab = document.getElementById('code-tab');
- if (codeTab && codeTab.classList.contains('selected')) {
- highlightDates();
- }
- });
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- });
- setInterval(onUrlChange, 1000);
- setTimeout(() => {
- const codeTab = document.getElementById('code-tab');
- if (codeTab && codeTab.classList.contains('selected')) {
- highlightDates();
- }
- }, 1000);
- // === 防止滚动时重复触发 ===
- let isScrolling = false;
- window.addEventListener('scroll', () => {
- if (!isScrolling) {
- isScrolling = true;
- setTimeout(() => {
- isScrolling = false; // 滚动结束后重新允许触发
- }, 100);
- }
- });
- // === 初始化设置面板 ===
- createSettingsPanel();
- // === 使用油猴菜单显示/隐藏设置面板 ===
- GM_registerMenuCommand('⚙️ 设置面板', () => {
- const panel = document.querySelector('div[style*="position: fixed"]');
- if (panel) {
- panel.style.display = panel.style.display === 'none' ? 'block' : 'none';
- }
- });
- // === 页面加载时自动执行高亮 ===
- highlightDates(); // 确保在初始化时执行高亮逻辑
- })();