From 150504adbcb13f5ffdbd33c1a50676d112fc569f Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 14 Nov 2021 23:20:04 +0900 Subject: [PATCH] russian keyboard is now multilingual cyrillic keyboard --- .../terrarum-sans-bitmap/cyrilic_variable.tga | 2 +- assets/keylayout/ru_ru_jcuken.ime | 238 +++++++++++++----- 2 files changed, 183 insertions(+), 57 deletions(-) diff --git a/assets/graphics/fonts/terrarum-sans-bitmap/cyrilic_variable.tga b/assets/graphics/fonts/terrarum-sans-bitmap/cyrilic_variable.tga index 14a32823c..cee5c4c5a 100755 --- a/assets/graphics/fonts/terrarum-sans-bitmap/cyrilic_variable.tga +++ b/assets/graphics/fonts/terrarum-sans-bitmap/cyrilic_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ca37cf5cbbde61e0d4cd13d2e6695804f610d87af8149c50b65bf8302cbacd9 +oid sha256:75761fa27dd581ac8b76ec8628d66c9c468762aa686558db45c2c42f1575b821 size 389138 diff --git a/assets/keylayout/ru_ru_jcuken.ime b/assets/keylayout/ru_ru_jcuken.ime index b757df9ec..f39dae744 100644 --- a/assets/keylayout/ru_ru_jcuken.ime +++ b/assets/keylayout/ru_ru_jcuken.ime @@ -4,16 +4,16 @@ let states = {"keylayouts":[[""],[undefined], [undefined], [undefined], [undefined], -["0",")"], -["1","!"], -["2",'"'], -["3","¤"], -["4",";"], -["5","%"], -["6",":"], -["7","?"], -["8","₽"], -["9","("], +["0",")","]","}"], +["1","!","÷","≈"], +["2",'"',"¤","∞"], +["3","¤","§","₴"], +["4",";","$","€"], +["5","%","°",""], +["6",":","<","≤"], +["7","?",">","≥"], +["8","₽","•","×"], +["9","(","[","{"], ["*"], ["#"], [undefined], @@ -26,34 +26,34 @@ let states = {"keylayouts":[[""],[undefined], [undefined], [undefined], [undefined], -["ф","Ф"], -["и","И"], -["с","С"], -["в","В"], -["у","У"], -["а","А"], -["п","П"], -["р","Р"], -["ш","Ш"], -["о","О"], -["л","Л"], -["д","Д"], -["ь","Ь"], -["т","Т"], -["щ","Щ"], -["з","З"], -["й","Й"], -["к","К"], -["ы","Ы"], -["е","Е"], -["г","Г"], -["м","М"], -["ц","Ц"], -["ч","Ч"], -["н","Н"], -["я","Я"], -["б","Б"], -["ю","Ю"], +["ф","Ф","ҩ","Ҩ"], +["и","И","\u0335","\u0321"], // strikethru, hook below +["с","С","ҽ","Ҽ"], +["в","В","ү","Ү"], +["у","У","ў","Ў"], +["а","А","ҟ","Ҟ"], +["п","П","ҡ","Ҡ"], +["р","Р","ғ","Ғ"], +["ш","Ш","ѓ","Ѓ"], +["о","О","ө","Ө"], +["л","Л","љ","Љ"], +["д","Д","ђ","Ђ"], +["ь","Ь","ҧ","Ҧ"], +["т","Т","ћ","Ћ"], +["щ","Щ","ӡ","Ӡ"], +["з","З","ѕ","Ѕ"], +["й","Й","ј","Ј"], +["к","К","ќ","Ќ"], +["ы","Ы","і","І"], +["е","Е","ҝ","Ҝ"], +["г","Г","ґ","Ґ"], +["м","М","\u0329","\u0301"], // "descender", acute +["ц","Ц","ҵ","Ҵ"], +["ч","Ч","һ","Һ"], +["н","Н","њ","Њ"], +["я","Я","ә","Ә"], +["б","Б","«","„"], +["ю","Ю","»","“"], [undefined], [undefined], [undefined], @@ -65,15 +65,15 @@ let states = {"keylayouts":[[""],[undefined], [undefined], ["\n"], ["\x08"], -["ё","Ё"], -["-","_"], -["=","+"], -["х","Х"], -["ъ","Ъ"], -["\\","/"], -["ж","Ж"], -["э",'Э'], -[".",","], +["ё","Ё","ӏ","Ӏ"], +["-","_","—","–"], +["=","+","≠","±"], +["х","Х","ҳ","Ҳ"], +["ъ","Ъ","ї","Ї"], +["/","\\","\u0308","\u0306"], // diaresis, breve +["ж","Ж","џ","Џ"], +["э",'Э',"є","Є"], +[".",",","/","…"], [undefined], [undefined], [undefined], @@ -254,27 +254,153 @@ let states = {"keylayouts":[[""],[undefined], [undefined], [undefined] ], -"code":0} // practically unused as long as there are no diacritics on the keyboard +"code":""} // practically unused as long as there are no diacritics on the keyboard let reset = () => { states.code = 0 } +let diacriticsAcute = { +"Е":"Ѐ", +"Г":"Ѓ", +"К":"Ќ", +"И":"Ѝ", + +"е":"ѐ", +"г":"ѓ", +"к":"ќ", +"и":"ѝ" +} +let diacriticsDescender = { +"Ж":"Җ", +"З":"Ҙ", +"К":"Қ", +"Н":"Ң", +"С":"Ҫ", +"Т":"Ҭ", +"Х":"Ҳ", +"Ч":"Ҷ", +"Ҽ":"Ҿ", +"Г":"Ӷ", +"Ғ":"Ӻ", +"П":"Ԥ", +"Һ":"Ԧ", + +"ж":"җ", +"з":"ҙ", +"к":"қ", +"н":"ң", +"с":"ҫ", +"т":"ҭ", +"х":"ҳ", +"ч":"ҷ", +"ҽ":"ҿ", +"г":"ӷ", +"ғ":"ӻ", +"п":"ԥ", +"һ":"ԧ" +} +let diacriticsStrikethru = { +"Г":"Ғ", +"К":"Ҟ", +"Ү":"Ұ", +"Х":"Ӿ", + +"г":"ғ", +"к":"ҟ", +"ү":"ұ", +"х":"ӿ" +} +let diacriticsHookBelow = { +"Г":"Ҕ", +"П":"Ҧ", +"К":"Ӄ", +"Н":"Ӈ", +"Ғ":"Ӻ", +"Х":"Ӽ", + +"г":"ҕ", +"п":"ҧ", +"к":"ӄ", +"н":"ӈ", +"ғ":"ӻ", +"х":"ӽ" +} +let diacriticsDiaresis = { +"А":"Ӓ", +"Ә":"Ӛ", +"Ж":"Ӝ", +"З":"Ӟ", +"И":"Ӥ", +"О":"Ӧ", +"Ө":"Ӫ", +"Э":"Ӭ", +"У":"Ӱ", +"Ч":"Ӵ", +"Ы":"Ӹ", + +"а":"ӓ", +"ә":"ӛ", +"ж":"ӝ", +"з":"ӟ", +"и":"ӥ", +"о":"ӧ", +"ө":"ӫ", +"э":"ӭ", +"у":"ӱ", +"ч":"ӵ", +"ы":"ӹ" +} +let diacriticsBreve = { +"Ж":"Ӂ", +"А":"Ӑ", +"Е":"Ӗ", +"И":"Ӣ", +"У":"Ӯ", + +"ж":"ӂ", +"а":"ӑ", +"е":"ӗ", +"и":"ӣ", +"у":"ӯ" +} +let diacriticsMapping = { +"\u0329":diacriticsDescender, +"\u0301":diacriticsAcute, +"\u0308":diacriticsDiaresis, +"\u0306":diacriticsBreve, +"\u0335":diacriticsStrikethru, +"\u0321":diacriticsHookBelow +} let inRange = (s,a,b) => (a <= s && s <= b) let isDiacritics = (s) => s !== undefined && inRange(s.charCodeAt(0), 0x0300, 0x036F) -return Object.freeze({"n":"Рус. ЙЦУКЕН (MS)","v":"none","c":"CuriousTo\uA75Bvald","m":"rewrite", -"t":states.keylayouts.map(it => [it[0],it[1]]), +return Object.freeze({"n":"Мног. ЙЦУКЕН","v":"none","c":"CuriousTo\uA75Bvald","m":"rewrite", +"t":states.keylayouts, // return: [displayed output, composed output] "accept":(headkey,shiftin,altgrin)=>{ - let layer = 1*shiftin// + 2*altgrin - states.code = 1 + let layer = 1*shiftin + 2*altgrin let s = states.keylayouts[headkey][layer] + // typing seq for diacritics: diacritics THEN a character if (isDiacritics(s)) { - return ['1', ''] + states.code = s + return ['0', ' '+s] // todo: insert diacritics placeholder char } else { - reset() - return ['0', s] + // has diacritecs + if (states.code != '') { + if (diacriticsMapping[states.code] == undefined) { + reset() + return ['0',''] + } + let composed = diacriticsMapping[states.code][s] + reset() + return ['2', composed || s] + } + // nope! + else { + reset() + return ['0', s] + } } }, "backspace":()=>{ @@ -286,5 +412,5 @@ return Object.freeze({"n":"Рус. ЙЦУКЕН (MS)","v":"none","c":"CuriousTo\ return '' }, "reset":()=>{ reset() }, -"composing":()=>(states.code!=0) +"composing":()=>(states.code!='') }) \ No newline at end of file