Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
242 lines
8.1 KiB
JavaScript
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);
|
|
}
|
|
};
|
|
|
|
})();
|