// TODO: implement the automata as per https://www.nectec.or.th/it-standards/keyboard_layout/thai-key.html let states = {"keylayouts":[[""],[undefined], [undefined], [undefined], [undefined], [undefined], [undefined], ["\u0E08","\u0E57","0",")"], ["\u0E45","+","1","!"], ["/","\u0E51","2","@"], ["-","\u0E52","3","#"], ["\u0E20","\u0E53","4","$"], ["\u0E16","\u0E54","5","%"], ["\u0E38","\u0E39","6","^"], ["\u0E36","\u0E3F","7","&"], ["\u0E04","\u0E55","8","*"], ["\u0E15","\u0E56","9","("], ["*"], ["#"], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], [undefined], ["\u0E1F","\u0E24"],// A ["\u0E34","\u0E3A"],// B ["\u0E41","\u0E09"],// C ["\u0E01","\u0E0F"],// D ["\u0E33","\u0E0E"],// E ["\u0E14","\u0E42"],// F ["\u0E40","\u0E0C"],// G ["\u0E49","\u0E47"],// H ["\u0E23","\u0E13"],// I ["\u0E48","\u0E4B"],// J ["\u0E32","\u0E29"],// K ["\u0E2A","\u0E28"],// L ["\u0E17","?"],// M ["\u0E37","\u0E4C"],// N ["\u0E19","\u0E2F"],// O ["\u0E22","\u0E0D"],// P ["\u0E46","\u0E50"],// Q ["\u0E1E","\u0E11"],// R ["\u0E2B","\u0E06"],// S ["\u0E30","\u0E18"],// T ["\u0E35","\u0E4A"],// U ["\u0E2D","\u0E2E"],// V ["\u0E44",'"'],// W ["\u0E1B",")"],// X ["\u0E31","\u0E4D"],// Y ["\u0E1C","("],// Z ["\u0E21","\u0E12","\u0E5A","\u0E5A"],// < ["\u0E43","\u0E2C","\u0E4F","\u0E4F"],// > [undefined], [undefined], [undefined], [undefined], [undefined], [" "], [undefined], [undefined], [undefined], ["\n"], ["\x08"], ["_","%","¤","¤"],// ~ ["\u0E02","\u0E58"],// - ["\u0E0A","\u0E59"],// = ["\u0E1A","\u0E10"],// [ ["\u0E25",","],// ] ["\u0E03","\u0E05"],// \ ["\u0E27","\u0E0B"],// ; ["\u0E07",'.'],// ' ["\u0E1D","\u0E26","\u0E5B","\u0E5B"],// ? [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":""} // practically unused as long as there are no diacritics on the keyboard let reset = () => { states.code = 0 } let diacriticsMapping = { } let inRange = (s,a,b) => (a <= s && s <= b) let isDiacritics = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x0300, 0x036F) return Object.freeze({"n":"แป้นพิมพ์เกษมณี","v":"none","c":"CuriousTo\uA75Bvald","m":"rewrite", "t":states.keylayouts, "l":"thTH", // return: [displayed output, composed output] "accept":(headkey,shiftin,altgrin)=>{ let layer = 1*shiftin + 2*altgrin // use AltGr to type conventional numbers states.code = 0 let s = states.keylayouts[headkey][layer] return ['0', s] }, "backspace":()=>{ reset() return '' }, "end":()=>{ reset() return '' }, "reset":()=>{ reset() }, "composing":()=>(states.code!='') })