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], ["\u0B85","\u0BF9"], ["\u0B99","\u0BF7"], ["\u0B92","\u0BF5","\u0BCA"], ["\u0B89","\u0BF8","\u0BC1"], ["\u0B8A","\u0B9C","\u0BC2"], ["\u0BCD","\u0B83"], ["\u0B8E","\u0B8E","\u0BC6"], ["\u0B95","\u0B95"], ["\u0BA9","\u0BA9"], ["\u0BAA","\u0BAA"], ["\u0BAE",'"'], ["\u0BA4",":"], ["\u0BB0","/"], ["\u0BB2","\u0BB2"], ["\u0B9F","["], ["\u0BA3","]"], ["\u0B86","\u0BB8","\u0BBE"], ["\u0B90","\u0BB9","\u0BC8"], ["\u0B87","\u0BFA","\u0BBF"], ["\u0B8F","\u0B95\u0BCD\u0BB7","\u0BC7"], ["\u0BB1","\u0BB1"], ["\u0BB5","\u0BF6"], ["\u0B88","\u0BB7","\u0BC0"], ["\u0B93","\u0BF4","\u0BCB"], ["\u0BB3","\u0BB8\u0BCD\u0BB0\u0BC0"], ["\u0B94","\u0BF3","\u0BCC"], [",","<"], [".",">"], [undefined], [undefined], [undefined], [undefined], [undefined], [" "], [undefined], [undefined], [undefined], ["\n"], ["\x08"], ["`","~"], ["-","_"], ["=","+"], ["\u0B9A","{"], ["\u0B9E","}"], ["\\","|"], ["\u0BA8",";"], ["\u0BAF","'"], ["\u0BB4","?"], [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":""} // the last character typed let reset = () => { states.code = "" } let inRange = (s,a,b) => (a <= s && s <= b) let isConsonant = (s) => s !== undefined && (inRange(s, 0x0B95, 0x0BB9) || s == 0x0BD0 || inRange(s, 0x0BE6, 0x0BFA)) // determines the behaviour of the vowel key return Object.freeze({"n":"தமிழ் 99","v":"none","c":"CuriousTo\uA75Bvald","m":"rewrite", "t":states.keylayouts, "l":"taIN", // return: [delete count, composed output] "accept":(headkey,shiftin,altgrin)=>{ let layer = 1*shiftin let s = states.keylayouts[headkey][layer] || states.keylayouts[headkey][0] if (layer == 0 && states.code != "" && isConsonant(states.code.charCodeAt(states.code.length - 1))) { s = states.keylayouts[headkey][2] || states.keylayouts[headkey][0] } states.code = s return ['0', s] }, "backspace":()=>{ reset() return '' }, "end":()=>{ reset() return '' }, "reset":()=>{ reset() }, "composing":()=>(states.code!='') })