NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Duolingo Auto Layout // @namespace http://ilnicki.me // @version 0.1 // @description The script provide you ability to type right symbols in answer box without switching keyboard layout. // @author ilnicki // @include https://www.duolingo.com/* // @grant none // ==/UserScript== var $dal = { char: function(value, shiftValue, altValue, altShiftValue) { if(typeof value === "object" && value !== null) { this.value = value.val; this.shiftValue = value.shift; this.altValue = value.alt; this.altShiftValue = value.altShift; } else { this.value = value; this.shiftValue = shiftValue; this.altValue = altValue; this.altShiftValue = altShiftValue; } }, charmap: function(charMap, parentMap) { this.charMap = charMap; this.parentMap = parentMap; this.getChar = function(params) { if(params.ctrlKey) { return null; } var keyChar = this.charMap[params.keyCode]; if(keyChar === undefined) { if(this.parentMap !== undefined) { return this.parentMap.getChar(params); } } else { var char; if(params.altKey && params.shiftKey) { char = keyChar.altShiftValue; } else if(params.altKey) { char = keyChar.altValue; } else if(params.shiftKey) { char = keyChar.shiftValue; } else { char = keyChar.value; } if(char === undefined) { if(this.parentMap !== undefined) { return this.parentMap.getChar(params); } } else { return char; } } }; }, charmaps: {}, addCharmap: function(mapCode, charMap, parentCode) { $dal.charmaps[mapCode] = new $dal.charmap(charMap, $dal.charmaps[parentCode]); }, checkCharmap: function(mapCode) { return mapCode !== undefined && $dal.charmaps[mapCode] !== undefined; }, getLocalizedChar: function(params, mapCode) { return $dal.charmaps[mapCode].getChar(params); }, applyChar: function(inputElem, char) { var start = inputElem.prop("selectionStart"); var end = inputElem.prop("selectionEnd"); var text = inputElem.val(); var before = text.substring(0, start); var after = text.substring(end, text.length); inputElem.val(before + char + after); inputElem.prop("selectionStart", start + 1); inputElem.prop("selectionEnd", start + 1); } }; $dal.addCharmap("en", { 192: new $dal.char('`', '~'), 49: new $dal.char('1', '!'), 50: new $dal.char('2', '@'), 51: new $dal.char('3', '#'), 52: new $dal.char('4', '$'), 53: new $dal.char('5', '%'), 54: new $dal.char('6', '^'), 55: new $dal.char('7', '&'), 56: new $dal.char('8', '*'), 57: new $dal.char('9', '('), 48: new $dal.char('0', ')'), 189: new $dal.char('-', '_'), 187: new $dal.char('=', '+'), 81: new $dal.char('q', 'Q'), 87: new $dal.char('w', 'W'), 69: new $dal.char('e', 'E'), 82: new $dal.char('r', 'R'), 84: new $dal.char('t', 'T'), 89: new $dal.char('y', 'Y'), 85: new $dal.char('u', 'U'), 73: new $dal.char('i', 'I'), 79: new $dal.char('o', 'O'), 80: new $dal.char('p', 'P'), 219: new $dal.char('[', '{'), 221: new $dal.char(']', '}'), 226: new $dal.char('\\', '|'), 65: new $dal.char('a', 'A'), 83: new $dal.char('s', 'S'), 68: new $dal.char('d', 'D'), 70: new $dal.char('f', 'F'), 71: new $dal.char('g', 'G'), 72: new $dal.char('h', 'H'), 74: new $dal.char('j', 'J'), 75: new $dal.char('k', 'K'), 76: new $dal.char('l', 'L'), 186: new $dal.char(';', ':'), 222: new $dal.char('\'', '"'), 220: new $dal.char('\\', '|'), 90: new $dal.char('z', 'Z'), 88: new $dal.char('x', 'X'), 67: new $dal.char('c', 'C'), 86: new $dal.char('v', 'V'), 66: new $dal.char('b', 'B'), 78: new $dal.char('n', 'N'), 77: new $dal.char('m', 'M'), 188: new $dal.char(',', '<'), 190: new $dal.char('.', '>'), 191: new $dal.char('/', '?') }); $dal.addCharmap("de", { 192: new $dal.char(null, '°'), 50: new $dal.char({shift: '"', alt: '²'}), 51: new $dal.char({shift: '§', alt: '³'}), 54: new $dal.char({shift: '&'}), 55: new $dal.char({shift: '/', alt: '{'}), 56: new $dal.char({shift: '(', alt: '['}), 57: new $dal.char({shift: ')', alt: ']'}), 48: new $dal.char({shift: '=', alt: '}'}), 189: new $dal.char('ß', '?', '\\'), 187: new $dal.char(null, null), 81: new $dal.char({alt: '@'}), 69: new $dal.char({alt: '€'}), 89: new $dal.char('z', 'Z'), 219: new $dal.char('ü', 'Ü'), 221: new $dal.char('+', '*', '~'), 226: new $dal.char('<', '>', '|'), 186: new $dal.char('ö', 'Ö'), 222: new $dal.char('ä', 'Ä'), 220: new $dal.char('#', '\''), 90: new $dal.char('y', 'Y'), 77: new $dal.char({alt: 'µ'}), 188: new $dal.char({shift: ';'}), 190: new $dal.char({shift: ':'}), 191: new $dal.char('-', '_') }, "en"); $dal.addCharmap("ru", { 192: new $dal.char('ё', 'Ё'), 50: new $dal.char({shift: '"'}), 51: new $dal.char({shift: '№'}), 52: new $dal.char({shift: ';'}), 54: new $dal.char({shift: ':'}), 55: new $dal.char({shift: '?'}), 81: new $dal.char('й', 'Й'), 87: new $dal.char('ц', 'Ц'), 69: new $dal.char('у', 'У'), 82: new $dal.char('к', 'К'), 84: new $dal.char('е', 'Е'), 89: new $dal.char('н', 'Н'), 85: new $dal.char('г', 'Г'), 73: new $dal.char('ш', 'Ш'), 79: new $dal.char('щ', 'Щ'), 80: new $dal.char('з', 'З'), 219: new $dal.char('х', 'Х'), 221: new $dal.char('ъ', 'Ъ'), 226: new $dal.char('\\', '/'), 65: new $dal.char('ф', 'Ф'), 83: new $dal.char('ы', 'Ы'), 68: new $dal.char('в', 'В'), 70: new $dal.char('а', 'А'), 71: new $dal.char('п', 'П'), 72: new $dal.char('р', 'Р'), 74: new $dal.char('о', 'О'), 75: new $dal.char('л', 'Л'), 76: new $dal.char('д', 'Д'), 186: new $dal.char('ж', 'Ж'), 222: new $dal.char('э', 'Э'), 220: new $dal.char('\\', '/'), 90: new $dal.char('я', 'Я'), 88: new $dal.char('ч', 'Ч'), 67: new $dal.char('с', 'С'), 86: new $dal.char('м', 'М'), 66: new $dal.char('и', 'И'), 78: new $dal.char('т', 'Т'), 77: new $dal.char('ь', 'Ь'), 188: new $dal.char('б', 'Б'), 190: new $dal.char('ю', 'Ю'), 191: new $dal.char('.', ',') }, "en"); $dal.addCharmap("uk", { 192: new $dal.char('\'', '₴'), 85: new $dal.char('г', 'Г', 'ґ', 'Ґ'), 221: new $dal.char('ї', 'Ї'), 226: new $dal.char('ґ', 'Ґ'), 83: new $dal.char('і', 'І'), 222: new $dal.char('є', 'Є') }, "ru"); $(document).ready(function() { $(document).on("keydown" , "#text-input, #word-input", function(e) { var el = $(this); var lang = el.attr('lang'); if(!$dal.checkCharmap(lang)) return; var char = $dal.getLocalizedChar(e, lang); if(char !== undefined) { e.preventDefault(); if(char !== null) { $dal.applyChar(el, char); } } }); });