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();
}
}
}
};
})();