From f747eb1fd7745a15c92b01c381a6cbe46ad2a218 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Fri, 31 Jul 2026 15:34:07 +0100 Subject: [PATCH 01/14] Create hoc-latn-semicolon.js --- rules/hoc-latn/hoc-latn-semicolon.js | 66 ++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 rules/hoc-latn/hoc-latn-semicolon.js diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js new file mode 100644 index 00000000..5649c867 --- /dev/null +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -0,0 +1,66 @@ +( function ( $ ) { + 'use strict'; + + var hocLatnTilde = { + id: 'hoc-latn-semicolon', + name: 'Ho Latin semicolon', + description: 'Ho Latin semicolon keyboard', + date: '2026-07-31', + URL: 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:UniversalLanguageSelector/Input_methods/hoc-latn-semicolon', + author: 'Mangu Purty', + license: 'GPLv3', + version: '1.0', + maxKeyLength: 3, + patterns: [ + + + + //Uppercase + //Consonants + + [ 'K;', 'Ḱ' ], + [ 'C;', 'Ć' ], + [ 'Z;', 'T́' ], + [ '(W|P);', 'Ṕ' ], + + [ 'Ḱ;', 'K' ], + [ 'Ć;', 'C' ], + [ 'T́;', 'T' ], + [ 'Ṕ;', 'P' ], + + [ 'T;', 'Ṭ' ], + [ 'D;', 'Ḍ' ], + [ 'R;', 'Ṛ' ], + + [ 'Ṭ;', 'T' ], + [ 'Ḍ;', 'D' ], + [ 'Ṛ;', 'R' ], + + [ 'N;', 'Ṅ' ], + [ 'J;', 'Ń' ], + + [ 'Ṅ;', 'N' ], + [ 'Ń;', 'J' ], + + //Vowels + + [ 'A;', 'Á' ], + [ 'Á;', 'Ã' ], + [ 'Ã;', 'Ä' ], + [ 'Ä;', 'À' ], + [ 'À;', 'Â' ], + [ 'Â;', 'A' ], + + [ 'E;', 'É' ], + [ 'É;', 'Ẽ' ], + [ 'Ẽ;', 'Ë' ], + [ 'Ë;', 'È' ], + [ 'È;', 'Ê' ], + [ 'Ê;', 'E' ], + + [ '\;', ';' ] + ] + }; + + $.ime.register( hocLatnSemicolon ); +}( jQuery ) ); From 94b1f8c1d95c7226fc4638b9e90639e737f4a5a1 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 15:38:02 +0100 Subject: [PATCH 02/14] Update hoc-latn-semicolon.js --- rules/hoc-latn/hoc-latn-semicolon.js | 138 ++++++++++++++++++++------- 1 file changed, 104 insertions(+), 34 deletions(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index 5649c867..94820a4a 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -18,47 +18,117 @@ //Uppercase //Consonants - [ 'K;', 'Ḱ' ], - [ 'C;', 'Ć' ], - [ 'Z;', 'T́' ], - [ '(W|P);', 'Ṕ' ], + [ 'K;', 'Ḱ' ], + [ 'C;', 'Ć' ], + [ 'Z;', 'T́' ], + [ '(W|P);', 'Ṕ' ], - [ 'Ḱ;', 'K' ], - [ 'Ć;', 'C' ], - [ 'T́;', 'T' ], - [ 'Ṕ;', 'P' ], + [ 'Ḱ;', 'K' ], + [ 'Ć;', 'C' ], + [ 'T́;', 'T' ], + [ 'Ṕ;', 'P' ], + + [ 'T;', 'Ṭ' ], + [ 'D;', 'Ḍ' ], + [ 'R;', 'Ṛ' ], + + [ 'T\.\.', 'Ṭ' ], + [ 'D\.\.', 'Ḍ' ], + [ 'R\.\.', 'Ṛ' ], - [ 'T;', 'Ṭ' ], - [ 'D;', 'Ḍ' ], - [ 'R;', 'Ṛ' ], + [ 'Ṭ;', 'T' ], + [ 'Ḍ;', 'D' ], + [ 'Ṛ;', 'R' ], + + [ 'N;', 'Ṅ' ], + [ 'J;', 'Ń' ], - [ 'Ṭ;', 'T' ], - [ 'Ḍ;', 'D' ], - [ 'Ṛ;', 'R' ], + [ 'Ṅ;', 'N' ], + [ 'Ń;', 'J' ], - [ 'N;', 'Ṅ' ], - [ 'J;', 'Ń' ], + //Vowels - [ 'Ṅ;', 'N' ], - [ 'Ń;', 'J' ], + [ 'A;', 'Á' ], + [ 'Á;', 'Ã' ], + [ 'Ã;', 'Ä' ], + [ 'Ä;', 'À' ], + [ 'À;', 'Â' ], + [ 'Â;', 'A' ], - //Vowels + [ 'A`', 'À' ], + [ 'A~', 'Ã' ], + [ 'A\.\.', 'Ạ' ], + [ 'Ạ\.\.', 'Ä' ], + [ 'A^', 'Â' ], + [ 'À`', 'Á' ], + + [ 'E;', 'É' ], + [ 'É;', 'Ẽ' ], + [ 'Ẽ;', 'Ë' ], + [ 'Ë;', 'È' ], + [ 'È;', 'Ê' ], + [ 'Ê;', 'E' ], + + [ 'E`', 'È' ], + [ 'E~', 'Ẽ' ], + [ 'E\.\.', 'Ẹ' ], + [ 'Ẹ\.\.', 'Ë' ], + [ 'E^', 'Ê' ], + [ 'È`', 'É' ], + + [ 'I;', 'Í' ], + [ 'Í;', 'Ĩ' ], + [ 'Ĩ;', 'Ï' ], + [ 'Ï;', 'Ì' ], + [ 'Ì;', 'Î' ], + [ 'Î;', 'I' ], + + [ 'I`', 'Ì' ], + [ 'I~', 'Ĩ' ], + [ 'I\.\.', 'Ï' ], + [ 'I^', 'Î' ], + [ 'Ì`', 'Í' ], + + [ 'O;', 'Ó' ], + [ 'Ó;', 'Õ' ], + [ 'Õ;', 'Ö' ], + [ 'Ö;', 'Ò' ], + [ 'Ò;', 'Ô' ], + [ 'Ô;', 'O' ], + + [ 'O`', 'Ò' ], + [ 'O~', 'Õ' ], + [ 'O\.\.', 'Ọ' ], + [ 'Ọ\.\.', 'Ö' ], + [ 'O^', 'Ô' ], + [ 'Ò`', 'Ó' ], + + [ 'U;', 'Ú' ], + [ 'Ú;', 'Ũ' ], + [ 'Ũ;', 'Ü' ], + [ 'Ü;', 'Ù' ], + [ 'Ù;', 'Û' ], + [ 'Û;', 'U' ], + + [ 'U`', 'Ù' ], + [ 'U~', 'Ũ' ], + [ 'U\.\.', 'Ü' ], + [ 'U^', 'Û' ], + [ 'Ù`', 'Ú' ], + + [ '\.;', '·' ], + [ '\<;', '‹' ], + [ '\>;', '›' ], + [ '‹‹;', '«' ], + [ '››;', '»' ], + [ '\\\\~', '~' ], + [ '\\\\\.', '.' ], + [ '\\\\^', '^' ], + [ '\\\\`', '`' ], + [ '\\\\‹', '<' ], + [ '\\\\‹', '>' ], - [ 'A;', 'Á' ], - [ 'Á;', 'Ã' ], - [ 'Ã;', 'Ä' ], - [ 'Ä;', 'À' ], - [ 'À;', 'Â' ], - [ 'Â;', 'A' ], - - [ 'E;', 'É' ], - [ 'É;', 'Ẽ' ], - [ 'Ẽ;', 'Ë' ], - [ 'Ë;', 'È' ], - [ 'È;', 'Ê' ], - [ 'Ê;', 'E' ], - - [ '\;', ';' ] + [ '\;', ';' ] ] }; From dd79d60f53f8384555739417bfa834fabb18d654 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 15:42:53 +0100 Subject: [PATCH 03/14] Update jquery.ime.inputmethods.js --- src/jquery.ime.inputmethods.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/jquery.ime.inputmethods.js b/src/jquery.ime.inputmethods.js index f6e97abe..64188cc0 100755 --- a/src/jquery.ime.inputmethods.js +++ b/src/jquery.ime.inputmethods.js @@ -420,6 +420,10 @@ name: 'लिप्यंतरण', source: 'rules/hi/hi-transliteration.js' }, + 'hoc-latn-semicolon': { + name: 'Ho Latin Semicolon', + source: 'rules/hoc-latn/hoc-latn-semicolon.js' + }, 'hoc-latn-tilde': { name: 'Ho Latin Tilde', source: 'rules/hoc-latn/hoc-latn-tilde.js' @@ -1440,7 +1444,7 @@ }, 'hoc-latn': { autonym: 'Ho', - inputmethods: [ 'hoc-latn-tilde' ] + inputmethods: [ 'hoc-latn-tilde', 'hoc-latn-semicolon' ] }, hr: { autonym: 'Hrvatski', From 63296b09ec141519824e4bfbcd51a7d2e18d5eb6 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 16:46:22 +0100 Subject: [PATCH 04/14] Update hoc-latn-semicolon.js --- rules/hoc-latn/hoc-latn-semicolon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index 94820a4a..6261e237 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -1,7 +1,7 @@ ( function ( $ ) { 'use strict'; - var hocLatnTilde = { + var hocLatnSemicolon = { id: 'hoc-latn-semicolon', name: 'Ho Latin semicolon', description: 'Ho Latin semicolon keyboard', From a518cd9ea6d8c63ad76d11aa2c08c928dc015292 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 16:52:21 +0100 Subject: [PATCH 05/14] update --- rules/hoc-latn/hoc-latn-semicolon.js | 2 +- test/jquery.ime.test.fixtures.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index 94820a4a..6261e237 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -1,7 +1,7 @@ ( function ( $ ) { 'use strict'; - var hocLatnTilde = { + var hocLatnSemicolon = { id: 'hoc-latn-semicolon', name: 'Ho Latin semicolon', description: 'Ho Latin semicolon keyboard', diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index 79c24dc4..f4b0cea0 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -2445,6 +2445,34 @@ var palochkaVariants = { { input: 'A~\\a~\\E~\\e~\\I~\\i~\\O~\\o~\\U~\\u~\\', output: 'ÀàÈèÌìÒòÙù', description: 'Ho vowels 5' } ] }, + { + description: 'Ho Latin Semicolon test', + inputmethod: 'hoc-latn-semicolon', + tests: [ + { input: 'K;C;Z;P;W;', output: 'ḰĆT́ṔṔ', description: 'Ho consonants 1' }, + { input: 'Ḱ;Ć;T́;Ṕ', output: 'KCZP', description: 'Ho consonants 1' }, + { input: 'T;D;R;', output: 'ṬḌṚ', description: 'Ho consonants 2' }, + { input: 'Ṭ;Ḍ;Ṛ;', output: 'TDR', description: 'Ho consonants 2' }, + { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants 2' }, + { input: 'N;J;', output: 'ṄŃ', description: 'Ho consonants 3' }, + { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants 3' }, + + { input: 'A;E;I;O;U;', output: 'ÁÉÍÓÚ', description: 'Ho vowels 1' }, + { input: 'Á;É;Í;Ó;Ú;', output: 'ÃẼĨÕŨ', description: 'Ho vowels 1' }, + { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;', output: 'ÄËÏÖÜ', description: 'Ho vowels 1' }, + { input: 'Ä;Ë;Ï;Ö;Ü;', output: 'ÀÈÈÒÙ', description: 'Ho vowels 1' }, + { input: 'À;È;Ì;Ò;Ù;', output: 'ÂÊÎÔÛ', description: 'Ho vowels 1' }, + { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels 1' }, + + { input: 'A..E..I..O..U..;', output: 'ẠẸÏỌÜ', description: 'Ho vowels 1' }, + { input: 'Ạ..Ẹ..Ï..Ọ..Ü..;', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels 1' }, + + { input: '.;', output: '·', description: 'Ho vowels 1' }, + { input: '<>‹‹››', output: '‹›«»', description: 'Ho vowels 1' }, + { input: '\\~\\`\\.\\^\\<\\>\\;', output: '~`.^<>;', description: 'Ho vowels 1' } + + ] + }, { description: 'Ho Transliteration test', inputmethod: 'hoc-transliteration', From e4ba2ac48c7225cc36ef78e3cec6833d0c2b5d8a Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 17:15:27 +0100 Subject: [PATCH 06/14] Update jquery.ime.test.fixtures.js --- test/jquery.ime.test.fixtures.js | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index f4b0cea0..ecd02d06 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -2449,27 +2449,27 @@ var palochkaVariants = { description: 'Ho Latin Semicolon test', inputmethod: 'hoc-latn-semicolon', tests: [ - { input: 'K;C;Z;P;W;', output: 'ḰĆT́ṔṔ', description: 'Ho consonants 1' }, - { input: 'Ḱ;Ć;T́;Ṕ', output: 'KCZP', description: 'Ho consonants 1' }, - { input: 'T;D;R;', output: 'ṬḌṚ', description: 'Ho consonants 2' }, - { input: 'Ṭ;Ḍ;Ṛ;', output: 'TDR', description: 'Ho consonants 2' }, - { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants 2' }, - { input: 'N;J;', output: 'ṄŃ', description: 'Ho consonants 3' }, - { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants 3' }, + { input: 'K;C;Z;P;W;', output: 'ḰĆT́ṔṔ', description: 'Ho consonants KCTP' }, + { input: 'Ḱ;Ć;T́;Ṕ', output: 'KCZP', description: 'Ho consonants KCTP reverse' }, + { input: 'T;D;R;', output: 'ṬḌṚ', description: 'Ho consonants TDR' }, + { input: 'Ṭ;Ḍ;Ṛ;', output: 'TDR', description: 'Ho consonants TDR reverse' }, + { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants TDR dot' }, + { input: 'N;J;', output: 'ṄŃ', description: 'Ho consonants NJ' }, + { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants NJ reverse' }, - { input: 'A;E;I;O;U;', output: 'ÁÉÍÓÚ', description: 'Ho vowels 1' }, - { input: 'Á;É;Í;Ó;Ú;', output: 'ÃẼĨÕŨ', description: 'Ho vowels 1' }, - { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;', output: 'ÄËÏÖÜ', description: 'Ho vowels 1' }, - { input: 'Ä;Ë;Ï;Ö;Ü;', output: 'ÀÈÈÒÙ', description: 'Ho vowels 1' }, - { input: 'À;È;Ì;Ò;Ù;', output: 'ÂÊÎÔÛ', description: 'Ho vowels 1' }, - { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels 1' }, + { input: 'A;E;I;O;U;', output: 'ÁÉÍÓÚ', description: 'Ho vowels acute' }, + { input: 'Á;É;Í;Ó;Ú;', output: 'ÃẼĨÕŨ', description: 'Ho vowels tilde' }, + { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;', output: 'ÄËÏÖÜ', description: 'Ho vowels dieresis' }, + { input: 'Ä;Ë;Ï;Ö;Ü;', output: 'ÀÈÈÒÙ', description: 'Ho vowels grave' }, + { input: 'À;È;Ì;Ò;Ù;', output: 'ÂÊÎÔÛ', description: 'Ho vowels circumflex' }, + { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels reverse' }, - { input: 'A..E..I..O..U..;', output: 'ẠẸÏỌÜ', description: 'Ho vowels 1' }, - { input: 'Ạ..Ẹ..Ï..Ọ..Ü..;', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels 1' }, + { input: 'A..E..I..O..U..;', output: 'ẠẸÏỌÜ', description: 'Ho vowels dot' }, + { input: 'Ạ..Ẹ..Ï..Ọ..Ü..;', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels dot dot' }, - { input: '.;', output: '·', description: 'Ho vowels 1' }, - { input: '<>‹‹››', output: '‹›«»', description: 'Ho vowels 1' }, - { input: '\\~\\`\\.\\^\\<\\>\\;', output: '~`.^<>;', description: 'Ho vowels 1' } + { input: '.;', output: '·', description: 'Ho punctuation middle dot' }, + { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes' }, + { input: '\\~\\`\\.\\^\\<\\>\\;', output: '~`.^<>;', description: 'Ho punctuations' } ] }, From bfaa04c1fdfa52514e7213ca4a5fd8125a3cf0a8 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 22:32:33 +0100 Subject: [PATCH 07/14] Update hoc-latn-semicolon.js --- rules/hoc-latn/hoc-latn-semicolon.js | 128 ++++++++++++++------------- 1 file changed, 65 insertions(+), 63 deletions(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index 6261e237..d0638ba0 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -15,30 +15,30 @@ - //Uppercase + //uppercase //Consonants + [ 'Z;', 'T́' ], [ 'K;', 'Ḱ' ], [ 'C;', 'Ć' ], - [ 'Z;', 'T́' ], - [ '(W|P);', 'Ṕ' ], + [ 'P;', 'Ṕ' ], + [ 'W;', 'Ṕ' ], - [ 'Ḱ;', 'K' ], - [ 'Ć;', 'C' ], - [ 'T́;', 'T' ], - [ 'Ṕ;', 'P' ], +// [ 'Ḱ;', 'K' ], //works +// [ 'Ć;', 'C' ], //works +// [ 'T́;', 'Z' ], //causes issues +// [ 'Ṕ;', 'P' ], //works [ 'T;', 'Ṭ' ], [ 'D;', 'Ḍ' ], [ 'R;', 'Ṛ' ], - - [ 'T\.\.', 'Ṭ' ], - [ 'D\.\.', 'Ḍ' ], - [ 'R\.\.', 'Ṛ' ], - - [ 'Ṭ;', 'T' ], - [ 'Ḍ;', 'D' ], - [ 'Ṛ;', 'R' ], +// [ 'T..', 'Ṭ' ], //messes up Z; > T́, outcome: Z; P; > ṬṔ, for some reason +// [ 'D..', 'Ḍ' ], //works, disabled for consistency with T.. > Ṭ +// [ 'R..', 'Ṛ' ], //works, disabled for consistency with T.. > Ṭ + +// [ 'Ṭ;', 'T' ], //causes issues +// [ 'Ḍ;', 'D' ], //works +// [ 'Ṛ;', 'R' ], //works [ 'N;', 'Ṅ' ], [ 'J;', 'Ń' ], @@ -53,82 +53,84 @@ [ 'Ã;', 'Ä' ], [ 'Ä;', 'À' ], [ 'À;', 'Â' ], - [ 'Â;', 'A' ], +// [ 'Â;', 'A' ], //causes issues - [ 'A`', 'À' ], - [ 'A~', 'Ã' ], - [ 'A\.\.', 'Ạ' ], - [ 'Ạ\.\.', 'Ä' ], - [ 'A^', 'Â' ], - [ 'À`', 'Á' ], + [ 'A\u0060', 'À' ], //\u0060 = ` + [ 'A\u007E', 'Ã' ], //\u007E = ~ + [ 'A\u002E\u002E', 'Ạ' ], //\u002E = . +// [ 'Ạ\.\.', 'Ä' ], //messes up the rest + [ 'A\\^', 'Â' ], //\u005E = ^ + [ 'À\u0060', 'Á' ], [ 'E;', 'É' ], [ 'É;', 'Ẽ' ], [ 'Ẽ;', 'Ë' ], [ 'Ë;', 'È' ], [ 'È;', 'Ê' ], - [ 'Ê;', 'E' ], +// [ 'Ê;', 'E' ], //causes issues - [ 'E`', 'È' ], - [ 'E~', 'Ẽ' ], - [ 'E\.\.', 'Ẹ' ], - [ 'Ẹ\.\.', 'Ë' ], - [ 'E^', 'Ê' ], - [ 'È`', 'É' ], + [ 'E\u0060', 'È' ], + [ 'E\u007E', 'Ẽ' ], + [ 'E\u002E\u002E', 'Ẹ' ], + [ 'E\\^', 'Ê' ], + [ 'È\u0060', 'É' ], [ 'I;', 'Í' ], [ 'Í;', 'Ĩ' ], [ 'Ĩ;', 'Ï' ], [ 'Ï;', 'Ì' ], [ 'Ì;', 'Î' ], - [ 'Î;', 'I' ], +// [ 'Î;', 'I' ], //causes issues - [ 'I`', 'Ì' ], - [ 'I~', 'Ĩ' ], - [ 'I\.\.', 'Ï' ], - [ 'I^', 'Î' ], - [ 'Ì`', 'Í' ], + [ 'I\u0060', 'Ì' ], + [ 'I\u007E', 'Ĩ' ], + [ 'I\u002E\u002E', 'Ï' ], + [ 'I\\^', 'Î' ], + [ 'Ì\u0060', 'Í' ], [ 'O;', 'Ó' ], [ 'Ó;', 'Õ' ], [ 'Õ;', 'Ö' ], [ 'Ö;', 'Ò' ], [ 'Ò;', 'Ô' ], - [ 'Ô;', 'O' ], +// [ 'Ô;', 'O' ], - [ 'O`', 'Ò' ], - [ 'O~', 'Õ' ], - [ 'O\.\.', 'Ọ' ], - [ 'Ọ\.\.', 'Ö' ], - [ 'O^', 'Ô' ], - [ 'Ò`', 'Ó' ], + [ 'O\u0060', 'Ò' ], + [ 'O\u007E', 'Õ' ], + [ 'O\u002E\u002E', 'Ọ' ], +// [ 'Ọ\.\.', 'Ö' ], + [ 'O\\^', 'Ô' ], + [ 'Ò\u0060', 'Ó' ], [ 'U;', 'Ú' ], [ 'Ú;', 'Ũ' ], [ 'Ũ;', 'Ü' ], [ 'Ü;', 'Ù' ], [ 'Ù;', 'Û' ], - [ 'Û;', 'U' ], - - [ 'U`', 'Ù' ], - [ 'U~', 'Ũ' ], - [ 'U\.\.', 'Ü' ], - [ 'U^', 'Û' ], - [ 'Ù`', 'Ú' ], - - [ '\.;', '·' ], - [ '\<;', '‹' ], - [ '\>;', '›' ], - [ '‹‹;', '«' ], - [ '››;', '»' ], - [ '\\\\~', '~' ], - [ '\\\\\.', '.' ], - [ '\\\\^', '^' ], - [ '\\\\`', '`' ], - [ '\\\\‹', '<' ], - [ '\\\\‹', '>' ], - - [ '\;', ';' ] +// [ 'Û;', 'U' ], //causes issues + + [ 'U\u0060', 'Ù' ], + [ 'U\u007E', 'Ũ' ], + [ 'U\u002E\u002E', 'Ü' ], + [ 'U\\^', 'Û' ], + [ 'Ù\u0060', 'Ú' ], + + [ '\u003C', '‹' ], //\u003C = < + [ '\u003E', '›' ],//\u003E = > + [ '››', '»' ], + [ '‹‹', '«' ], + + + + [ '\\\\;', ';' ], + +// [ '\\\\\u007E', '\u007E' ], //\u007E = ~, \\\\ = \ +// [ '\\\\\u0060', '\u0060' ], //\u0060 = ` + [ '\\\\\\^', '\\^' ], + [ '\\\\‹', '\u003C' ], //\u003C = < + [ '\\\\›', '\u003E' ], //\u003E = > + + [ '\u002E;', '·' ] ] }; From a4de46f37661f7ead8660576e122a194014060b2 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 22:36:00 +0100 Subject: [PATCH 08/14] Update jquery.ime.test.fixtures.js --- test/jquery.ime.test.fixtures.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index ecd02d06..ab7c8984 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -2449,28 +2449,27 @@ var palochkaVariants = { description: 'Ho Latin Semicolon test', inputmethod: 'hoc-latn-semicolon', tests: [ - { input: 'K;C;Z;P;W;', output: 'ḰĆT́ṔṔ', description: 'Ho consonants KCTP' }, - { input: 'Ḱ;Ć;T́;Ṕ', output: 'KCZP', description: 'Ho consonants KCTP reverse' }, - { input: 'T;D;R;', output: 'ṬḌṚ', description: 'Ho consonants TDR' }, - { input: 'Ṭ;Ḍ;Ṛ;', output: 'TDR', description: 'Ho consonants TDR reverse' }, - { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants TDR dot' }, + { input: 'K;C;Z;P;', output: 'ḰĆT́Ṕ', description: 'Ho consonants K;C;T;P;' }, + { input: 'W;', output: 'Ṕ', description: 'Ho consonants W;' }, + { input: 'T; D; R;', output: 'Ṭ Ḍ Ṛ', description: 'Ho consonants T; D; R;' }, { input: 'N;J;', output: 'ṄŃ', description: 'Ho consonants NJ' }, { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants NJ reverse' }, { input: 'A;E;I;O;U;', output: 'ÁÉÍÓÚ', description: 'Ho vowels acute' }, { input: 'Á;É;Í;Ó;Ú;', output: 'ÃẼĨÕŨ', description: 'Ho vowels tilde' }, - { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;', output: 'ÄËÏÖÜ', description: 'Ho vowels dieresis' }, - { input: 'Ä;Ë;Ï;Ö;Ü;', output: 'ÀÈÈÒÙ', description: 'Ho vowels grave' }, + { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;', output: 'ÄËÏÖÜ', description: 'Ho vowels diaeresis' }, + { input: 'Ä;Ë;Ï;Ö;Ü;', output: 'ÀÈÌÒÙ', description: 'Ho vowels grave' }, { input: 'À;È;Ì;Ò;Ù;', output: 'ÂÊÎÔÛ', description: 'Ho vowels circumflex' }, - { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels reverse' }, - { input: 'A..E..I..O..U..;', output: 'ẠẸÏỌÜ', description: 'Ho vowels dot' }, - { input: 'Ạ..Ẹ..Ï..Ọ..Ü..;', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels dot dot' }, + { input: 'A`E`I`O`U`', output: 'ÀÈÌÒÙ', description: 'Ho vowels A`E`I`O`U`' }, + { input: 'A~E~I~O~U~', output: 'ÃẼĨÕŨ', description: 'Ho vowels A~E~I~O~U~' }, + { input: 'A\u005EE\u005EI\u005EO\u005EU\u005E', output: 'ÂÊÎÔÛ', description: 'Ho vowels A^E^I^O^U^' }, - { input: '.;', output: '·', description: 'Ho punctuation middle dot' }, - { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes' }, - { input: '\\~\\`\\.\\^\\<\\>\\;', output: '~`.^<>;', description: 'Ho punctuations' } + { input: 'A.. E.. I.. O.. U..', output: 'Ạ Ẹ Ï Ọ Ü', description: 'Ho vowels A.. E.. I.. O.. U..' }, + { input: '.;', output: '·', description: 'Ho punctuation middle dot' }, + { input: '\\;', output: ';', description: 'Ho punctuation \u005C;' }, + { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes <><<››' } ] }, { From ca3623230a7b3917e7b733dbbce6043a016995df Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 22:55:20 +0100 Subject: [PATCH 09/14] Update jquery.ime.test.fixtures.js --- test/jquery.ime.test.fixtures.js | 43 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index ab7c8984..48fb91bc 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -2444,32 +2444,39 @@ var palochkaVariants = { { input: 'A~^a~^E~^e~^I~^i~^O~^o~^U~^u~^', output: 'ÂâÊêÎîÔôÛû', description: 'Ho vowels 4' }, { input: 'A~\\a~\\E~\\e~\\I~\\i~\\O~\\o~\\U~\\u~\\', output: 'ÀàÈèÌìÒòÙù', description: 'Ho vowels 5' } ] - }, - { + }, { description: 'Ho Latin Semicolon test', inputmethod: 'hoc-latn-semicolon', tests: [ - { input: 'K;C;Z;P;', output: 'ḰĆT́Ṕ', description: 'Ho consonants K;C;T;P;' }, - { input: 'W;', output: 'Ṕ', description: 'Ho consonants W;' }, - { input: 'T; D; R;', output: 'Ṭ Ḍ Ṛ', description: 'Ho consonants T; D; R;' }, - { input: 'N;J;', output: 'ṄŃ', description: 'Ho consonants NJ' }, - { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants NJ reverse' }, - - { input: 'A;E;I;O;U;', output: 'ÁÉÍÓÚ', description: 'Ho vowels acute' }, - { input: 'Á;É;Í;Ó;Ú;', output: 'ÃẼĨÕŨ', description: 'Ho vowels tilde' }, - { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;', output: 'ÄËÏÖÜ', description: 'Ho vowels diaeresis' }, - { input: 'Ä;Ë;Ï;Ö;Ü;', output: 'ÀÈÌÒÙ', description: 'Ho vowels grave' }, - { input: 'À;È;Ì;Ò;Ù;', output: 'ÂÊÎÔÛ', description: 'Ho vowels circumflex' }, + { input: 'K;C;Z;P;k;c;z;p;', output: 'ḰĆT́Ṕḱćt́ṕ', description: 'Ho consonants K;C;T;P;k;c;z;p;' }, + { input: 'W;w;', output: 'Ṕṕ', description: 'Ho consonants W;w;' }, + { input: 'T;D;R;t;d;r;', output: 'ṬḌṚṭḍṛ', description: 'Ho consonants T;D;R;t;d;r;' }, + { input: 'N;J;n;j;', output: 'ṄŃṅń', description: 'Ho consonants N;J;n;j;' }, - { input: 'A`E`I`O`U`', output: 'ÀÈÌÒÙ', description: 'Ho vowels A`E`I`O`U`' }, - { input: 'A~E~I~O~U~', output: 'ÃẼĨÕŨ', description: 'Ho vowels A~E~I~O~U~' }, - { input: 'A\u005EE\u005EI\u005EO\u005EU\u005E', output: 'ÂÊÎÔÛ', description: 'Ho vowels A^E^I^O^U^' }, - - { input: 'A.. E.. I.. O.. U..', output: 'Ạ Ẹ Ï Ọ Ü', description: 'Ho vowels A.. E.. I.. O.. U..' }, + { input: 'A;E;I;O;U;a;e;i;o;u;', output: 'ÁÉÍÓÚáéíóú', description: 'Ho vowels acute' }, + { input: 'Á;É;Í;Ó;Ú;á;é;í;ó;ú;', output: 'ÃẼĨÕŨãẽĩõũ', description: 'Ho vowels tilde' }, + { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;ã;ẽ;ĩ;õ;ũ;', output: 'ÄËÏÖÜäëïöü', description: 'Ho vowels dieresis' }, + { input: 'Ä;Ë;Ï;Ö;Ü;ä;ë;ï;ö;ü;', output: 'ÀÈÌÒÙàèìòù', description: 'Ho vowels grave' }, + { input: 'À;È;Ì;Ò;Ù;à;è;ì;ò;ù;', output: 'ÂÊÎÔÛâêîôû', description: 'Ho vowels circumflex' }, + { input: 'A`E`I`O`U`a`e`i`o`u`', output: 'ÀÈÌÒÙàèìòù', description: 'Ho vowels A`E`I`O`U`a`e`i`o`u`' }, + { input: 'A~E~I~O~U~a~e~i~o~u~', output: 'ÃẼĨÕŨãẽĩõũ', description: 'Ho vowels A~E~I~O~U~a~e~i~o~u~' }, + { input: 'A\u005EE\u005EI\u005EO\u005EU\u005Ea\u005Ee\u005Ei\u005Eo\u005Eu\u005E', output: 'ÂÊÎÔÛâêîôû', description: 'Ho vowels A^E^I^O^U^a^e^i^o^u^' }, + { input: 'A..E..I..O..U..a..e..i..o..u..', output: 'ẠẸÏỌÜạẹïọü', description: 'Ho vowels A..E..I..O..U..a..e..i..o..u..' }, { input: '.;', output: '·', description: 'Ho punctuation middle dot' }, { input: '\\;', output: ';', description: 'Ho punctuation \u005C;' }, { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes <><<››' } + + /* currently not implemented + { input: 'Ṕ;', output: 'P', description: 'Ho consonants Ḱ reverse' }, + { input: 'Ṭ; Ḍ; Ṛ;', output: 'T D R', description: 'Ho consonants TDR reverse' }, + { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants T..D..R..' }, + { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants NJ reverse' }, + { input: '~\\`\\^\\‹\\›', output: '~`^<>;', description: 'Ho punctuations \u005C~\u005C`\u005C^\u005C<\u005C>\u005C;' }, + { input: 'a\u005C\u005E', output: 'a\u005E', description: 'Ho a\u005C\u005E' } + { input: 'Ạ..Ẹ..Ï..Ọ..Ü..', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels Ạ..Ẹ..Ï..Ọ..Ü..' }, + { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels reverse' } + */ ] }, { From e8048331f0c74426c3ec5232a18438e01cd43dea Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 1 Aug 2026 22:58:19 +0100 Subject: [PATCH 10/14] Update hoc-latn-semicolon.js --- rules/hoc-latn/hoc-latn-semicolon.js | 110 ++++++++++++++++++++++++--- 1 file changed, 101 insertions(+), 9 deletions(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index d0638ba0..c3ae228a 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -14,9 +14,7 @@ patterns: [ - - //uppercase - //Consonants + //uppercase [ 'Z;', 'T́' ], [ 'K;', 'Ḱ' ], @@ -43,10 +41,8 @@ [ 'N;', 'Ṅ' ], [ 'J;', 'Ń' ], - [ 'Ṅ;', 'N' ], - [ 'Ń;', 'J' ], - - //Vowels +// [ 'Ṅ;', 'N' ], +// [ 'Ń;', 'J' ], [ 'A;', 'Á' ], [ 'Á;', 'Ã' ], @@ -115,12 +111,108 @@ [ 'U\\^', 'Û' ], [ 'Ù\u0060', 'Ú' ], + //lowercase + + [ 'z;', 't́' ], + [ 'k;', 'ḱ' ], + [ 'c;', 'ć' ], + [ 'p;', 'ṕ' ], + [ 'w;', 'ṕ' ], + +// [ 'ḱ;', 'k' ], //works +// [ 'ć;', 'c' ], //works +// [ 't́;', 'z' ], //causes issues +// [ 'ṕ;', 'p' ], //works + + [ 't;', 'ṭ' ], + [ 'd;', 'ḍ' ], + [ 'r;', 'ṛ' ], +// [ 't..', 'ṭ' ], //messes up z; > t́, outcome: z; p; > ṭṕ, for some reason +// [ 'd..', 'ḍ' ], //works, disabled for consistency with t.. > ṭ +// [ 'r..', 'ṛ' ], //works, disabled for consistency with t.. > ṭ + +// [ 'ṭ;', 't' ], //causes issues +// [ 'ḍ;', 'd' ], //works +// [ 'ṛ;', 'r' ], //works + + [ 'n;', 'ṅ' ], + [ 'j;', 'ń' ], + +// [ 'ṅ;', 'n' ], +// [ 'ń;', 'j' ], + + [ 'a;', 'á' ], + [ 'á;', 'ã' ], + [ 'ã;', 'ä' ], + [ 'ä;', 'à' ], + [ 'à;', 'â' ], +// [ 'â;', 'a' ], //causes issues + + [ 'a\u0060', 'à' ], //\u0060 = ` + [ 'a\u007e', 'ã' ], //\u007e = ~ + [ 'a\u002e\u002e', 'ạ' ], //\u002e = . +// [ 'ạ\.\.', 'ä' ], //messes up the rest + [ 'a\\^', 'â' ], //\u005e = ^ + [ 'à\u0060', 'á' ], + + [ 'e;', 'é' ], + [ 'é;', 'ẽ' ], + [ 'ẽ;', 'ë' ], + [ 'ë;', 'è' ], + [ 'è;', 'ê' ], +// [ 'ê;', 'e' ], //causes issues + + [ 'e\u0060', 'è' ], + [ 'e\u007e', 'ẽ' ], + [ 'e\u002e\u002e', 'ẹ' ], + [ 'e\\^', 'ê' ], + [ 'è\u0060', 'é' ], + + [ 'i;', 'í' ], + [ 'í;', 'ĩ' ], + [ 'ĩ;', 'ï' ], + [ 'ï;', 'ì' ], + [ 'ì;', 'î' ], +// [ 'î;', 'i' ], //causes issues + + [ 'i\u0060', 'ì' ], + [ 'i\u007e', 'ĩ' ], + [ 'i\u002e\u002e', 'ï' ], + [ 'i\\^', 'î' ], + [ 'ì\u0060', 'í' ], + + [ 'o;', 'ó' ], + [ 'ó;', 'õ' ], + [ 'õ;', 'ö' ], + [ 'ö;', 'ò' ], + [ 'ò;', 'ô' ], +// [ 'ô;', 'o' ], + + [ 'o\u0060', 'ò' ], + [ 'o\u007e', 'õ' ], + [ 'o\u002e\u002e', 'ọ' ], +// [ 'ọ\.\.', 'ö' ], + [ 'o\\^', 'ô' ], + [ 'ò\u0060', 'ó' ], + + [ 'u;', 'ú' ], + [ 'ú;', 'ũ' ], + [ 'ũ;', 'ü' ], + [ 'ü;', 'ù' ], + [ 'ù;', 'û' ], +// [ 'û;', 'u' ], //causes issues + + [ 'u\u0060', 'ù' ], + [ 'u\u007e', 'ũ' ], + [ 'u\u002e\u002e', 'ü' ], + [ 'u\\^', 'û' ], + [ 'ù\u0060', 'ú' ], + + //punctuation [ '\u003C', '‹' ], //\u003C = < [ '\u003E', '›' ],//\u003E = > [ '››', '»' ], [ '‹‹', '«' ], - - [ '\\\\;', ';' ], From 09e596530910322dcce77261162bd09082023ff1 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 8 Aug 2026 21:54:06 +0100 Subject: [PATCH 11/14] update on errors --- rules/hoc-latn/hoc-latn-semicolon.js | 146 +++++++++++++-------------- test/jquery.ime.test.fixtures.js | 9 +- 2 files changed, 75 insertions(+), 80 deletions(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index c3ae228a..af5b4002 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -13,8 +13,7 @@ maxKeyLength: 3, patterns: [ - - //uppercase + // uppercase [ 'Z;', 'T́' ], [ 'K;', 'Ḱ' ], @@ -22,40 +21,40 @@ [ 'P;', 'Ṕ' ], [ 'W;', 'Ṕ' ], -// [ 'Ḱ;', 'K' ], //works -// [ 'Ć;', 'C' ], //works -// [ 'T́;', 'Z' ], //causes issues -// [ 'Ṕ;', 'P' ], //works - + [ 'Ḱ;', 'K' ], + [ 'Ć;', 'C' ], + [ 'T́;', 'Z' ], + [ 'Ṕ;', 'P' ], + [ 'T;', 'Ṭ' ], [ 'D;', 'Ḍ' ], [ 'R;', 'Ṛ' ], -// [ 'T..', 'Ṭ' ], //messes up Z; > T́, outcome: Z; P; > ṬṔ, for some reason -// [ 'D..', 'Ḍ' ], //works, disabled for consistency with T.. > Ṭ -// [ 'R..', 'Ṛ' ], //works, disabled for consistency with T.. > Ṭ - -// [ 'Ṭ;', 'T' ], //causes issues -// [ 'Ḍ;', 'D' ], //works -// [ 'Ṛ;', 'R' ], //works - + [ 'T\.\.', 'Ṭ' ], + [ 'D\.\.', 'Ḍ' ], + [ 'R\.\.', 'Ṛ' ], + + [ 'Ṭ;', 'T' ], + [ 'Ḍ;', 'D' ], + [ 'Ṛ;', 'R' ], + [ 'N;', 'Ṅ' ], [ 'J;', 'Ń' ], -// [ 'Ṅ;', 'N' ], -// [ 'Ń;', 'J' ], + [ 'Ṅ;', 'N' ], + [ 'Ń;', 'J' ], [ 'A;', 'Á' ], [ 'Á;', 'Ã' ], [ 'Ã;', 'Ä' ], [ 'Ä;', 'À' ], [ 'À;', 'Â' ], -// [ 'Â;', 'A' ], //causes issues + [ 'Â;', 'A' ], - [ 'A\u0060', 'À' ], //\u0060 = ` - [ 'A\u007E', 'Ã' ], //\u007E = ~ - [ 'A\u002E\u002E', 'Ạ' ], //\u002E = . -// [ 'Ạ\.\.', 'Ä' ], //messes up the rest - [ 'A\\^', 'Â' ], //\u005E = ^ + [ 'A\u0060', 'À' ], // u0060 = ` + [ 'A\u007E', 'Ã' ], // u007E = ~ + [ 'A\.\.', 'Ạ' ], + [ 'Ạ\.\.', 'Ä' ], + [ 'A\\^', 'Â' ], [ 'À\u0060', 'Á' ], [ 'E;', 'É' ], @@ -63,11 +62,11 @@ [ 'Ẽ;', 'Ë' ], [ 'Ë;', 'È' ], [ 'È;', 'Ê' ], -// [ 'Ê;', 'E' ], //causes issues + [ 'Ê;', 'E' ], [ 'E\u0060', 'È' ], [ 'E\u007E', 'Ẽ' ], - [ 'E\u002E\u002E', 'Ẹ' ], + [ 'E\.\.', 'Ẹ' ], [ 'E\\^', 'Ê' ], [ 'È\u0060', 'É' ], @@ -76,11 +75,11 @@ [ 'Ĩ;', 'Ï' ], [ 'Ï;', 'Ì' ], [ 'Ì;', 'Î' ], -// [ 'Î;', 'I' ], //causes issues + [ 'Î;', 'I' ], [ 'I\u0060', 'Ì' ], [ 'I\u007E', 'Ĩ' ], - [ 'I\u002E\u002E', 'Ï' ], + [ 'I\.\.', 'Ï' ], [ 'I\\^', 'Î' ], [ 'Ì\u0060', 'Í' ], @@ -89,12 +88,12 @@ [ 'Õ;', 'Ö' ], [ 'Ö;', 'Ò' ], [ 'Ò;', 'Ô' ], -// [ 'Ô;', 'O' ], + [ 'Ô;', 'O' ], [ 'O\u0060', 'Ò' ], [ 'O\u007E', 'Õ' ], - [ 'O\u002E\u002E', 'Ọ' ], -// [ 'Ọ\.\.', 'Ö' ], + [ 'O\.\.', 'Ọ' ], + [ 'Ọ\.\.', 'Ö' ], [ 'O\\^', 'Ô' ], [ 'Ò\u0060', 'Ó' ], @@ -103,15 +102,15 @@ [ 'Ũ;', 'Ü' ], [ 'Ü;', 'Ù' ], [ 'Ù;', 'Û' ], -// [ 'Û;', 'U' ], //causes issues + [ 'Û;', 'U' ], [ 'U\u0060', 'Ù' ], [ 'U\u007E', 'Ũ' ], - [ 'U\u002E\u002E', 'Ü' ], + [ 'U\.\.', 'Ü' ], [ 'U\\^', 'Û' ], [ 'Ù\u0060', 'Ú' ], - //lowercase + // lowercase [ 'z;', 't́' ], [ 'k;', 'ḱ' ], @@ -119,40 +118,40 @@ [ 'p;', 'ṕ' ], [ 'w;', 'ṕ' ], -// [ 'ḱ;', 'k' ], //works -// [ 'ć;', 'c' ], //works -// [ 't́;', 'z' ], //causes issues -// [ 'ṕ;', 'p' ], //works - + [ 'ḱ;', 'k' ], + [ 'ć;', 'c' ], + [ 't́;', 'z' ], + [ 'ṕ;', 'p' ], + [ 't;', 'ṭ' ], [ 'd;', 'ḍ' ], [ 'r;', 'ṛ' ], -// [ 't..', 'ṭ' ], //messes up z; > t́, outcome: z; p; > ṭṕ, for some reason -// [ 'd..', 'ḍ' ], //works, disabled for consistency with t.. > ṭ -// [ 'r..', 'ṛ' ], //works, disabled for consistency with t.. > ṭ - -// [ 'ṭ;', 't' ], //causes issues -// [ 'ḍ;', 'd' ], //works -// [ 'ṛ;', 'r' ], //works - + [ 't\.\.', 'ṭ' ], + [ 'd\.\.', 'ḍ' ], + [ 'r\.\.', 'ṛ' ], + + [ 'ṭ;', 't' ], + [ 'ḍ;', 'd' ], + [ 'ṛ;', 'r' ], + [ 'n;', 'ṅ' ], [ 'j;', 'ń' ], -// [ 'ṅ;', 'n' ], -// [ 'ń;', 'j' ], + [ 'ṅ;', 'n' ], + [ 'ń;', 'j' ], [ 'a;', 'á' ], [ 'á;', 'ã' ], [ 'ã;', 'ä' ], [ 'ä;', 'à' ], [ 'à;', 'â' ], -// [ 'â;', 'a' ], //causes issues + [ 'â;', 'a' ], - [ 'a\u0060', 'à' ], //\u0060 = ` - [ 'a\u007e', 'ã' ], //\u007e = ~ - [ 'a\u002e\u002e', 'ạ' ], //\u002e = . -// [ 'ạ\.\.', 'ä' ], //messes up the rest - [ 'a\\^', 'â' ], //\u005e = ^ + [ 'a\u0060', 'à' ], // u0060 = ` + [ 'a\u007e', 'ã' ], // u007e = ~ + [ 'a\.\.', 'ạ' ], + [ 'ạ\.\.', 'ä' ], + [ 'a\\^', 'â' ], [ 'à\u0060', 'á' ], [ 'e;', 'é' ], @@ -160,11 +159,11 @@ [ 'ẽ;', 'ë' ], [ 'ë;', 'è' ], [ 'è;', 'ê' ], -// [ 'ê;', 'e' ], //causes issues + [ 'ê;', 'e' ], [ 'e\u0060', 'è' ], [ 'e\u007e', 'ẽ' ], - [ 'e\u002e\u002e', 'ẹ' ], + [ 'e\.\.', 'ẹ' ], [ 'e\\^', 'ê' ], [ 'è\u0060', 'é' ], @@ -173,11 +172,11 @@ [ 'ĩ;', 'ï' ], [ 'ï;', 'ì' ], [ 'ì;', 'î' ], -// [ 'î;', 'i' ], //causes issues + [ 'î;', 'i' ], [ 'i\u0060', 'ì' ], [ 'i\u007e', 'ĩ' ], - [ 'i\u002e\u002e', 'ï' ], + [ 'i\.\.', 'ï' ], [ 'i\\^', 'î' ], [ 'ì\u0060', 'í' ], @@ -186,12 +185,12 @@ [ 'õ;', 'ö' ], [ 'ö;', 'ò' ], [ 'ò;', 'ô' ], -// [ 'ô;', 'o' ], + [ 'ô;', 'o' ], [ 'o\u0060', 'ò' ], [ 'o\u007e', 'õ' ], - [ 'o\u002e\u002e', 'ọ' ], -// [ 'ọ\.\.', 'ö' ], + [ 'o\.\.', 'ọ' ], + [ 'ọ\.\.', 'ö' ], [ 'o\\^', 'ô' ], [ 'ò\u0060', 'ó' ], @@ -200,29 +199,28 @@ [ 'ũ;', 'ü' ], [ 'ü;', 'ù' ], [ 'ù;', 'û' ], -// [ 'û;', 'u' ], //causes issues + [ 'û;', 'u' ], [ 'u\u0060', 'ù' ], [ 'u\u007e', 'ũ' ], - [ 'u\u002e\u002e', 'ü' ], + [ 'u\.\.', 'ü' ], [ 'u\\^', 'û' ], [ 'ù\u0060', 'ú' ], - //punctuation - [ '\u003C', '‹' ], //\u003C = < - [ '\u003E', '›' ],//\u003E = > + // punctuation + [ '\u003C', '‹' ], // u003C = < + [ '\u003E', '›' ], // u003E = > [ '››', '»' ], [ '‹‹', '«' ], [ '\\\\;', ';' ], - -// [ '\\\\\u007E', '\u007E' ], //\u007E = ~, \\\\ = \ -// [ '\\\\\u0060', '\u0060' ], //\u0060 = ` - [ '\\\\\\^', '\\^' ], - [ '\\\\‹', '\u003C' ], //\u003C = < - [ '\\\\›', '\u003E' ], //\u003E = > - - [ '\u002E;', '·' ] + [ '\\\\\u007E', '\u007E' ], // \u007E = ~ + [ '\\\\\u0060', '\u0060' ], // \u0060 = ` + [ '\\\^', '\u005E' ], + [ '\\\\‹', '\u003C' ], // \u003C = < + [ '\\\\›', '\u003E' ], // \u003E = > + [ '\.;', '·' ], + [ '\\\\\.;', '\.' ] ] }; diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index 48fb91bc..0eaec280 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -2448,11 +2448,11 @@ var palochkaVariants = { description: 'Ho Latin Semicolon test', inputmethod: 'hoc-latn-semicolon', tests: [ + { input: 'I;m pi..z; a\\; Sarak; a\\...', output: 'Ím pït́ a; Saraḱ a...', description: 'I;m pi..z; a\\; Sarak;' }, { input: 'K;C;Z;P;k;c;z;p;', output: 'ḰĆT́Ṕḱćt́ṕ', description: 'Ho consonants K;C;T;P;k;c;z;p;' }, { input: 'W;w;', output: 'Ṕṕ', description: 'Ho consonants W;w;' }, { input: 'T;D;R;t;d;r;', output: 'ṬḌṚṭḍṛ', description: 'Ho consonants T;D;R;t;d;r;' }, { input: 'N;J;n;j;', output: 'ṄŃṅń', description: 'Ho consonants N;J;n;j;' }, - { input: 'A;E;I;O;U;a;e;i;o;u;', output: 'ÁÉÍÓÚáéíóú', description: 'Ho vowels acute' }, { input: 'Á;É;Í;Ó;Ú;á;é;í;ó;ú;', output: 'ÃẼĨÕŨãẽĩõũ', description: 'Ho vowels tilde' }, { input: 'Ã;Ẽ;Ĩ;Õ;Ũ;ã;ẽ;ĩ;õ;ũ;', output: 'ÄËÏÖÜäëïöü', description: 'Ho vowels dieresis' }, @@ -2462,21 +2462,18 @@ var palochkaVariants = { { input: 'A~E~I~O~U~a~e~i~o~u~', output: 'ÃẼĨÕŨãẽĩõũ', description: 'Ho vowels A~E~I~O~U~a~e~i~o~u~' }, { input: 'A\u005EE\u005EI\u005EO\u005EU\u005Ea\u005Ee\u005Ei\u005Eo\u005Eu\u005E', output: 'ÂÊÎÔÛâêîôû', description: 'Ho vowels A^E^I^O^U^a^e^i^o^u^' }, { input: 'A..E..I..O..U..a..e..i..o..u..', output: 'ẠẸÏỌÜạẹïọü', description: 'Ho vowels A..E..I..O..U..a..e..i..o..u..' }, - { input: '.;', output: '·', description: 'Ho punctuation middle dot' }, { input: '\\;', output: ';', description: 'Ho punctuation \u005C;' }, { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes <><<››' } - - /* currently not implemented + { input: 'Maz;kamdak;', output: 'Mat́kamdaḱ', description: 'Maz;kamdak;' }, { input: 'Ṕ;', output: 'P', description: 'Ho consonants Ḱ reverse' }, { input: 'Ṭ; Ḍ; Ṛ;', output: 'T D R', description: 'Ho consonants TDR reverse' }, { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants T..D..R..' }, { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants NJ reverse' }, - { input: '~\\`\\^\\‹\\›', output: '~`^<>;', description: 'Ho punctuations \u005C~\u005C`\u005C^\u005C<\u005C>\u005C;' }, + { input: '\\~\\`\\^\\‹\\›', output: '~`^<>;', description: 'Ho punctuations \u005C~\u005C`\u005C^\u005C<\u005C>\u005C;' }, { input: 'a\u005C\u005E', output: 'a\u005E', description: 'Ho a\u005C\u005E' } { input: 'Ạ..Ẹ..Ï..Ọ..Ü..', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels Ạ..Ẹ..Ï..Ọ..Ü..' }, { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels reverse' } - */ ] }, { From d16182280be69c8c82fce9b30f4a19d6f03ce199 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sat, 8 Aug 2026 22:47:44 +0100 Subject: [PATCH 12/14] Update jquery.ime.test.fixtures.js missing comma --- test/jquery.ime.test.fixtures.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index 0eaec280..531a0f65 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -2464,7 +2464,7 @@ var palochkaVariants = { { input: 'A..E..I..O..U..a..e..i..o..u..', output: 'ẠẸÏỌÜạẹïọü', description: 'Ho vowels A..E..I..O..U..a..e..i..o..u..' }, { input: '.;', output: '·', description: 'Ho punctuation middle dot' }, { input: '\\;', output: ';', description: 'Ho punctuation \u005C;' }, - { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes <><<››' } + { input: '<>‹‹››', output: '‹›«»', description: 'Ho quotes <><<››' }, { input: 'Maz;kamdak;', output: 'Mat́kamdaḱ', description: 'Maz;kamdak;' }, { input: 'Ṕ;', output: 'P', description: 'Ho consonants Ḱ reverse' }, { input: 'Ṭ; Ḍ; Ṛ;', output: 'T D R', description: 'Ho consonants TDR reverse' }, From 7e5da9ba340592b2492999f25bbcea746e638ca7 Mon Sep 17 00:00:00 2001 From: Mangu Purty Date: Sun, 9 Aug 2026 00:46:57 +0100 Subject: [PATCH 13/14] update fixed errors --- rules/hoc-latn/hoc-latn-semicolon.js | 51 ++++++++++++++-------------- test/jquery.ime.test.fixtures.js | 35 +++++++++---------- 2 files changed, 44 insertions(+), 42 deletions(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index af5b4002..5e28d497 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -10,11 +10,11 @@ author: 'Mangu Purty', license: 'GPLv3', version: '1.0', - maxKeyLength: 3, + maxKeyLength: 4, patterns: [ - // uppercase + // uppercase [ 'Z;', 'T́' ], [ 'K;', 'Ḱ' ], [ 'C;', 'Ć' ], @@ -29,9 +29,9 @@ [ 'T;', 'Ṭ' ], [ 'D;', 'Ḍ' ], [ 'R;', 'Ṛ' ], - [ 'T\.\.', 'Ṭ' ], - [ 'D\.\.', 'Ḍ' ], - [ 'R\.\.', 'Ṛ' ], + [ 'T\\.\\.', 'Ṭ' ], + [ 'D\\.\\.', 'Ḍ' ], + [ 'R\\.\\.', 'Ṛ' ], [ 'Ṭ;', 'T' ], [ 'Ḍ;', 'D' ], @@ -52,8 +52,8 @@ [ 'A\u0060', 'À' ], // u0060 = ` [ 'A\u007E', 'Ã' ], // u007E = ~ - [ 'A\.\.', 'Ạ' ], - [ 'Ạ\.\.', 'Ä' ], + [ 'A\\.\\.', 'Ạ' ], + [ 'Ạ\\.\\.', 'Ä' ], [ 'A\\^', 'Â' ], [ 'À\u0060', 'Á' ], @@ -66,7 +66,8 @@ [ 'E\u0060', 'È' ], [ 'E\u007E', 'Ẽ' ], - [ 'E\.\.', 'Ẹ' ], + [ 'E\\.\\.', 'Ẹ' ], + [ 'Ẹ\\.\\.', 'Ë' ], [ 'E\\^', 'Ê' ], [ 'È\u0060', 'É' ], @@ -79,7 +80,7 @@ [ 'I\u0060', 'Ì' ], [ 'I\u007E', 'Ĩ' ], - [ 'I\.\.', 'Ï' ], + [ 'I\\.\\.', 'Ï' ], [ 'I\\^', 'Î' ], [ 'Ì\u0060', 'Í' ], @@ -92,8 +93,8 @@ [ 'O\u0060', 'Ò' ], [ 'O\u007E', 'Õ' ], - [ 'O\.\.', 'Ọ' ], - [ 'Ọ\.\.', 'Ö' ], + [ 'O\\.\\.', 'Ọ' ], + [ 'Ọ\\.\\.', 'Ö' ], [ 'O\\^', 'Ô' ], [ 'Ò\u0060', 'Ó' ], @@ -106,7 +107,7 @@ [ 'U\u0060', 'Ù' ], [ 'U\u007E', 'Ũ' ], - [ 'U\.\.', 'Ü' ], + [ 'U\\.\\.', 'Ü' ], [ 'U\\^', 'Û' ], [ 'Ù\u0060', 'Ú' ], @@ -126,9 +127,9 @@ [ 't;', 'ṭ' ], [ 'd;', 'ḍ' ], [ 'r;', 'ṛ' ], - [ 't\.\.', 'ṭ' ], - [ 'd\.\.', 'ḍ' ], - [ 'r\.\.', 'ṛ' ], + [ 't\\.\\.', 'ṭ' ], + [ 'd\\.\\.', 'ḍ' ], + [ 'r\\.\\.', 'ṛ' ], [ 'ṭ;', 't' ], [ 'ḍ;', 'd' ], @@ -149,8 +150,8 @@ [ 'a\u0060', 'à' ], // u0060 = ` [ 'a\u007e', 'ã' ], // u007e = ~ - [ 'a\.\.', 'ạ' ], - [ 'ạ\.\.', 'ä' ], + [ 'a\\.\\.', 'ạ' ], + [ 'ạ\\.\\.', 'ä' ], [ 'a\\^', 'â' ], [ 'à\u0060', 'á' ], @@ -163,7 +164,7 @@ [ 'e\u0060', 'è' ], [ 'e\u007e', 'ẽ' ], - [ 'e\.\.', 'ẹ' ], + [ 'e\\.\\.', 'ẹ' ], [ 'e\\^', 'ê' ], [ 'è\u0060', 'é' ], @@ -176,7 +177,7 @@ [ 'i\u0060', 'ì' ], [ 'i\u007e', 'ĩ' ], - [ 'i\.\.', 'ï' ], + [ 'i\\.\\.', 'ï' ], [ 'i\\^', 'î' ], [ 'ì\u0060', 'í' ], @@ -189,8 +190,8 @@ [ 'o\u0060', 'ò' ], [ 'o\u007e', 'õ' ], - [ 'o\.\.', 'ọ' ], - [ 'ọ\.\.', 'ö' ], + [ 'o\\.\\.', 'ọ' ], + [ 'ọ\\.\\.', 'ö' ], [ 'o\\^', 'ô' ], [ 'ò\u0060', 'ó' ], @@ -203,7 +204,7 @@ [ 'u\u0060', 'ù' ], [ 'u\u007e', 'ũ' ], - [ 'u\.\.', 'ü' ], + [ 'u\\.\\.', 'ü' ], [ 'u\\^', 'û' ], [ 'ù\u0060', 'ú' ], @@ -216,11 +217,11 @@ [ '\\\\;', ';' ], [ '\\\\\u007E', '\u007E' ], // \u007E = ~ [ '\\\\\u0060', '\u0060' ], // \u0060 = ` - [ '\\\^', '\u005E' ], + [ '\\\\\\^', '\^' ], [ '\\\\‹', '\u003C' ], // \u003C = < [ '\\\\›', '\u003E' ], // \u003E = > - [ '\.;', '·' ], - [ '\\\\\.;', '\.' ] + [ '\\.;', '·' ], + [ '([A-Za-zẠẸỌạẹọ])\\\\\\.\\.', '$1\.\.' ] ] }; diff --git a/test/jquery.ime.test.fixtures.js b/test/jquery.ime.test.fixtures.js index 531a0f65..9948e2f7 100644 --- a/test/jquery.ime.test.fixtures.js +++ b/test/jquery.ime.test.fixtures.js @@ -1,4 +1,4 @@ -// Variables for Cyrillic with palochka transliteration tests. +// Variables for Cyrillic with palochka transliteration tests. // All the characters are very similar in appearance, // so it's better to give them names to avoid confusion. // eslint-disable-next-line no-implicit-globals @@ -2433,22 +2433,10 @@ var palochkaVariants = { ] }, { - description: 'Ho Latin Tilde test', - inputmethod: 'hoc-latn-tilde', - tests: [ - { input: '~T~t~D~d~N~nN~/n~/~R~r', output: 'ṬṭḌḍṄṅŃńṚṛ', description: 'Ho consonants 1' }, - { input: 'K~/k~/C~/c~/T~/t~/P~/p~/', output: 'ḰḱĆćT́t́Ṕṕ', description: 'Ho consonants 2' }, - { input: 'A~/a~/E~/e~/I~/i~/O~/o~/U~/u~/', output: 'ÁáÉéÍíÓóÚú', description: 'Ho vowels 1' }, - { input: 'A~{a~{E~{e~{I~{i~{O~{o~{U~{u~{', output: 'ÃãẼẽĨĩÕõŨũ', description: 'Ho vowels 2' }, - { input: 'A~{~/a~{~/E~{~/e~{~/I~{~/i~{~/O~{~/o~{~/U~{~/u~{~/', output: 'Ã́ã́Ẽ́ẽ́Ĩ́ĩ́ṌṍṸṹ', description: 'Ho vowels 3' }, - { input: 'A~^a~^E~^e~^I~^i~^O~^o~^U~^u~^', output: 'ÂâÊêÎîÔôÛû', description: 'Ho vowels 4' }, - { input: 'A~\\a~\\E~\\e~\\I~\\i~\\O~\\o~\\U~\\u~\\', output: 'ÀàÈèÌìÒòÙù', description: 'Ho vowels 5' } - ] - }, { description: 'Ho Latin Semicolon test', inputmethod: 'hoc-latn-semicolon', tests: [ - { input: 'I;m pi..z; a\\; Sarak; a\\...', output: 'Ím pït́ a; Saraḱ a...', description: 'I;m pi..z; a\\; Sarak;' }, + { input: 'I;m pi..z; a\\; Sarak; a\\... a\\^', output: 'Ím pït́ a; Saraḱ a... a^', description: 'I;m pi..z; a\\; Sarak; a...' }, { input: 'K;C;Z;P;k;c;z;p;', output: 'ḰĆT́Ṕḱćt́ṕ', description: 'Ho consonants K;C;T;P;k;c;z;p;' }, { input: 'W;w;', output: 'Ṕṕ', description: 'Ho consonants W;w;' }, { input: 'T;D;R;t;d;r;', output: 'ṬḌṚṭḍṛ', description: 'Ho consonants T;D;R;t;d;r;' }, @@ -2470,12 +2458,25 @@ var palochkaVariants = { { input: 'Ṭ; Ḍ; Ṛ;', output: 'T D R', description: 'Ho consonants TDR reverse' }, { input: 'T..D..R..', output: 'ṬḌṚ', description: 'Ho consonants T..D..R..' }, { input: 'Ṅ;Ń;', output: 'NJ', description: 'Ho consonants NJ reverse' }, - { input: '\\~\\`\\^\\‹\\›', output: '~`^<>;', description: 'Ho punctuations \u005C~\u005C`\u005C^\u005C<\u005C>\u005C;' }, - { input: 'a\u005C\u005E', output: 'a\u005E', description: 'Ho a\u005C\u005E' } + { input: '\\~\\`\\^\\‹\\›\\;', output: '~`^<>;', description: 'Ho punctuations \u005C~\u005C`\u005C^\u005C<\u005C>\u005C;' }, + { input: 'a\u005C\u005E', output: 'a\u005E', description: 'Ho a\u005C\u005E' }, { input: 'Ạ..Ẹ..Ï..Ọ..Ü..', output: 'ÄËÏ..ÖÜ..', description: 'Ho vowels Ạ..Ẹ..Ï..Ọ..Ü..' }, { input: 'Â;Ê;Î;Ô;Û;', output: 'AEIOU', description: 'Ho vowels reverse' } ] }, + { + description: 'Ho Latin Tilde test', + inputmethod: 'hoc-latn-tilde', + tests: [ + { input: '~T~t~D~d~N~nN~/n~/~R~r', output: 'ṬṭḌḍṄṅŃńṚṛ', description: 'Ho consonants 1' }, + { input: 'K~/k~/C~/c~/T~/t~/P~/p~/', output: 'ḰḱĆćT́t́Ṕṕ', description: 'Ho consonants 2' }, + { input: 'A~/a~/E~/e~/I~/i~/O~/o~/U~/u~/', output: 'ÁáÉéÍíÓóÚú', description: 'Ho vowels 1' }, + { input: 'A~{a~{E~{e~{I~{i~{O~{o~{U~{u~{', output: 'ÃãẼẽĨĩÕõŨũ', description: 'Ho vowels 2' }, + { input: 'A~{~/a~{~/E~{~/e~{~/I~{~/i~{~/O~{~/o~{~/U~{~/u~{~/', output: 'Ã́ã́Ẽ́ẽ́Ĩ́ĩ́ṌṍṸṹ', description: 'Ho vowels 3' }, + { input: 'A~^a~^E~^e~^I~^i~^O~^o~^U~^u~^', output: 'ÂâÊêÎîÔôÛû', description: 'Ho vowels 4' }, + { input: 'A~\\a~\\E~\\e~\\I~\\i~\\O~\\o~\\U~\\u~\\', output: 'ÀàÈèÌìÒòÙù', description: 'Ho vowels 5' } + ] + }, { description: 'Ho Transliteration test', inputmethod: 'hoc-transliteration', @@ -22547,4 +22548,4 @@ var palochkaVariants = { { input: 'wang3', output: 'wǎng', description: 'Mandarin Hanyu Pinyin wǎng' } ] } -]; +]; \ No newline at end of file From 34de558941c53b6da40f8b03aac8654e975b833a Mon Sep 17 00:00:00 2001 From: SrishAkaTux Date: Wed, 12 Aug 2026 18:41:59 -0700 Subject: [PATCH 14/14] Update hoc-latn-semicolon.js --- rules/hoc-latn/hoc-latn-semicolon.js | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/hoc-latn/hoc-latn-semicolon.js b/rules/hoc-latn/hoc-latn-semicolon.js index 5e28d497..da590c48 100644 --- a/rules/hoc-latn/hoc-latn-semicolon.js +++ b/rules/hoc-latn/hoc-latn-semicolon.js @@ -13,7 +13,6 @@ maxKeyLength: 4, patterns: [ - // uppercase [ 'Z;', 'T́' ], [ 'K;', 'Ḱ' ],