UNPKG

@keymanapp/common-types

Version:

Keyman Developer keyboard file types

134 lines (132 loc) 5.99 kB
!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