VulpesOS/assets/webapps/keyboard.gaiamobile.org/js/imes/myanmar/myanmar.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

242 lines
8.1 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* jshint moz:true */
/* jshint unused:true */
/* global InputMethods */
(function() {
'use strict';
var keyboard;
var buffer = '';
var BACKSPACE = 8;
var M = {
consoTT: new RegExp('^(' +
'\u1000|\u1001|\u1002|\u1003|\u1005|\u1006|\u1007|\u1008|' +
'\u1009|\u100A|\u100B|\u100C|\u100D|\u100E|\u100F|\u1010|' +
'\u1011|\u1012|\u1013|\u1014|\u1015|\u1016|\u1017|\u1018|' +
'\u1019|\u101A|\u101B|\u101C|\u101D|\u101E|\u101F|\u1020|' +
'\u1021' + ')$'),
consoSA: new RegExp('^(' + '\u101E' + ')$'),
vowelIA: new RegExp('^(' +
'\u102D|\u102E|\u1032|\u1036|\u102F|\u1030|\u102B|\u102C' + ')$'),
vowelIU: new RegExp('^(' + '\u102D|\u102E|\u102F|\u1030' + ')$'),
vowelSI: new RegExp('^(' + '\u102D|\u102E' + ')$'),
vowelIN: new RegExp('^(' + '\u1032|\u1036' + ')$'),
vowelUU: new RegExp('^(' + '\u102F|\u1030' + ')$'),
vowelAA: new RegExp('^(' + '\u102B|\u102C' + ')$'),
vowelSU: new RegExp('^(' + '\u1025' + ')$'),
vowelDU: new RegExp('^(' + '\u1026' + ')$'),
vowelSO: new RegExp('^(' + '\u1029' + ')$'),
vowelSA: new RegExp('^(' + '\u102C' + ')$'),
vowelDI: new RegExp('^(' + '\u102E' + ')$'),
vowelSE: new RegExp('^(' + '\u1031' + ')$'),
vowelAI: new RegExp('^(' + '\u1032' + ')$'),
vowelAN: new RegExp('^(' + '\u1036' + ')$'),
vowelAU: new RegExp('^(' + '\u1037' + ')$'),
vowelVT: new RegExp('^(' + '\u1038|\u103A' + ')$'),
vowelVS: new RegExp('^(' + '\u1038' + ')$'),
vowelVR: new RegExp('^(' + '\u1039' + ')$'),
vowelAT: new RegExp('^(' + '\u103A' + ')$'),
mediaYH: new RegExp('^(' + '\u103B|\u103C|\u103D|\u103E' + ')$'),
mediaYW: new RegExp('^(' + '\u103B|\u103C|\u103D' + ')$'),
mediaYR: new RegExp('^(' + '\u103B|\u103C' + ')$'),
mediaYA: new RegExp('^(' + '\u103B' + ')$'),
mediaRA: new RegExp('^(' + '\u103C' + ')$'),
mediaWA: new RegExp('^(' + '\u103D' + ')$'),
mediaHA: new RegExp('^(' + '\u103E' + ')$'),
zeroLEN: new RegExp('^(' + '\u200B' + ')$')
};
//==================================================================
// \u103D + \u103E + \u1031 + \u103B => $4 + $1 + $2 + $3
// \u103D + \u103E + \u1031 + \u103C => $4 + $1 + $2 + $3
// \u103D + \u1031 + \u103B => $3 + $1 + $2
// \u103D + \u1031 + \u103C => $3 + $1 + $2
// \u103D + \u103E + \u103B => $3 + $1 + $2
// \u103D + \u103E + \u103C => $3 + $1 + $2
// \u103E + \u1031 + \u103B => $3 + $1 + $2
// \u103E + \u1031 + \u103C => $3 + $1 + $2
// \u103E + \u1031 + \u103D => $3 + $1 + $2
// \u1031 + \u1039 + consoTT[*] => $2 + $3 + $1
// \u200B + \u1031 + consoTT[*] => $3 + $2
// \u1031 + mediaYH[*] => $2 + $1
// \u1036 + \u1032 => $2 +$1
// \u1037 + vowelSI[*] => $2 + $1
// \u1037 + vowelIN[*] => $2 + $1
// \u1037 + vowelAA[*] => $2 + $1
// \u1037 + vowelUU[*] => $2 + $1
// \u1038 + \u1037 => $2 + $1
// \u103A + \u1037 => $2 + $1
// \u103D + \u103B => $2 + $1
// \u103D + \u103C => $2 + $1
// \u103E + \u103B => $2 + $1
// \u103E + \u103C => $2 + $1
// \u103E + \u103D => $2 + $1
// vowelUU[*] + vowelSI[*] => $2 + $1
// vowelIN[*] + vowelUU[*] => $2 + $1
// vowelIN[*] + vowelSI[*] => $2 + $1
//==================================================================
var SWAP_RULE = [
// p1 + p2 + p3 + p4 => p4 + p1 + p2 + p3
{ num: 4, out: 4, t:1, p1: M.mediaWA, p2: M.mediaHA, p3: M.vowelSE,
p4: M.mediaYR },
// p1 + p2 + p3 => p3 + p2
{ num: 3, out: 2, t:1, p1: M.zeroLEN, p2: M.vowelSE, p3: M.consoTT },
// p1 + p2 + p3 => p3 + p1 + p2
{ num: 3, out: 3, t:1, p1: M.mediaWA, p2: M.vowelSE, p3: M.mediaYR },
{ num: 3, out: 3, t:1, p1: M.mediaWA, p2: M.mediaHA, p3: M.mediaYR },
{ num: 3, out: 3, t:1, p1: M.mediaHA, p2: M.vowelSE, p3: M.mediaYW },
// p1 + p2 + p3 => p2 + p3 + p1
{ num: 3, out: 3, t:2, p1: M.vowelSE, p2: M.vowelVR, p3: M.consoTT },
// p1 + p2 => p2 + p1
{ num: 2, out: 2, t:1, p1: M.vowelSE, p2: M.mediaYH },
{ num: 2, out: 2, t:1, p1: M.vowelAN, p2: M.vowelAI },
{ num: 2, out: 2, t:1, p1: M.vowelAU, p2: M.vowelIA },
{ num: 2, out: 2, t:1, p1: M.vowelVT, p2: M.vowelAU },
{ num: 2, out: 2, t:1, p1: M.vowelUU, p2: M.vowelSI },
{ num: 2, out: 2, t:1, p1: M.vowelIN, p2: M.vowelIU },
{ num: 2, out: 2, t:1, p1: M.mediaWA, p2: M.mediaYR },
{ num: 2, out: 2, t:1, p1: M.mediaHA, p2: M.mediaYW }
];
//==================================================================
// \u1025 + \u102E => \u1026
// \u1025 + \u103A => \u1009 + \u103A
// \u101E + \u103C + \u1031 + \u102C + \u103A => \u102A
//==================================================================
var ADD_RULE = [
{ num: 2, out: '\u1026', p1: M.vowelSU, p2: M.vowelDI },
{ num: 2, out: '\u1009\u103A', p1: M.vowelSU, p2: M.vowelAT },
{ num: 5, out: '\u102A', p1: M.consoSA, p2: M.mediaRA, p3: M.vowelSE,
p4: M.vowelSA, p5: M.vowelAT }
];
//==================================================================
// \u1039 + consoTT[*] + \u1031 + < VK_BACK > => \u1039 + $filler + \u1031
// \u200B + consoTT[*] + \u1031 + < VK_BACK > => $filler + \u1031
// mediaYH[*] + \u1031 + < VK_BACK > => \u1031
// \u1039 + consoTT[*] + < VK_BACK > => NULL
// \u200B + \u1031 + < VK_BACK > => NULL
//==================================================================
var DEL_RULE = [
{num: 3, out: '\u1031\u1039', p1: M.vowelVR, p2: M.consoTT, p3: M.vowelSE},
{num: 2, out: '\u200B\u1031', p1: M.consoTT, p2: M.vowelSE},
{num: 2, out: '\u1031', p1: M.mediaYH, p2: M.vowelSE},
{num: 2, out: '', p1: M.vowelVR, p2: M.consoTT},
{num: 2, out: '', p1: M.zeroLEN, p2: M.vowelSE}
];
function myanParser(rule, callback) {
var idx = ['p0', 'p1', 'p2', 'p3', 'p4', 'p5'];
var len = buffer.length;
if (len < 2) {
return null;
}
for (var i = 0; i < rule.length; i++) {
if (len < rule[i].num) {
continue;
}
var c = len - 1;
for (var j = rule[i].num; j > 0; j--) {
if (!buffer[c--].match( rule[i][idx[j]] )) {
break;
}
}
if (j === 0) {
return callback(rule[i]);
}
}
return null;
}
function processBuffer(callback) {
var swap = myanParser(SWAP_RULE, function(entry) {
if (!entry) {
return null;
}
var len = buffer.length;
var tail = entry.t;
var out = entry.out;
var s = {};
s.num = entry.num;
s.str = buffer.substr(len-tail, tail) +
buffer.substr(len-out, out-tail);
return s;
});
// After process swap, check if the string need to be merged.
var adds = myanParser(ADD_RULE, function(entry) {
if (!entry) {
return null;
}
var s = {};
s.num = entry.num;
s.str = entry.out;
return s;
});
return (adds) ? callback(adds) : callback(swap);
}
function doDelete(callback) {
var dels = myanParser(DEL_RULE, function(entry) {
if (!entry) {
return null;
}
var s = {};
s.num = entry.num;
s.str = entry.out;
return s;
});
return (dels) ? callback(dels) : false;
}
function overrideInput(s) {
if(s) {
keyboard.replaceSurroundingText(s.str, -s.num, s.num);
return true;
}
return false;
}
InputMethods.myanmar = {
init: function(interfaceObject) {
keyboard = interfaceObject;
},
click: function(keycode) {
keyboard.setUpperCase({
isUpperCase: false
});
if (keycode == BACKSPACE) {
if(!doDelete(overrideInput)) {
keyboard.sendKey(keycode);
}
}
else {
if (String.fromCharCode(keycode) == '\u1031') {
// Send an extra zero length space on click of vowel sign E.
keyboard.sendKey('\u200B'.charCodeAt(0));
}
keyboard.sendKey(keycode);
}
},
surroundingtextChange: function(detail) {
buffer = detail.beforeString;
processBuffer(overrideInput);
}
};
})();