diff --git a/assets/keylayout/cj5-sc.han b/assets/keylayout/cj5-sc.han index f977422eb..12d2a2e15 100644 --- a/assets/keylayout/cj5-sc.han +++ b/assets/keylayout/cj5-sc.han @@ -8419,428 +8419,6 @@ xxi,丶 xr,。 xxr,〇 xxxxx,〇 -za,‘ -za,’ -za,“ -za,” -za,〔 -za,〕 -za,〈 -za,〉 -za,《 -za,》 -za,… -za,「 -za,」 -za,『 -za,』 -za,〖 -za,〗 -za,【 -za,】 -za,№ -za,☆ -za,★ -za,○ -za,● -za,◎ -za,◇ -za,◆ -za,□ -za,■ -za,△ -za,▲ -za,※ -za,→ -za,← -za,↑ -za,↓ -za,〓 -zb,ⅰ -zb,ⅱ -zb,ⅲ -zb,ⅳ -zb,ⅴ -zb,ⅵ -zb,ⅶ -zb,ⅷ -zb,ⅸ -zb,ⅹ -zba,⒈ -zba,⒉ -zba,⒊ -zba,⒋ -zba,⒌ -zba,⒍ -zba,⒎ -zba,⒏ -zba,⒐ -zba,⒑ -zba,⒒ -zba,⒓ -zba,⒔ -zba,⒕ -zba,⒖ -zba,⒗ -zba,⒘ -zba,⒙ -zba,⒚ -zba,⒛ -zbb,⑴ -zbb,⑵ -zbb,⑶ -zbb,⑷ -zbb,⑸ -zbb,⑹ -zbb,⑺ -zbb,⑻ -zbb,⑼ -zbb,⑽ -zbb,⑾ -zbb,⑿ -zbb,⒀ -zbb,⒁ -zbb,⒂ -zbb,⒃ -zbb,⒄ -zbb,⒅ -zbb,⒆ -zbb,⒇ -zbc,① -zbc,② -zbc,③ -zbc,④ -zbc,⑤ -zbc,⑥ -zbc,⑦ -zbc,⑧ -zbc,⑨ -zbc,⑩ -zbd,㈠ -zbd,㈡ -zbd,㈢ -zbd,㈣ -zbd,㈤ -zbd,㈥ -zbd,㈦ -zbd,㈧ -zbd,㈨ -zbd,㈩ -zbe,Ⅰ -zbe,Ⅱ -zbe,Ⅲ -zbe,Ⅳ -zbe,Ⅴ -zbe,Ⅵ -zbe,Ⅶ -zbe,Ⅷ -zbe,Ⅸ -zbe,Ⅹ -zbe,Ⅺ -zbe,Ⅻ -zc,ぁ -zc,あ -zc,ぃ -zc,い -zc,ぅ -zc,う -zc,ぇ -zc,え -zc,ぉ -zc,お -zc,か -zc,が -zc,き -zc,ぎ -zc,く -zc,ぐ -zc,け -zc,げ -zc,こ -zc,ご -zc,さ -zc,ざ -zc,し -zc,じ -zc,す -zc,ず -zc,せ -zc,ぜ -zc,そ -zc,ぞ -zc,た -zc,だ -zc,ち -zc,ぢ -zc,っ -zc,つ -zc,づ -zc,て -zc,で -zc,と -zc,ど -zc,な -zc,に -zc,ぬ -zc,ね -zc,の -zc,は -zc,ば -zc,ぱ -zc,ひ -zc,び -zc,ぴ -zc,ふ -zc,ぶ -zc,ぷ -zc,へ -zc,べ -zc,ぺ -zc,ほ -zc,ぼ -zc,ぽ -zc,ま -zc,み -zc,む -zc,め -zc,も -zc,ゃ -zc,や -zc,ゅ -zc,ゆ -zc,ょ -zc,よ -zc,ら -zc,り -zc,る -zc,れ -zc,ろ -zc,ゎ -zc,わ -zc,ゐ -zc,ゑ -zc,を -zc,ん -zd,ァ -zd,ア -zd,ィ -zd,イ -zd,ゥ -zd,ウ -zd,ェ -zd,エ -zd,ォ -zd,オ -zd,カ -zd,ガ -zd,キ -zd,ギ -zd,ク -zd,グ -zd,ケ -zd,ゲ -zd,コ -zd,ゴ -zd,サ -zd,ザ -zd,シ -zd,ジ -zd,ス -zd,ズ -zd,セ -zd,ゼ -zd,ソ -zd,ゾ -zd,タ -zd,ダ -zd,チ -zd,ヂ -zd,ッ -zd,ツ -zd,ヅ -zd,テ -zd,デ -zd,ト -zd,ド -zd,ナ -zd,ニ -zd,ヌ -zd,ネ -zd,ノ -zd,ハ -zd,バ -zd,パ -zd,ヒ -zd,ビ -zd,ピ -zd,フ -zd,ブ -zd,プ -zd,ヘ -zd,ベ -zd,ペ -zd,ホ -zd,ボ -zd,ポ -zd,マ -zd,ミ -zd,ム -zd,メ -zd,モ -zd,ャ -zd,ヤ -zd,ュ -zd,ユ -zd,ョ -zd,ヨ -zd,ラ -zd,リ -zd,ル -zd,レ -zd,ロ -zd,ヮ -zd,ワ -zd,ヰ -zd,ヱ -zd,ヲ -zd,ン -zd,ヴ -zd,ヵ -zd,ヶ -zf,Α -zf,Β -zf,Γ -zf,Δ -zf,Ε -zf,Ζ -zf,Η -zf,Θ -zf,Ι -zf,Κ -zf,Λ -zf,Μ -zf,Ν -zf,Ξ -zf,Ο -zf,Π -zf,Ρ -zf,Σ -zf,Τ -zf,Υ -zf,Φ -zf,Χ -zf,Ψ -zf,Ω -zf,α -zf,β -zf,γ -zf,δ -zf,ε -zf,ζ -zf,η -zf,θ -zf,ι -zf,κ -zf,λ -zf,μ -zf,ν -zf,ξ -zf,ο -zf,π -zf,ρ -zf,σ -zf,τ -zf,υ -zf,φ -zf,χ -zf,ψ -zf,ω -zf,︵ -zf,︶ -zf,︹ -zf,︺ -zf,︿ -zf,﹀ -zf,︽ -zf,︾ -zf,﹁ -zf,﹂ -zf,﹃ -zf,﹄ -zf,︻ -zf,︼ -zf,︷ -zf,︸ -zf,︱ -zf, -zf,︳ -zf,︴ -zg,А -zg,Б -zg,В -zg,Г -zg,Д -zg,Е -zg,Ё -zg,Ж -zg,З -zg,И -zg,Й -zg,К -zg,Л -zg,М -zg,Н -zg,О -zg,П -zg,Р -zg,С -zg,Т -zg,У -zg,Ф -zg,Х -zg,Ц -zg,Ч -zg,Ш -zg,Щ -zg,Ъ -zg,Ы -zg,Ь -zg,Э -zg,Ю -zg,Я -zg,а -zg,б -zg,в -zg,г -zg,д -zg,е -zg,ё -zg,ж -zg,з -zg,и -zg,й -zg,к -zg,л -zg,м -zg,н -zg,о -zg,п -zg,р -zg,с -zg,т -zg,у -zg,ф -zg,х -zg,ц -zg,ч -zg,ш -zg,щ -zg,ъ -zg,ы -zg,ь -zg,э -zg,ю -zg,я zxaa,  zxab,, zxac,、 diff --git a/assets/keylayout/zh_cn_cangjie5.ime b/assets/keylayout/zh_cn_cangjie5.ime index 9e61faed0..2d63c67b0 100644 --- a/assets/keylayout/zh_cn_cangjie5.ime +++ b/assets/keylayout/zh_cn_cangjie5.ime @@ -264,7 +264,7 @@ let reset = () => { states.candidates = "" } let getCandidatesUsingBuf = () => { - states.candidates = states.dict.get(states.buf) // comma-separated values + states.candidates = states.dict.getCangjie(states.buf) // comma-separated values states.code = 1 + (states.candidates.length == 0) // console.log(`cangjie in, buf: ${states.buf}, candidates: ${states.candidates}`) return `${states.buf},${states.candidates}` diff --git a/assets/keylayout/zh_tw_cangjie5.ime b/assets/keylayout/zh_tw_cangjie5.ime index 1be48e3b6..67659eb58 100644 --- a/assets/keylayout/zh_tw_cangjie5.ime +++ b/assets/keylayout/zh_tw_cangjie5.ime @@ -264,7 +264,7 @@ let reset = () => { states.candidates = "" } let getCandidatesUsingBuf = () => { - states.candidates = states.dict.get(states.buf) // comma-separated values + states.candidates = states.dict.getCangjie(states.buf) // comma-separated values states.code = 1 + (states.candidates.length == 0) // console.log(`cangjie in, buf: ${states.buf}, candidates: ${states.candidates}`) return `${states.buf},${states.candidates}` diff --git a/src/net/torvald/terrarum/gamecontroller/IME.kt b/src/net/torvald/terrarum/gamecontroller/IME.kt index bcc89c8be..f2a7d10cf 100644 --- a/src/net/torvald/terrarum/gamecontroller/IME.kt +++ b/src/net/torvald/terrarum/gamecontroller/IME.kt @@ -47,7 +47,7 @@ object IME { private val highLayers = HashMap() private val context = org.graalvm.polyglot.Context.newBuilder("js") - .allowHostAccess(org.graalvm.polyglot.HostAccess.ALL) + .allowHostAccess(org.graalvm.polyglot.HostAccess.EXPLICIT) // .allowHostClassLookup { it.equals("net.torvald.terrarum.gamecontroller.IMEProviderDelegate") } .allowHostClassLookup { false } .allowIO(false) diff --git a/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt b/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt index 8199bf9b2..9e320a132 100644 --- a/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt +++ b/src/net/torvald/terrarum/gamecontroller/IMEProviderDelegate.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.gamecontroller import net.torvald.terrarum.App.printdbg import net.torvald.util.SortedArrayList +import org.graalvm.polyglot.HostAccess import java.io.File import java.io.FileReader @@ -9,6 +10,7 @@ class IMEProviderDelegate(val ime: IME) { private val dictionaries = HashMap() + @HostAccess.Export fun requestDictionary(filename: String): IMEDictionary { return dictionaries.getOrPut(filename) { IMEDictionary(filename) } } @@ -18,7 +20,7 @@ class IMEProviderDelegate(val ime: IME) { class IMEDictionary(private val filename: String) { private val candidates = HashMap(16384) - private val keys = SortedArrayList(16384) + private val keys = SortedArrayList(16384) // keys on the .han file are absofreakinlutely not sorted private var dictLoaded = false @@ -44,15 +46,36 @@ class IMEDictionary(private val filename: String) { loadDict() // loading the dict doesn't take too long so no need to do it lazily } - operator fun get(key: String): String { + @HostAccess.Export + fun getCangjie(key: String): String { //if (!dictLoaded) loadDict() val out = StringBuilder() var outsize = 0 var index = keys.searchForInterval(key) { it }.second - while (outsize < 10) { - val keysym = keys[index] + val allRelevantKeys = ArrayList() // oh, oha, ohag, ohbt, ohby, ... + for (i in 0 until 10) { + if (index + 1 >= keys.size) break + val keysym = keys[index + i] + if (!keysym.startsWith(key)) break + allRelevantKeys.add(keysym) + } + +// printdbg(this, "lookup key: $key") + + // sort allRelevantKeys so that short sequences come first + // e.g. oh, oha, ohg, ohj, ohn, ohq, ohag, ohbt, ... + allRelevantKeys.sortWith { it, other -> + if (it.length == other.length) it.compareTo(other) + else it.length.compareTo(other.length) + } + +// printdbg(this, "predictions: (${allRelevantKeys.size}) ${allRelevantKeys.joinToString()}") + + index = 0 // now this is an index for the allRelevantKeys + while (outsize < 10 && index < allRelevantKeys.size) { + val keysym = allRelevantKeys[index] if (!keysym.startsWith(key)) break val outstr = ",${candidates[keysym]}" @@ -64,5 +87,5 @@ class IMEDictionary(private val filename: String) { return if (out.isNotEmpty()) out.substring(1) else "" } - + } \ No newline at end of file