diff --git a/assets/keylayout/ko_kr_2set_ksx5002.ime b/assets/keylayout/ko_kr_2set_ksx5002.ime index 335b4b343..b678ab980 100644 --- a/assets/keylayout/ko_kr_2set_ksx5002.ime +++ b/assets/keylayout/ko_kr_2set_ksx5002.ime @@ -280,7 +280,7 @@ let jongseongDigraphsG = {"\u3145":"\u3133"} let jongseongDigraphsN = {"\u3148":"\u3135", "\u314E":"\u3136"} let jongseongDigraphsR = {"\u3131":"\u313A", "\u3141":"\u313B", "\u3142":"\u313C", "\u3145":"\u313D", "\u314C":"\u313E", "\u314D":"\u313F", "\u314E":"\u3140"} let jongseongDigraphsB = {"\u3145":"\u3144"} -let isJongseongDigraph = (s) => (s === undefined) ? false : ([0x3133, 0x3135, 0x3136, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3144].includes(s.charCodeAt(0))) +let isThisCharJongseongDigraph = (s) => (s === undefined) ? false : ([0x3133, 0x3135, 0x3136, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3144].includes(s.charCodeAt(0))) let choseongTable = {"\u3131":0,"\u3132":1,"\u3134":2,"\u3137":3,"\u3138":4,"\u3139":5,"\u3141":6,"\u3142":7,"\u3143":8,"\u3145":9,"\u3146":10,"\u3147":11,"\u3148":12,"\u3149":13,"\u314A":14,"\u314B":15,"\u314C":16,"\u314D":17,"\u314E":18} let jongseongTable = {"\u3131":0,"\u3132":1,"\u3133":2,"\u3134":3,"\u3135":4,"\u3136":5,"\u3137":6,"\u3139":7,"\u313A":8,"\u313B":9,"\u313C":10,"\u313D":11,"\u313E":12,"\u313F":13,"\u3140":14,"\u3141":15,"\u3142":16,"\u3144":17,"\u3145":18,"\u3146":19,"\u3147":20,"\u3148":21,"\u314A":22,"\u314B":23,"\u314C":24,"\u314D":25,"\u314E":26} let detachJongseongDigraph = { @@ -375,7 +375,7 @@ return Object.freeze({"n":"두벌식 표준","states":states, else if (states.buf[bufIndex] !== undefined) { let oldbufstr = bufDebugStringify(states.buf) let sendout = '' - if (vowelCollision && isJongseongDigraph(states.buf[2])) { + if (vowelCollision && isThisCharJongseongDigraph(states.buf[2])) { let digraphs = detachJongseongDigraph[states.buf[2]] let newbuf = [digraphs[1], s] states.buf = [states.buf[0], states.buf[1], digraphs[0]] diff --git a/assets/keylayout/ko_kr_3set_390.ime b/assets/keylayout/ko_kr_3set_390.ime index 845dad4f6..68e283224 100644 --- a/assets/keylayout/ko_kr_3set_390.ime +++ b/assets/keylayout/ko_kr_3set_390.ime @@ -266,6 +266,9 @@ let isChoseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x let isJungseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x1161, 0x1175) let isJongseong = (s) => (s === undefined) ? false : inRange(s.charCodeAt(0), 0x11A8, 0x11C2) let isChoseongDigraph = (s) => (s === undefined) ? false : ([0x1100, 0x1103, 0x1107, 0x1109, 0x110C].includes(s.charCodeAt(0))) +let isThisCharChoseongDigraph = (s) => (s === undefined) ? false : ([0x1101, 0x1104, 0x1108, 0x110A, 0x110D].includes(s.charCodeAt(0))) +let isThisCharJungseongDigraph = (s) => (s === undefined) ? false : ([0x116A, 0x116B, 0x116C, 0x116F, 0x1170, 0x1171, 0x1174].includes(s.charCodeAt(0))) +let isThisCharJongseongDigraph = (s) => (s === undefined) ? false : ([0x11A9, 0x11AA, 0x11AC, 0x11AD, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B9].includes(s.charCodeAt(0))) // ㅆ is an exception! let isJungseongDigraphO = (s) => (s === undefined) ? false : ([0x1161, 0x1162, 0x1175].includes(s.charCodeAt(0))) let isJungseongDigraphU = (s) => (s === undefined) ? false : ([0x1165, 0x1166, 0x1175].includes(s.charCodeAt(0))) let isJungseongDigraphEU = (s) => (s === undefined) ? false : ([0x1175].includes(s.charCodeAt(0))) @@ -281,6 +284,37 @@ let jongseongDigraphsG = {"\u11A8":"\u11A9", "\u11BA":"\u11AA"} let jongseongDigraphsN = {"\u11BD":"\u11AC", "\u11C2":"\u11AD"} let jongseongDigraphsR = {"\u11A8":"\u11B0", "\u11B7":"\u11B1", "\u11B8":"\u11B2", "\u11BA":"\u11B3", "\u11C0":"\u11B4", "\u11C1":"\u11B5", "\u11C2":"\u11B6"} let jongseongDigraphsB = {"\u11BA":"\u11B9"} +let detachChoseongDigraph = { +"\u1101":["\u1100","\u1100"], +"\u1104":["\u1103","\u1103"], +"\u1108":["\u1107","\u1107"], +"\u110A":["\u1109","\u1109"], +"\u110D":["\u110C","\u110C"] +} +let detachJungseongDigraph = { +"\u116A":["\u1169","\u1161"], +"\u116B":["\u1169","\u1162"], +"\u116C":["\u1169","\u1175"], +"\u116F":["\u116E","\u1165"], +"\u1170":["\u116E","\u1166"], +"\u1171":["\u116E","\u1175"], +"\u1174":["\u1173","\u1175"] +} +let detachJongseongDigraph = { +"\u11A9":["\u11A8","\u11A8"], +"\u11AA":["\u11A8","\u11BA"], +"\u11AC":["\u11AB","\u11BD"], +"\u11AD":["\u11AB","\u11C2"], +"\u11B0":["\u11AF","\u11A8"], +"\u11B1":["\u11AF","\u11B7"], +"\u11B2":["\u11AF","\u11B8"], +"\u11B3":["\u11AF","\u11BA"], +"\u11B4":["\u11AF","\u11C0"], +"\u11B5":["\u11AF","\u11C1"], +"\u11B6":["\u11AF","\u11C2"], +"\u11B9":["\u11B8","\u11BA"], +"\u11BB":["\u11BA","\u11BA"] +} let normaliseLUT = { // Hangul Jamo Initials → Hangul Compatibility Jamo "\u1100":"\u3131","\u1101":"\u3132","\u1102":"\u3134","\u1103":"\u3137","\u1104":"\u3138", @@ -388,10 +422,10 @@ return Object.freeze({"n":"세벌식 3-90","states":states, } // key inputs that bufIndex collides (end compose and accept incoming char as a new char state) else if (states.buf[bufIndex] !== undefined) { - let oldbufstr = bufDebugStringify(states.buf) +// let oldbufstr = bufDebugStringify(states.buf) let sendout = bufAssemble(); reset() states.buf[bufIndex] = s - let newbufstr = bufDebugStringify(states.buf) +// let newbufstr = bufDebugStringify(states.buf) // console.log(`sending out: ${oldbufstr} -> ${sendout} ; ${newbufstr}`) return [bufAssemble(1), sendout] } @@ -403,12 +437,36 @@ return Object.freeze({"n":"세벌식 3-90","states":states, return [bufAssemble(1), ""] } else { - let oldbufstr = bufDebugStringify(states.buf) +// let oldbufstr = bufDebugStringify(states.buf) let sendout = bufAssemble() + (s || ''); reset() // console.log(`sending out: ${oldbufstr} -> ${sendout}`) return [bufAssemble(1), sendout] } }, +"backspace":()=>{ + // disassemble jung/jongseong digraphs +// let oldbufstr = bufDebugStringify(states.buf) + let last = states.buf.pop() + + if (last !== undefined) { + // detach jongseong + if (isThisCharJongseongDigraph(last)) + states.buf[2] = detachJongseongDigraph[last][0] + // detach jungseong + else if (isThisCharJungseongDigraph(last)) + states.buf[1] = detachJungseongDigraph[last][0] + // detach choseong + else if (isThisCharChoseongDigraph(last)) + states.buf[0] = detachChoseongDigraph[last][0] + } + + if (states.buf.length == 0) reset() + +// let newbufstr = bufDebugStringify(states.buf) +// console.log(`popping assembly: ${oldbufstr} -> ${newbufstr}`) + + return bufAssemble(1) +}, "end":()=>{ // console.log(`end composing`) let ret = bufAssemble() diff --git a/src/net/torvald/terrarum/gamecontroller/IME.kt b/src/net/torvald/terrarum/gamecontroller/IME.kt index c1b80aa45..5603f1f48 100644 --- a/src/net/torvald/terrarum/gamecontroller/IME.kt +++ b/src/net/torvald/terrarum/gamecontroller/IME.kt @@ -12,6 +12,7 @@ data class TerrarumInputMethod( val name: String, // (headkey, shiftin, altgrin) val acceptChar: (Int, Boolean, Boolean) -> Pair, // Pair + val backspace: () -> String, val endCompose: () -> String, val reset: () -> Unit, val composing: () -> Boolean @@ -109,6 +110,8 @@ object IME { return TerrarumInputMethod(name, { headkey, shifted, alted -> val a = jsval.invokeMember("accept", headkey, shifted, alted) a.getArrayElement(0).asString() to a.getArrayElement(1).asString() + }, { + jsval.invokeMember("backspace").asString() }, { jsval.invokeMember("end").asString() }, { diff --git a/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt b/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt index 4dcb4791b..88eb15541 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt @@ -176,8 +176,7 @@ class UIItemTextLineInput( } else if (keycodes.contains(Input.Keys.BACKSPACE)) { if (ime != null && ime.composing()) { - // TODO ime.backspace() instead of resetIME() - resetIME() + composingView = CodepointSequence(ime.backspace().toCodePoints()) } else if (cursorX <= 0) { cursorX = 0 @@ -185,6 +184,7 @@ class UIItemTextLineInput( cursorDrawScroll = 0 } else { + endComposing() if (cursorX > 0) { while (true) { cursorX -= 1