在指定页面上添加一个月历,并根据点击的日期修改后缀的内容为完整的日期格式
// ==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);
})();