let states = {"keylayouts":[[""],[undefined], [undefined], [undefined], [undefined], [undefined], [undefined], ["0",")","}","`"], ["1","!","!","|"], ["2",'"',"@",'"'], ["3","¤","#","£"], ["4","%","$","€"], ["5",":","%","∞"], ["6",",","^","¬"], ["7",".","&","¶"], ["8",";","*","√"], ["9","(","{","'"], ["*"], ["#"], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], ["ф","Ф","ƒ","ƒ"], ["и","И"], ["с","С","≠","≠"], ["в","В","ћ","Ћ"], ["у","У","ќ","Ќ"], ["а","А","÷","÷"], ["п","П","©","©"], ["р","Р","₽","₽"], ["ш","Ш","ѕ","Ѕ"], ["о","О","°","•"], ["л","Л","љ","Љ"], ["д","Д","Δ","Δ"], ["ь","Ь","~","~"], ["т","Т","™","™"], ["щ","Щ","ў","Ў"], ["з","З","‘","‘"], ["й","Й","ј","Ј"], ["к","К","®","®"], ["ы","Ы","¤","¤"], ["е","Е","†","†"], ["г","Г","ѓ","Ѓ"], ["м","М","µ","µ"], ["ц","Ц","џ","Џ"], ["ч","Ч","≈","≈"], ["н","Н","њ","Њ"], ["я","Я","ђ","Ђ"], ["б","Б","≤","<"], ["ю","Ю","≥",">"], [undefined], [undefined], [undefined], [undefined], [undefined], [" "], [undefined], [undefined], [undefined], ["\n"], ["\x08"], [">","<","]","["], ["-","_","—","–"], ["=","+","»","«"], ["х","Х","“","“"], ["ъ","Ъ"], ["ё","Ё"], ["ж","Ж","…","…"], ["э",'Э'], ["/","?","„","„"], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], ["0"], ["1"], ["2"], ["3"], ["4"], ["5"], ["6"], ["7"], ["8"], ["9"], ["/"], ["*"], ["-"], ["+"], ["."], ["."], ["\n"], ["="], ["("], [")"], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined] ], "code":0} // practically unused as long as there are no diacritics on the keyboard let reset = () => { states.code = 0 } let inRange = (s,a,b) => (a <= s && s <= b) let isDiacritics = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x0300, 0x036F) return Object.freeze({"n":"ЙЦУКЕН (Рус. Apple)","v":"none","c":"CuriousTo\uA75Bvald","m":"rewrite", "t":states.keylayouts, "l":"ruRU", // return: [displayed output, composed output] "accept":(headkey,shiftin,altgrin)=>{ let layer = 1*shiftin + 2*altgrin states.code = 1 let s = states.keylayouts[headkey][layer] if (isDiacritics(s)) { return ['1', ''] } else { reset() return ['0', s] } }, "backspace":()=>{ reset() return '' }, "end":()=>{ reset() return '' }, "reset":()=>{ reset() }, "composing":()=>(states.code!=0) })