From 9ec4ea026d4931b0a27c10cc7b55037df89ab396 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 12 Nov 2021 10:11:02 +0900 Subject: [PATCH] IME candidates separator to use \x1E instead of a comma --- assets/keylayout/zh_cn_cangjie5.ime | 8 ++++---- assets/keylayout/zh_tw_cangjie5.ime | 8 ++++---- src/net/torvald/terrarum/gamecontroller/IME.kt | 6 +++--- .../terrarum/gamecontroller/IMEProviderDelegate.kt | 10 +++++++--- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/assets/keylayout/zh_cn_cangjie5.ime b/assets/keylayout/zh_cn_cangjie5.ime index f3813ec55..de4061b5a 100644 --- a/assets/keylayout/zh_cn_cangjie5.ime +++ b/assets/keylayout/zh_cn_cangjie5.ime @@ -264,12 +264,12 @@ let reset = () => { states.candidates = "" } let getCandidatesUsingBuf = () => { - states.candidates = states.dict.getCangjie(states.buf) // comma-separated values + states.candidates = states.dict.getCangjie(states.buf) // \x1E-separated values states.code = 1 + (states.candidates.length == 0) // console.log(`cangjie in, buf: ${states.buf}, candidates: ${states.candidates}`) - return `${states.buf},${states.candidates}` + return `${states.buf}\u001E${states.candidates}` } -return Object.freeze({"n":"五仓简体 Qwerty","v":"many","c":"CuriousTo\uA75Bvald, 倉頡之友 。馬來西亞 http://www.chinesecj.com", +return Object.freeze({"n":"五仓简体 Qwerty","v":"many","c":"CuriousTo\uA75Bvald, 倉頡之友 。馬來西亞 http://www.chinesecj.com","m":"candidates", "t":states.keylayouts.map(it => [(it[2]||it[0]),it[1]]), // return: [displayed output, composed output] "accept":(headkey,shiftin,altgrin)=>{ @@ -280,7 +280,7 @@ return Object.freeze({"n":"五仓简体 Qwerty","v":"many","c":"CuriousTo\uA75Bv if (states.code == 1 && 48 <= cjkeyAsc && cjkeyAsc <= 57) { let raw = ''+states.buf - let selection = states.candidates.split(',')[cjkeyAsc - 49] + let selection = states.candidates.split('\u001E')[cjkeyAsc - 49] reset() return ['', selection || raw] } diff --git a/assets/keylayout/zh_tw_cangjie5.ime b/assets/keylayout/zh_tw_cangjie5.ime index 01d9f9bc1..4d3badf1f 100644 --- a/assets/keylayout/zh_tw_cangjie5.ime +++ b/assets/keylayout/zh_tw_cangjie5.ime @@ -264,12 +264,12 @@ let reset = () => { states.candidates = "" } let getCandidatesUsingBuf = () => { - states.candidates = states.dict.getCangjie(states.buf) // comma-separated values + states.candidates = states.dict.getCangjie(states.buf) // \x1E-separated values states.code = 1 + (states.candidates.length == 0) // console.log(`cangjie in, buf: ${states.buf}, candidates: ${states.candidates}`) - return `${states.buf},${states.candidates}` + return `${states.buf}\u001E${states.candidates}` } -return Object.freeze({"n":"五倉正體 Qwerty","v":"many","c":"CuriousTo\uA75Bvald, 倉頡之友 。馬來西亞 http://www.chinesecj.com", +return Object.freeze({"n":"五倉正體 Qwerty","v":"many","c":"CuriousTo\uA75Bvald, 倉頡之友 。馬來西亞 http://www.chinesecj.com","m":"candidates", "t":states.keylayouts.map(it => [(it[2]||it[0]),it[1]]), // return: [displayed output, composed output] "accept":(headkey,shiftin,altgrin)=>{ @@ -280,7 +280,7 @@ return Object.freeze({"n":"五倉正體 Qwerty","v":"many","c":"CuriousTo\uA75Bv if (states.code == 1 && 48 <= cjkeyAsc && cjkeyAsc <= 57) { let raw = ''+states.buf - let selection = states.candidates.split(',')[cjkeyAsc - 49] + let selection = states.candidates.split('\u001E')[cjkeyAsc - 49] reset() return ['', selection || raw] } diff --git a/src/net/torvald/terrarum/gamecontroller/IME.kt b/src/net/torvald/terrarum/gamecontroller/IME.kt index b7aedb6d5..9150045c5 100644 --- a/src/net/torvald/terrarum/gamecontroller/IME.kt +++ b/src/net/torvald/terrarum/gamecontroller/IME.kt @@ -3,7 +3,7 @@ package net.torvald.terrarum.gamecontroller import net.torvald.terrarum.App.printdbg import java.io.File -typealias IMECanditates = List +typealias IMECandidates = List typealias IMEOutput = String typealias Keysyms = Array> @@ -22,8 +22,8 @@ data class TerrarumIME( val name: String, val config: TerrarumIMEConf, // (headkey, shiftin, altgrin, lowLayerKeysym) - val acceptChar: (Int, Boolean, Boolean, String) -> Pair, - val backspace: () -> IMECanditates, + val acceptChar: (Int, Boolean, Boolean, String) -> Pair, + val backspace: () -> IMECandidates, val endCompose: () -> IMEOutput, val reset: () -> Unit, val composing: () -> Boolean diff --git a/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt b/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt index 17ac6c89d..0b7a27af8 100644 --- a/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt +++ b/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt @@ -19,6 +19,10 @@ class IMEProviderDelegate(val ime: IME) { class IMEDictionary(private val filename: String) { + companion object { + const val CAND_DELIM = '\u001E' + } + private val candidates = HashMap(16384) private val keys = SortedArrayList(16384) // keys on the .han file are absofreakinlutely not sorted @@ -30,7 +34,7 @@ class IMEDictionary(private val filename: String) { if (it.contains(',')) { val (key, value) = it.split(',') if (candidates.containsKey(key)) { - candidates[key] += ",$value" + candidates[key] += "$CAND_DELIM$value" } else { candidates[key] = value @@ -80,8 +84,8 @@ class IMEDictionary(private val filename: String) { val keysym = allRelevantKeys[index] if (!keysym.startsWith(key)) break - val outstr = ",${candidates[keysym]}" - outsize += outstr.count { it == ',' } + val outstr = "$CAND_DELIM${candidates[keysym]}" + outsize += outstr.count { it == CAND_DELIM } out.append(outstr) index += 1