From a2935ff3ff27ac67415a7d732bb7a44ff81e2644 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 14 Nov 2021 15:04:00 +0900 Subject: [PATCH] russian phonetic keyboard and its supporting components --- assets/keylayout/ru_ru_jcuken.ime | 2 +- assets/keylayout/ru_ru_phonetique.ime | 60 +++++++++++++++++++ .../torvald/terrarum/gamecontroller/IME.kt | 35 +++++++---- .../ui/UIKeyboardInputConfig.kt | 27 ++++++++- 4 files changed, 110 insertions(+), 14 deletions(-) create mode 100644 assets/keylayout/ru_ru_phonetique.ime diff --git a/assets/keylayout/ru_ru_jcuken.ime b/assets/keylayout/ru_ru_jcuken.ime index c81567110..b757df9ec 100644 --- a/assets/keylayout/ru_ru_jcuken.ime +++ b/assets/keylayout/ru_ru_jcuken.ime @@ -260,7 +260,7 @@ let reset = () => { } 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", +return Object.freeze({"n":"Рус. ЙЦУКЕН (MS)","v":"none","c":"CuriousTo\uA75Bvald","m":"rewrite", "t":states.keylayouts.map(it => [it[0],it[1]]), // return: [displayed output, composed output] "accept":(headkey,shiftin,altgrin)=>{ diff --git a/assets/keylayout/ru_ru_phonetique.ime b/assets/keylayout/ru_ru_phonetique.ime new file mode 100644 index 000000000..3ecf47124 --- /dev/null +++ b/assets/keylayout/ru_ru_phonetique.ime @@ -0,0 +1,60 @@ +let states = {"layouttable":{ +"[":"ю", +"]":"щ", +"{":"Ю", +"}":"Щ", +"$":'"', +"%":":", +"`":"ё", +"~":"Ё", +"\\":"э", +"|":"Э", +"=":"ъ", +"+":"Ъ", +"'":"ж", +'"':"Ж", +";":"ь", +":":"Ь", +" ":" " +}, +"code":0} // practically unused as long as there are no diacritics on the keyboard +;(function(){ + let s = "АБЦДЕФГЧИЙКЛМНОПЯРСТУВШХЫЗ" + for (let i=0;i { + states.code = 0 +} +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", +"tf":states.layouttable, +// return: [displayed output, composed output] +"accept":(headkey,shiftin,altgrin,lowlayerkey)=>{ + let layer = 1*shiftin// + 2*altgrin + states.code = 1 + + let s = states.layouttable[lowlayerkey] || lowlayerkey + + if (isDiacritics(s)) { + return ['1', ''] + } + else { + + return ['0', s] + } +}, +"backspace":()=>{ + reset() + return '' +}, +"end":()=>{ + reset() + return '' +}, +"reset":()=>{ reset() }, +"composing":()=>(states.code!=0) +}) \ No newline at end of file diff --git a/src/net/torvald/terrarum/gamecontroller/IME.kt b/src/net/torvald/terrarum/gamecontroller/IME.kt index 812dd8ee5..2b0065449 100644 --- a/src/net/torvald/terrarum/gamecontroller/IME.kt +++ b/src/net/torvald/terrarum/gamecontroller/IME.kt @@ -6,6 +6,7 @@ import java.io.File typealias IMECandidates = List typealias IMEOutput = String typealias Keysyms = Array> +typealias Keysymfun = Map data class TerrarumKeyLayout( @@ -33,7 +34,8 @@ data class TerrarumIMEConf( val name: String, val copying: String, val candidates: TerrarumIMEViewCount, - val symbols: Keysyms, + val symbols: Keysyms?, + val symbolsfun: Keysymfun?, val mode: TerrarumIMEMode ) @@ -171,25 +173,38 @@ object IME { val candidatesCount = jsval.getMember("v").asString().toViewCount() val copying = jsval.getMember("c").asString() val keysyms = Array(256) { Array(4) { null } } + var keysymtable: Keysymfun? = null val mode = jsval.getMember("m").asString().toIMEMode() - for (keycode in 0L until 256L) { - val a = jsval.getMember("t").getArrayElement(keycode) - if (!a.isNull) { - for (layer in 0L until 4L) { - if (a.arraySize > layer) { - val b = a.getArrayElement(layer) - if (!b.isNull) { - keysyms[keycode.toInt()][layer.toInt()] = b.asString() + // keylayout is static (not affected by the Low Layout) + if (jsval.hasMember("t")) { + for (keycode in 0L until 256L) { + val a = jsval.getMember("t").getArrayElement(keycode) + if (!a.isNull) { + for (layer in 0L until 4L) { + if (a.arraySize > layer) { + val b = a.getArrayElement(layer) + if (!b.isNull) { + keysyms[keycode.toInt()][layer.toInt()] = b.asString() + } } } } } } + // keylayout is dynamic (does affected by the Low Layout) + else if (jsval.hasMember("tf")) { + keysymtable = HashMap() + val tf = jsval.getMember("tf") + tf.memberKeys.forEach { + println("[IME] keeb $name; tf[$it] = ?") + keysymtable[it] = tf.getMember(it).asString() + } + } return TerrarumIME( name, - TerrarumIMEConf(name, copying, candidatesCount, keysyms, mode), + TerrarumIMEConf(name, copying, candidatesCount, if (keysymtable == null) keysyms else null, if (keysymtable == null) null else keysymtable, mode), { headkey, shifted, alted, lowLayerKeysym -> val a = jsval.invokeMember("accept", headkey, shifted, alted, lowLayerKeysym) a.getArrayElement(0).asString().toCanditates() to a.getArrayElement(1).asString() diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIKeyboardInputConfig.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIKeyboardInputConfig.kt index 3a8b91a30..32a9a8250 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIKeyboardInputConfig.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIKeyboardInputConfig.kt @@ -320,15 +320,36 @@ private class UIItemInputKeycap( else if (key == Input.Keys.ENTER) batch.draw(labels.get(17,3), (posX + (width - 20) / 2).toFloat(), posY + 4f) else if (key != null) { - val keysym0 = if (KeyToggler.isOn(App.getConfigInt("control_key_toggleime"))) - parent.highlayer?.config?.symbols?.get(key) ?: parent.lowlayer.symbols[key] + val keysymsLow = parent.lowlayer.symbols[key] + val keysymLow = + (if (parent.shiftin && parent.altgrin && keysymsLow[3]?.isNotEmpty() == true) keysymsLow[3] + else if (parent.altgrin && keysymsLow[2]?.isNotEmpty() == true) keysymsLow[2] + else if (parent.shiftin && keysymsLow[1]?.isNotEmpty() == true) keysymsLow[1] + else keysymsLow[0]) ?: "" + + val keysym0: Array = if (KeyToggler.isOn(App.getConfigInt("control_key_toggleime"))) { + if (parent.highlayer == null) arrayOf(keysymLow,keysymLow,keysymLow,keysymLow) + else { + val keysyms = parent.highlayer!!.config.symbols + val keysymfun = parent.highlayer!!.config.symbolsfun + + if (keysymfun != null) { + val ksym = keysymfun[keysymLow] + arrayOf(ksym,ksym,ksym,ksym) + } + else { + keysyms!!.get(key) + } + } + } else parent.lowlayer.symbols[key] + var keysym = (if (parent.shiftin && parent.altgrin && keysym0[3]?.isNotEmpty() == true) keysym0[3] else if (parent.altgrin && keysym0[2]?.isNotEmpty() == true) keysym0[2] else if (parent.shiftin && keysym0[1]?.isNotEmpty() == true) keysym0[1] - else keysym0[0]) ?: "" + else keysym0[0]) ?: keysymLow if (isDiacritic(keysym[0].code)) keysym = "ɔ$keysym"