您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shortcuts for Jisho.
// ==UserScript== // @name jisho-shortcuts // @namespace http://tampermonkey.net/ // @version 0.7.0 // @description Shortcuts for Jisho. // @author Long Huynh Huu // @match https://jisho.org/* // @grant none // ==/UserScript== const SHIFT_UP_KEY = "K"; const SHIFT_DOWN_KEY = "J"; const SCROLL_UP_KEY = "k"; const SCROLL_DOWN_KEY = "j"; const PLAY_KANJI = "Enter"; const START_IN_INSERT_MODE = false; (function() { 'use strict'; var shift = 0; var tags = []; var details = document.getElementsByClassName("light-details_link"); let keyword = document.getElementById("keyword"); keyword.style.fontSize = "1.125rem"; const mode = document.createElement("div"); const body = document.getElementsByClassName("text_input")[0]; body.append(mode); body.style.position = "relative"; mode.style.width = 100; mode.style.height = 100; mode.style.position = "absolute"; mode.style.right = 0; mode.style.bottom = 0; mode.style.fontFamily = "Iosevka, monospace"; mode.style.fontWeight = 800; mode.style.padding = "4px"; mode.style.fontSize = "0.875rem"; function indicateInsertMode() { mode.innerText = "INSERT"; mode.style.color = "#f1f5f9"; mode.style.backgroundColor = "#4d7c0f"; } function indicateNormalMode() { mode.innerText = "NORMAL"; mode.style.color = "#713f12"; mode.style.backgroundColor = "#facc15"; } keyword.onblur = indicateNormalMode; keyword.onfocus = indicateInsertMode; let install = function() { keyword.placeholder = "Press 'i' to search"; for (var i = 0; i < details.length; ++i) { let tag = document.createElement("div"); tag.style = "font-family: Iosevka, monospace; font-weight: 600; background-color: #facc15; color: #713f12; font-size: 1.5rem; border: 1px solid #facc15; padding: 4px; aspect-ratio: 1; text-align: center;"; if (shift*10 <= i && i < (shift+1)*10) { tag.innerText = "" + (i - shift*10); } else { tag.innerText = "" + ((i < shift*10) ? SHIFT_UP_KEY : SHIFT_DOWN_KEY); } tags.add(tag); details[i].prepend(tag); details[i].style = "text-decoration: none; opacity: 1;"; } } let update = function() { for (var i = 0; i < tags.length; ++i) { let tag = tags[i] if (shift*10 <= i && i < (shift+1)*10) { tag.innerText = "" + (i - shift*10); } else { tag.innerText = "" + ((i < shift*10) ? SHIFT_UP_KEY : SHIFT_DOWN_KEY); } } } let is_INSERT_mode = function() { return keyword == document.activeElement; } if (START_IN_INSERT_MODE) { keyword.focus(); } else { keyword.blur(); } install(); window.onkeydown = function(ev) { if (ev.key === "Escape") { keyword.blur(); shift = 0; update(); } } window.onkeypress = function(ev) { var no_modifier = !ev.altKey && !ev.ctrlKey && !ev.metaKey; if (no_modifier && !is_INSERT_mode()) { if (ev.key === "i") { ev.preventDefault(); keyword.focus(); shift = 0; update(); } else if (ev.key in "0 1 2 3 4 5 6 7 8 9".split(" ")) { let i = parseInt(ev.key) + 10*shift; if (i < details.length) { details[i].click(); } // shift tags up and down with k/j } else if (ev.key === SHIFT_DOWN_KEY) { if (10*(shift + 1) < details.length) { shift += 1; update(); } } else if (ev.key === SHIFT_UP_KEY) { if (shift > 0) { shift -= 1; update(); } } else if (ev.key == SCROLL_DOWN_KEY) { window.scroll(window.scrollX,window.scrollY + window.innerHeight/3); } else if (ev.key == SCROLL_UP_KEY) { window.scroll(window.scrollX,window.scrollY - window.innerHeight/3); } else if (ev.key == PLAY_KANJI) { var kanjis = document.getElementsByClassName("kanji_play_button"); for (var i = 0; i < kanjis.length; ++i) { kanjis[i].click(); } } } }; })();