Greasy Fork

Duolingo - add keyboard support to kana/kanji exercises

This script adds keyboard control to kana/kanji exercises, as requested here: https://www.reddit.com/r/duolingo/comments/7v9veq/duolingo_please_do_this_part_keyboard_compatible/

目前为 2018-02-05 提交的版本。查看 最新版本

// ==UserScript==
// @name         Duolingo - add keyboard support to kana/kanji exercises
// @namespace    https://github.com/ciekawylogin/
// @version      0.2.1
// @description  This script adds keyboard control to kana/kanji exercises, as requested here: https://www.reddit.com/r/duolingo/comments/7v9veq/duolingo_please_do_this_part_keyboard_compatible/
// @author       Michał Artur Krawczak (ciekawylogin@github)
// @match        https://www.duolingo.com/*
// ==/UserScript==

function appendNum(elem, num) {
	var para = document.createElement("p");
	var node = document.createTextNode(num);
        para.className = "mk-keycode";
	para.appendChild(node);
	para.style.cssText = numberStyle;
	elem.style.cssText = buttonStyle;
	elem.appendChild(para);
}

keys = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "q", "w", "e", "r", "t", "y", "u", "i",
        "o", "p", "a", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m"]

function addNumbers() {
        var buttons = Array.from(document.getElementsByClassName("iNLw3"))

	for(i in buttons) {
	    button = buttons[i];
	    appendNum(button, keys[i])
	}
}

numberStyle = "position: absolute;top: 1px;right: 1px;font-size: 7pt;color: gray;padding: 1px 3px;border: 1px solid #ccc;"

buttonStyle = "position:relative;" 

function addEvent(element, eventName, callback) {
    if (element.addEventListener) {
        element.addEventListener(eventName, callback, false);
    } else if (element.attachEvent) {
        element.attachEvent("on" + eventName, callback);
    } else {
        element["on" + eventName] = callback;
    }
}

function simulateClick(control)
{
   // if (document.all)
   // {
        control.click();
   // }
  //  else
  //  {
  //      var evObj = document.createEvent('MouseEvents');
  //      evObj.initMouseEvent('click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
  //      control.dispatchEvent(evObj);
 //   }
}
addEvent(document, "keypress", function (e) {
    e = e || window.event;
    key = e.keyCode;
    var idx = keys.indexOf(String.fromCharCode((96 <= key && key <= 105)? key-48 : key).toLowerCase());
   
    var buttons = Array.from(document.getElementsByClassName("iNLw3"))

    simulateClick(buttons[idx]);
});

function addNumbersIfNotPresent() {
  var buttonsWithoutCodes = Array.from(document.getElementsByClassName("iNLw3"))
  var buttonsWithCodes = Array.from(document.getElementsByClassName("mk-keycode"))
  if(buttonsWithoutCodes.length > 0 && buttonsWithCodes.length == 0) { 
    addNumbers();
  } 
}

setInterval(addNumbersIfNotPresent, 250);