Greasy Fork is available in English.

添加月历

在指定页面上添加一个月历,并根据点击的日期修改后缀的内容为完整的日期格式

// ==UserScript==
// @name         添加月历
// @namespace    http://www.github.com/awyugan
// @version      0.1.2
// @description  在指定页面上添加一个月历,并根据点击的日期修改后缀的内容为完整的日期格式
// @author       awyugan
// @match        https://nightly.changelog.com/*
// @match        https://huggingface.co/papers?date=*
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 创建选择框
    function createSelect(start, end, initialValue) {
        var select = document.createElement('select');

        for (var i = start; i <= end; i++) {
            var option = document.createElement('option');
            option.value = i;
            option.textContent = i;
            select.appendChild(option);
        }

        select.value = initialValue;

        return select;
    }

    // 新的函数,用来根据当前网址确定 URL 格式
    function getURLFormat() {
        var url = window.location.href;

        if (url.includes('huggingface.co')) {
            return 'huggingface';
        } else if (url.includes('nightly.changelog.com')) {
            return 'changelog';
        }

        // 默认返回 'changelog'
        return 'changelog';
    }

    // 创建月历
    function createCalendar() {
        // 获取当前日期
        var currentDate = new Date();

        // 从URL中获取日期
        var urlParts = window.location.href.split('/');
        var urlYear, urlMonth, urlDay;
        var urlFormat = getURLFormat();

        if (urlFormat === 'huggingface') {
            var dateParam = new URL(window.location.href).searchParams.get('date');
            var dateParts = dateParam.split('-');
            urlYear = parseInt(dateParts[0]);
            urlMonth = parseInt(dateParts[1]);
            urlDay = parseInt(dateParts[2]);
        } else { // 'changelog'
            urlYear = parseInt(urlParts[3]);
            urlMonth = parseInt(urlParts[4]);
            urlDay = parseInt(urlParts[5]);
        }

        // 创建月历元素
        var calendar = document.createElement('div');
        calendar.id = 'calendar';
        calendar.style.position = 'fixed';
        calendar.style.top = '10px';
        calendar.style.right = '10px';
        calendar.style.padding = '10px';
        calendar.style.background = 'white';
        calendar.style.border = '1px solid black';

        // 创建标题元素
        var title = document.createElement('h3');

        // 创建年份和月份选择框
        var selectYear = createSelect(2000, 2100, urlYear || currentDate.getFullYear());
        var selectMonth = createSelect(1, 12, urlMonth || currentDate.getMonth() + 1);

        // 将选择框添加到标题元素
        title.appendChild(selectYear);
        title.appendChild(document.createTextNode('/'));
        title.appendChild(selectMonth);

        // 创建跳转到当前月份的链接
        var currentMonthLink = document.createElement('a');
        currentMonthLink.href = '#';
        currentMonthLink.textContent = '跳转到当前月份';

        // 点击链接时更新选择框的值为当前月份
        currentMonthLink.addEventListener('click', function(event) {
            event.preventDefault();
            selectYear.value = currentDate.getFullYear();
            selectMonth.value = currentDate.getMonth() + 1;
            updateCalendar();
        });

        // 将链接添加到标题元素
        title.appendChild(currentMonthLink);

        // 将标题元素添加到月历
        calendar.appendChild(title);

        // 创建星期数元素
        var weekdays = ['一', '二', '三', '四', '五', '六', '日'];
        var weekRow = document.createElement('div');
        weekRow.style.display = 'grid';
        weekRow.style.gridTemplateColumns = 'repeat(7, 1fr)';

        for (var k = 0; k < 7; k++) {
            var weekday = document.createElement('div');
            weekday.textContent = weekdays[k];
            weekday.style.textAlign = 'center';
            weekRow.appendChild(weekday);
        }

        // 将星期数元素添加到月历
        calendar.appendChild(weekRow);

        // 创建日期元素
        var days = document.createElement('div');
        days.id = 'calendar-days';
        days.style.display = 'grid';
        days.style.gridTemplateColumns = 'repeat(7, 1fr)';
        calendar.appendChild(days);

        // 更新月历
        function updateCalendar() {
            var selectedYear = parseInt(selectYear.value);
            var selectedMonth = parseInt(selectMonth.value);

            // 清空日期元素
            days.innerHTML = '';

            // 获取当前月份的第一天的日期
            var firstDay = new Date(selectedYear, selectedMonth - 1, 1);

            // 获取当前月份的最后一天的日期
            var lastDay = new Date(selectedYear, selectedMonth, 0);

            // 获取当前月份的天数
            var numDays = lastDay.getDate();

            // 获取当前月份的第一天是星期几
            var firstDayOfWeek = firstDay.getDay();

            // 创建日期格子
            var dayIndex = 1 - firstDayOfWeek; // 第一个日期格子的索引
            for (var row = 0; row < 6; row++) {
                for (var col = 0; col < 7; col++) {
                    var day = document.createElement('div');

                    if (dayIndex >= 1 && dayIndex <= numDays) {
                        day.textContent = dayIndex;
                        day.style.padding = '5px';
                        day.style.textAlign = 'center';
                        day.style.cursor = 'pointer';

                        // 根据当前日期高亮显示今天的日期
                        if (
                            selectedYear === currentDate.getFullYear() &&
                            selectedMonth -1 === currentDate.getMonth() &&
                            dayIndex === currentDate.getDate()
                        ) {
                            day.style.background = 'yellow';
                        }

                        // 根据网址中的日期高亮显示
                        if (
                            urlYear === selectedYear &&
                            urlMonth === selectedMonth &&
                            urlDay === dayIndex
                        ) {
                            day.style.background = 'green';
                        }

                        // 添加点击事件
                        day.addEventListener('click', function(event) {
                            var clickedDate = event.target.textContent;
                            var clickedYear = selectYear.value;
                            var clickedMonth = selectMonth.value < 10 ? '0' + selectMonth.value : selectMonth.value;
                            var clickedDay = clickedDate < 10 ? '0' + clickedDate : clickedDate;

                            var url;
                            if (urlFormat === 'huggingface') {
                                url = 'https://huggingface.co/papers?date=' + clickedYear + '-' + clickedMonth + '-' + clickedDay;
                            } else { // 'changelog'
                                url = 'https://nightly.changelog.com/' + clickedYear + '/' + clickedMonth + '/' + clickedDay;
                            }

                            window.location.href = url;
                        });
                    }

                    days.appendChild(day);
                    dayIndex++;
                }
            }
        }

        // 监听选择框变化事件,更新月历
        selectYear.addEventListener('change', updateCalendar);
        selectMonth.addEventListener('change', updateCalendar);

        // 初始化月历
        updateCalendar();

        // 将月历添加到页面中
        document.body.appendChild(calendar);
    }

    // 等待页面加载完成后创建月历
    window.addEventListener('load', createCalendar);
})();