mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-09 18:14:06 +09:00
russian phonetic keyboard and its supporting components
This commit is contained in:
@@ -260,7 +260,7 @@ let reset = () => {
|
|||||||
}
|
}
|
||||||
let inRange = (s,a,b) => (a <= s && s <= b)
|
let inRange = (s,a,b) => (a <= s && s <= b)
|
||||||
let isDiacritics = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x0300, 0x036F)
|
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]]),
|
"t":states.keylayouts.map(it => [it[0],it[1]]),
|
||||||
// return: [displayed output, composed output]
|
// return: [displayed output, composed output]
|
||||||
"accept":(headkey,shiftin,altgrin)=>{
|
"accept":(headkey,shiftin,altgrin)=>{
|
||||||
|
|||||||
60
assets/keylayout/ru_ru_phonetique.ime
Normal file
60
assets/keylayout/ru_ru_phonetique.ime
Normal file
@@ -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<s.length;i++) {
|
||||||
|
states.layouttable[String.fromCodePoint(i+65)] = String.fromCodePoint(s.codePointAt(i))
|
||||||
|
states.layouttable[String.fromCodePoint(i+97)] = String.fromCodePoint(s.codePointAt(i)+32)
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
let reset = () => {
|
||||||
|
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)
|
||||||
|
})
|
||||||
@@ -6,6 +6,7 @@ import java.io.File
|
|||||||
typealias IMECandidates = List<String>
|
typealias IMECandidates = List<String>
|
||||||
typealias IMEOutput = String
|
typealias IMEOutput = String
|
||||||
typealias Keysyms = Array<Array<String?>>
|
typealias Keysyms = Array<Array<String?>>
|
||||||
|
typealias Keysymfun = Map<String, String>
|
||||||
|
|
||||||
|
|
||||||
data class TerrarumKeyLayout(
|
data class TerrarumKeyLayout(
|
||||||
@@ -33,7 +34,8 @@ data class TerrarumIMEConf(
|
|||||||
val name: String,
|
val name: String,
|
||||||
val copying: String,
|
val copying: String,
|
||||||
val candidates: TerrarumIMEViewCount,
|
val candidates: TerrarumIMEViewCount,
|
||||||
val symbols: Keysyms,
|
val symbols: Keysyms?,
|
||||||
|
val symbolsfun: Keysymfun?,
|
||||||
val mode: TerrarumIMEMode
|
val mode: TerrarumIMEMode
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -171,25 +173,38 @@ object IME {
|
|||||||
val candidatesCount = jsval.getMember("v").asString().toViewCount()
|
val candidatesCount = jsval.getMember("v").asString().toViewCount()
|
||||||
val copying = jsval.getMember("c").asString()
|
val copying = jsval.getMember("c").asString()
|
||||||
val keysyms = Array(256) { Array<String?>(4) { null } }
|
val keysyms = Array(256) { Array<String?>(4) { null } }
|
||||||
|
var keysymtable: Keysymfun? = null
|
||||||
val mode = jsval.getMember("m").asString().toIMEMode()
|
val mode = jsval.getMember("m").asString().toIMEMode()
|
||||||
|
|
||||||
for (keycode in 0L until 256L) {
|
// keylayout is static (not affected by the Low Layout)
|
||||||
val a = jsval.getMember("t").getArrayElement(keycode)
|
if (jsval.hasMember("t")) {
|
||||||
if (!a.isNull) {
|
for (keycode in 0L until 256L) {
|
||||||
for (layer in 0L until 4L) {
|
val a = jsval.getMember("t").getArrayElement(keycode)
|
||||||
if (a.arraySize > layer) {
|
if (!a.isNull) {
|
||||||
val b = a.getArrayElement(layer)
|
for (layer in 0L until 4L) {
|
||||||
if (!b.isNull) {
|
if (a.arraySize > layer) {
|
||||||
keysyms[keycode.toInt()][layer.toInt()] = b.asString()
|
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(
|
return TerrarumIME(
|
||||||
name,
|
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 ->
|
{ headkey, shifted, alted, lowLayerKeysym ->
|
||||||
val a = jsval.invokeMember("accept", headkey, shifted, alted, lowLayerKeysym)
|
val a = jsval.invokeMember("accept", headkey, shifted, alted, lowLayerKeysym)
|
||||||
a.getArrayElement(0).asString().toCanditates() to a.getArrayElement(1).asString()
|
a.getArrayElement(0).asString().toCanditates() to a.getArrayElement(1).asString()
|
||||||
|
|||||||
@@ -320,15 +320,36 @@ private class UIItemInputKeycap(
|
|||||||
else if (key == Input.Keys.ENTER)
|
else if (key == Input.Keys.ENTER)
|
||||||
batch.draw(labels.get(17,3), (posX + (width - 20) / 2).toFloat(), posY + 4f)
|
batch.draw(labels.get(17,3), (posX + (width - 20) / 2).toFloat(), posY + 4f)
|
||||||
else if (key != null) {
|
else if (key != null) {
|
||||||
val keysym0 = if (KeyToggler.isOn(App.getConfigInt("control_key_toggleime")))
|
val keysymsLow = parent.lowlayer.symbols[key]
|
||||||
parent.highlayer?.config?.symbols?.get(key) ?: 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<String?> = 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
|
else
|
||||||
parent.lowlayer.symbols[key]
|
parent.lowlayer.symbols[key]
|
||||||
|
|
||||||
var keysym =
|
var keysym =
|
||||||
(if (parent.shiftin && parent.altgrin && keysym0[3]?.isNotEmpty() == true) keysym0[3]
|
(if (parent.shiftin && parent.altgrin && keysym0[3]?.isNotEmpty() == true) keysym0[3]
|
||||||
else if (parent.altgrin && keysym0[2]?.isNotEmpty() == true) keysym0[2]
|
else if (parent.altgrin && keysym0[2]?.isNotEmpty() == true) keysym0[2]
|
||||||
else if (parent.shiftin && keysym0[1]?.isNotEmpty() == true) keysym0[1]
|
else if (parent.shiftin && keysym0[1]?.isNotEmpty() == true) keysym0[1]
|
||||||
else keysym0[0]) ?: ""
|
else keysym0[0]) ?: keysymLow
|
||||||
if (isDiacritic(keysym[0].code))
|
if (isDiacritic(keysym[0].code))
|
||||||
keysym = "ɔ$keysym"
|
keysym = "ɔ$keysym"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user