diff --git a/app/src/main/assets/ime/config.json b/app/src/main/assets/ime/config.json index 425b3999..951c790d 100644 --- a/app/src/main/assets/ime/config.json +++ b/app/src/main/assets/ime/config.json @@ -26,6 +26,8 @@ "canadian_french": "Canadian French (QWERTY)", "greek": "Ελληνικά", "hebrew": "עברית", + "serbian_latin": "Serbian (QWERTZ)", + "serbian_cyrillic": "Serbian (ЉЊЕРТЗ)", "kurdish": "کوردی" }, "defaultSubtypes": [ @@ -208,6 +210,11 @@ "id": 2001, "languageTag": "ckb", "preferredLayout": "kurdish" + }, + { + "id": 2101, + "languageTag": "sr-RS", + "preferredLayout": "serbian_cyrillic" } ] } diff --git a/app/src/main/assets/ime/text/characters/extended_popups/sr.json b/app/src/main/assets/ime/text/characters/extended_popups/sr.json new file mode 100644 index 00000000..a1213530 --- /dev/null +++ b/app/src/main/assets/ime/text/characters/extended_popups/sr.json @@ -0,0 +1,61 @@ +{ + "type": "characters/extended_popups", + "name": "sr", + "authors": [ "hedidnothingwrong", "GrbavaCigla" ], + "mapping": { + "all": { + "c": { + "relevant": [ + { "code": 269, "label": "č" }, + { "code": 263, "label": "ć" } + ] + }, + "d": { + "relevant": [ + { "code": 273, "label": "đ" } + ] + }, + "s": { + "relevant": [ + { "code": 353, "label": "š" } + ] + }, + "z": { + "relevant": [ + { "code": 382, "label": "ž" } + ] + }, + "~right": { + "main": { "code": 44, "label": "," }, + "relevant": [ + { "code": 38, "label": "&" }, + { "code": 37, "label": "%" }, + { "code": 43, "label": "+" }, + { "code": 34, "label": "\"" }, + { "code": 45, "label": "-" }, + { "code": 58, "label": ":" }, + { "code": 39, "label": "'" }, + { "code": 64, "label": "@" }, + { "code": 59, "label": ";" }, + { "code": 47, "label": "/" }, + { "code": 40, "label": "(" }, + { "code": 41, "label": ")" }, + { "code": 35, "label": "#" }, + { "code": 33, "label": "!" }, + { "code": 63, "label": "?" } + ] + } + }, + "uri": { + "~right": { + "main": { "code": -255, "label": ".com" }, + "relevant": [ + { "code": -255, "label": ".eu" }, + { "code": -255, "label": ".rs" }, + { "code": -255, "label": ".org" }, + { "code": -255, "label": ".net" } + ] + } + } + } +} diff --git a/app/src/main/assets/ime/text/characters/serbian_cyrillic.json b/app/src/main/assets/ime/text/characters/serbian_cyrillic.json new file mode 100644 index 00000000..47c01430 --- /dev/null +++ b/app/src/main/assets/ime/text/characters/serbian_cyrillic.json @@ -0,0 +1,44 @@ +{ + "type": "characters", + "name": "serbian_cyrillic", + "authors": ["GrbavaCigla"], + "direction": "ltr", + "arrangement": [ + [ + { "code": 1113, "label": "љ" }, + { "code": 1114, "label": "њ" }, + { "code": 1077, "label": "е" }, + { "code": 1088, "label": "р" }, + { "code": 1090, "label": "т" }, + { "code": 1079, "label": "з" }, + { "code": 1091, "label": "у" }, + { "code": 1080, "label": "и" }, + { "code": 1086, "label": "о" }, + { "code": 1087, "label": "п" }, + { "code": 1096, "label": "ш" } + ], + [ + { "code": 1072, "label": "а" }, + { "code": 1089, "label": "с" }, + { "code": 1076, "label": "д" }, + { "code": 1092, "label": "ф" }, + { "code": 1075, "label": "г" }, + { "code": 1093, "label": "х" }, + { "code": 1112, "label": "ј" }, + { "code": 1082, "label": "к" }, + { "code": 1083, "label": "л" }, + { "code": 1095, "label": "ч" }, + { "code": 1115, "label": "ћ" } + ], + [ + { "code": 1119, "label": "џ" }, + { "code": 1094, "label": "ц" }, + { "code": 1074, "label": "в" }, + { "code": 1073, "label": "б" }, + { "code": 1085, "label": "н" }, + { "code": 1084, "label": "м" }, + { "code": 1106, "label": "ђ" }, + { "code": 1078, "label": "ж" } + ] + ] +} diff --git a/app/src/main/assets/ime/text/characters/serbian_latin.json b/app/src/main/assets/ime/text/characters/serbian_latin.json new file mode 100644 index 00000000..08deae01 --- /dev/null +++ b/app/src/main/assets/ime/text/characters/serbian_latin.json @@ -0,0 +1,45 @@ +{ + "type": "characters", + "name": "serbian_latin", + "authors": ["GrbavaCigla"], + "direction": "ltr", + "arrangement": [ + [ + { "code": 113, "label": "q" }, + { "code": 119, "label": "w" }, + { "code": 101, "label": "e" }, + { "code": 114, "label": "r" }, + { "code": 116, "label": "t" }, + { "code": 122, "label": "z" }, + { "code": 117, "label": "u" }, + { "code": 105, "label": "i" }, + { "code": 111, "label": "o" }, + { "code": 112, "label": "p" }, + { "code": 353, "label": "š" } + ], + [ + { "code": 97, "label": "a" }, + { "code": 115, "label": "s" }, + { "code": 100, "label": "d" }, + { "code": 102, "label": "f" }, + { "code": 103, "label": "g" }, + { "code": 104, "label": "h" }, + { "code": 106, "label": "j" }, + { "code": 107, "label": "k" }, + { "code": 108, "label": "l" }, + { "code": 269, "label": "č" }, + { "code": 263, "label": "ć" } + ], + [ + { "code": 121, "label": "y" }, + { "code": 120, "label": "x" }, + { "code": 99, "label": "c" }, + { "code": 118, "label": "v" }, + { "code": 98, "label": "b" }, + { "code": 110, "label": "n" }, + { "code": 109, "label": "m" }, + { "code": 273, "label": "đ" }, + { "code": 382, "label": "ž" } + ] + ] +} diff --git a/utils/update_codes.py b/utils/update_codes.py new file mode 100644 index 00000000..61a236f6 --- /dev/null +++ b/utils/update_codes.py @@ -0,0 +1,18 @@ +import json +from sys import argv + +if len(argv) != 2: + print(f"Usage: {argv[0]} FILE") + exit(1) + +with open(argv[1], "r") as file: + layout_json = json.load(file) + +for i, row in enumerate(layout_json["arrangement"]): + for j, key in enumerate(row): + ch = key["label"] + + layout_json["arrangement"][i][j]["code"] = ord(ch) + +with open(argv[1], "w") as file: + json.dump(layout_json, file, ensure_ascii=False) \ No newline at end of file