IME candidates separator to use \x1E instead of a comma

This commit is contained in:
minjaesong
2021-11-12 10:11:02 +09:00
parent 23e9dd3114
commit 9ec4ea026d
4 changed files with 18 additions and 14 deletions

View File

@@ -264,12 +264,12 @@ let reset = () => {
states.candidates = "" states.candidates = ""
} }
let getCandidatesUsingBuf = () => { 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) states.code = 1 + (states.candidates.length == 0)
// console.log(`cangjie in, buf: ${states.buf}, candidates: ${states.candidates}`) // 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]]), "t":states.keylayouts.map(it => [(it[2]||it[0]),it[1]]),
// return: [displayed output, composed output] // return: [displayed output, composed output]
"accept":(headkey,shiftin,altgrin)=>{ "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) { if (states.code == 1 && 48 <= cjkeyAsc && cjkeyAsc <= 57) {
let raw = ''+states.buf let raw = ''+states.buf
let selection = states.candidates.split(',')[cjkeyAsc - 49] let selection = states.candidates.split('\u001E')[cjkeyAsc - 49]
reset() reset()
return ['', selection || raw] return ['', selection || raw]
} }

View File

@@ -264,12 +264,12 @@ let reset = () => {
states.candidates = "" states.candidates = ""
} }
let getCandidatesUsingBuf = () => { 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) states.code = 1 + (states.candidates.length == 0)
// console.log(`cangjie in, buf: ${states.buf}, candidates: ${states.candidates}`) // 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]]), "t":states.keylayouts.map(it => [(it[2]||it[0]),it[1]]),
// return: [displayed output, composed output] // return: [displayed output, composed output]
"accept":(headkey,shiftin,altgrin)=>{ "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) { if (states.code == 1 && 48 <= cjkeyAsc && cjkeyAsc <= 57) {
let raw = ''+states.buf let raw = ''+states.buf
let selection = states.candidates.split(',')[cjkeyAsc - 49] let selection = states.candidates.split('\u001E')[cjkeyAsc - 49]
reset() reset()
return ['', selection || raw] return ['', selection || raw]
} }

View File

@@ -3,7 +3,7 @@ package net.torvald.terrarum.gamecontroller
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
import java.io.File import java.io.File
typealias IMECanditates = List<String> typealias IMECandidates = List<String>
typealias IMEOutput = String typealias IMEOutput = String
typealias Keysyms = Array<Array<String?>> typealias Keysyms = Array<Array<String?>>
@@ -22,8 +22,8 @@ data class TerrarumIME(
val name: String, val name: String,
val config: TerrarumIMEConf, val config: TerrarumIMEConf,
// (headkey, shiftin, altgrin, lowLayerKeysym) // (headkey, shiftin, altgrin, lowLayerKeysym)
val acceptChar: (Int, Boolean, Boolean, String) -> Pair<IMECanditates, IMEOutput>, val acceptChar: (Int, Boolean, Boolean, String) -> Pair<IMECandidates, IMEOutput>,
val backspace: () -> IMECanditates, val backspace: () -> IMECandidates,
val endCompose: () -> IMEOutput, val endCompose: () -> IMEOutput,
val reset: () -> Unit, val reset: () -> Unit,
val composing: () -> Boolean val composing: () -> Boolean

View File

@@ -19,6 +19,10 @@ class IMEProviderDelegate(val ime: IME) {
class IMEDictionary(private val filename: String) { class IMEDictionary(private val filename: String) {
companion object {
const val CAND_DELIM = '\u001E'
}
private val candidates = HashMap<String, String>(16384) private val candidates = HashMap<String, String>(16384)
private val keys = SortedArrayList<String>(16384) // keys on the .han file are absofreakinlutely not sorted private val keys = SortedArrayList<String>(16384) // keys on the .han file are absofreakinlutely not sorted
@@ -30,7 +34,7 @@ class IMEDictionary(private val filename: String) {
if (it.contains(',')) { if (it.contains(',')) {
val (key, value) = it.split(',') val (key, value) = it.split(',')
if (candidates.containsKey(key)) { if (candidates.containsKey(key)) {
candidates[key] += ",$value" candidates[key] += "$CAND_DELIM$value"
} }
else { else {
candidates[key] = value candidates[key] = value
@@ -80,8 +84,8 @@ class IMEDictionary(private val filename: String) {
val keysym = allRelevantKeys[index] val keysym = allRelevantKeys[index]
if (!keysym.startsWith(key)) break if (!keysym.startsWith(key)) break
val outstr = ",${candidates[keysym]}" val outstr = "$CAND_DELIM${candidates[keysym]}"
outsize += outstr.count { it == ',' } outsize += outstr.count { it == CAND_DELIM }
out.append(outstr) out.append(outstr)
index += 1 index += 1