@keymanapp/common-types
Version:
Keyman Developer keyboard file types
134 lines (132 loc) • 5.99 kB
JavaScript
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="93c8e17c-ef9f-585e-8936-8cdd80f9a2f2")}catch(e){}}();
import { constants } from '@keymanapp/ldml-keyboard-constants';
import { ElementParser, ElementSegment, ElementType } from '../../ldml-keyboard/pattern-parser.js';
import * as util from '../../util/util.js';
var MATCH_HEX_ESCAPE = util.MATCH_HEX_ESCAPE;
var unescapeOneQuadString = util.unescapeOneQuadString;
export var ElemElementFlags;
(function (ElemElementFlags) {
ElemElementFlags[ElemElementFlags["none"] = 0] = "none";
ElemElementFlags[ElemElementFlags["type"] = constants.elem_flags_type] = "type";
ElemElementFlags[ElemElementFlags["tertiary_base"] = constants.elem_flags_tertiary_base] = "tertiary_base";
ElemElementFlags[ElemElementFlags["prebase"] = constants.elem_flags_prebase] = "prebase";
})(ElemElementFlags || (ElemElementFlags = {}));
;
export class ElemElement {
value; // UnicodeSet or UCS32LE character
uset;
order; // -128 to +127; used only by reorder element values
tertiary; // -128 to +127; used only by reorder element values
flags;
isEqual(a) {
return a.value.isEqual(this.value) &&
a.order === this.order &&
a.tertiary === this.tertiary &&
a.flags === this.flags;
}
}
;
export class ElementString extends Array {
/**
* @param source if a string array, does not get reinterpreted as UnicodeSet. This is used with vars, etc. Or pass `["str"]` for an explicit 1-element elem.
* If it is a string, will be interpreted per reorder element rules.
*/
static fromStrings(sections, source, order, tertiary, tertiary_base, prebase) {
// the returned array
const array = new ElementString();
if (!source) {
return array;
}
let items;
if (Array.isArray(source)) {
items = source.map(segment => new ElementSegment(segment, ElementType.string));
}
else {
// use segmenter to analyze each part
items = ElementParser.segment(source);
}
let orders = order ? order.split(" ") : [];
if (orders.length == 1) {
orders = Array(items.length).fill(orders[0]);
}
let tertiaries = tertiary ? tertiary.split(" ") : [];
if (tertiaries.length == 1) {
tertiaries = Array(items.length).fill(tertiaries[0]);
}
let tertiary_bases = tertiary_base ? tertiary_base.split(" ") : [];
if (tertiary_bases.length == 1) {
tertiary_bases = Array(items.length).fill(tertiary_bases[0]);
}
let prebases = prebase ? prebase.split(" ") : [];
if (prebases.length == 1) {
prebases = Array(items.length).fill(prebases[0]);
}
for (let i = 0; i < items.length; i++) {
let elem = new ElemElement();
const item = items[i];
let typeFlag = 0;
if (item.type === ElementType.uset) {
typeFlag |= constants.elem_flags_type_uset;
// TODO-LDML: err on max buffer size
const needRanges = sections.usetparser.sizeUnicodeSet(item.segment);
if (needRanges < 0) {
// Note that sizeUnicodeSet() already will notify via callback if there's an
// error. So we can just exit here.
return null; // UnicodeSet error
}
const uset = sections.usetparser.parseUnicodeSet(item.segment, needRanges);
if (!uset) {
return null; // UnicodeSet error already thrown
}
elem.uset = sections.uset.allocUset(uset, sections);
elem.value = sections.strs.allocString('', { singleOk: true }); // no string
}
else if (item.type === ElementType.codepoint || item.type === ElementType.escaped || item.type === ElementType.string) {
// some kind of a string
let str = item.segment;
if (item.type === ElementType.escaped && !MATCH_HEX_ESCAPE.test(str)) {
str = unescapeOneQuadString(str);
// TODO-LDML: any other escape forms here?
elem.value = sections.strs.allocString(str, { singleOk: true });
}
else {
elem.value = sections.strs.allocString(str, { unescape: true, singleOk: true });
}
// Now did we end up with one char or no?
if (elem.value.isOneChar) {
typeFlag |= constants.elem_flags_type_char;
}
else {
typeFlag |= constants.elem_flags_type_str;
}
}
elem.order = orders.length ? this.parseIntOrZero(orders[i]) : 0;
elem.tertiary = tertiaries.length ? this.parseIntOrZero(tertiaries[i]) : 0;
elem.flags = ElemElementFlags.none |
(ElemElementFlags.type & typeFlag) |
(tertiary_bases?.[i] == '1' /* TODO-LDML: or 'true'? */ ? ElemElementFlags.tertiary_base : 0) |
(prebases?.[i] == '1' /* TODO-LDML: or 'true'? */ ? ElemElementFlags.prebase : 0);
array.push(elem);
}
;
return array;
}
isEqual(a) {
if (a.length != this.length) {
return false;
}
for (let i = 0; i < a.length; i++) {
if (!this[i].isEqual(a[i])) {
return false;
}
}
return true;
}
static parseIntOrZero(str) {
const num = parseInt(str, 10);
return !Number.isNaN(num) ? num : 0;
}
}
;
//# sourceMappingURL=element-string.js.map
//# debugId=93c8e17c-ef9f-585e-8936-8cdd80f9a2f2