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.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,242 @@
/* 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);
}
};
})();