快捷重做(Ctrl+O)、快捷跳过(Ctrl+Alt/Command+Space)、快捷切换大小写(Ctrl/Command+P)、更普适的提交(Ctrl/Command/Option+Enter, Ctrl/Command/Option+Space)
// ==UserScript==
// @name Sharplingo Enhancements
// @namespace http://tampermonkey.net/
// @version 2.3.2
// @description 快捷重做(Ctrl+O)、快捷跳过(Ctrl+Alt/Command+Space)、快捷切换大小写(Ctrl/Command+P)、更普适的提交(Ctrl/Command/Option+Enter, Ctrl/Command/Option+Space)
// @author schweigen
// @match https://*.sharplingo.cn/users/study
// @match https://*.sharplingo.cn/users/study?*
// @icon https://www.google.com/s2/favicons?sz=64&domain=sharplingo.cn
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// 点击重做按钮
function tryClickButton() {
document.querySelectorAll('button').forEach((button) => {
if (button.textContent.includes('手抖了,其实这题我会做😭')) {
button.click();
}
});
}
// 聚焦到答案输入框
function focusInput() {
const inputElement = document.querySelector('input#answer_input.form-control.answer');
if (inputElement) {
inputElement.focus();
}
}
// 切换输入框第一个字母的大小写
function toggleFirstLetterCase(inputElement) {
const value = inputElement.value;
if (value.length > 0) {
const firstLetter = value.charAt(0);
const restOfValue = value.slice(1);
const toggledFirstLetter = firstLetter === firstLetter.toUpperCase() ? firstLetter.toLowerCase() : firstLetter.toUpperCase();
inputElement.value = toggledFirstLetter + restOfValue;
}
}
// 检测并关闭可能存在的模态窗口
function tryCloseModal() {
const modals = document.querySelectorAll('.modal.show, .modal.in');
modals.forEach(modal => {
const closeButton = modal.querySelector('button.close, button[aria-label="Close"]');
if (closeButton) {
closeButton.click();
}
});
return modals.length > 0;
}
// 重新定义键盘事件
document.addEventListener('keydown', function(e) {
// 检测Ctrl+P或Command+P并聚焦输入框或切换大小写
if ((e.ctrlKey || e.metaKey) && e.key === 'p') {
e.preventDefault();
if (!tryCloseModal()) {
const inputElement = document.querySelector('input#answer_input.form-control.answer');
if (inputElement && document.activeElement === inputElement) {
toggleFirstLetterCase(inputElement);
}
}
focusInput();
return;
}
// 检测Ctrl+O并点击重做按钮
if (e.ctrlKey && e.key === 'o') {
e.preventDefault();
tryClickButton();
return;
}
// 跳过当前卡片(Ctrl+Alt+Space 或 Ctrl+Command+Space,仅左侧按键)
if (e.ctrlKey && (e.altKey || (e.metaKey && !e.shiftKey && !e.altKey)) && e.code === 'Space') {
document.getElementById("too_easy").click();
e.preventDefault();
return;
}
// 允许 Ctrl+Command+I 组合键
if (e.ctrlKey && e.metaKey && e.key.toLowerCase() === 'i') {
return;
}
// 允许必要的快捷键
if ((e.ctrlKey || e.metaKey) && ['c', 'v', 'a', 'x', 'z', 'Enter', 'Backspace', 'Delete'].indexOf(e.key.toLowerCase()) !== -1) {
return;
}
// 允许 CMD/CTRL+数字组合键
if ((e.ctrlKey || e.metaKey) && /^\d$/.test(e.key)) {
return;
}
// 禁用其他Ctrl或Meta键组合的快捷键
if (e.ctrlKey || e.metaKey) {
e.preventDefault();
e.stopImmediatePropagation();
}
}, true);
})();