Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import { constants } from "@keymanapp/ldml-keyboard-constants"; import { KMXPlus } from "@keymanapp/common-types"; import { BUILDER_ELEM, BUILDER_ELEM_REF, build_elem_index } from "./build-elem.js"; import { BUILDER_STRS, BUILDER_STR_REF, build_strs_index } from "./build-strs.js"; import { BUILDER_SECTION } from "./builder-section.js"; import Bksp = KMXPlus.Bksp; import Tran = KMXPlus.Tran; /* ------------------------------------------------------------------ * tran section ------------------------------------------------------------------ */ interface BUILDER_TRAN_GROUP { type: number; //type of group count: number; //count index: number; //index into subtable }; interface BUILDER_TRAN_TRANSFORM { from: BUILDER_STR_REF; //str to: BUILDER_STR_REF; //str mapFrom: BUILDER_ELEM_REF; // elem mapTo: BUILDER_ELEM_REF; // elem }; interface BUILDER_TRAN_REORDER { elements: BUILDER_ELEM_REF; //elem before: BUILDER_ELEM_REF; //elem }; export interface BUILDER_TRAN extends BUILDER_SECTION { groupCount: number; transformCount: number; reorderCount: number; groups: BUILDER_TRAN_GROUP[]; transforms: BUILDER_TRAN_TRANSFORM[]; reorders: BUILDER_TRAN_REORDER[]; }; /** * Builder for the 'tran', 'finl', and 'bksp' sections, all of which use the BUILDER_TRAN layout */ export function build_tran(source_tran: Tran | Bksp, sect_strs: BUILDER_STRS, sect_elem: BUILDER_ELEM): BUILDER_TRAN { if (!source_tran?.groups?.length) { return null; } const tran: BUILDER_TRAN = { ident: constants.hex_section_id(source_tran.id), size: 0, // need to compute total transforms + reorders _offset: 0, groupCount: source_tran.groups.length, transformCount: 0, reorderCount: 0, groups: [], transforms: [], reorders: [], }; for (const group of source_tran.groups) { if (group.type === constants.tran_group_type_transform) { tran.groups.push({ type: group.type, count: group.transforms.length, index: tran.transforms.length, // index of first item }); for (const transform of group.transforms) { tran.transforms.push({ from: build_strs_index(sect_strs, transform.from), to: build_strs_index(sect_strs, transform.to), mapFrom: build_strs_index(sect_strs, transform.mapFrom), mapTo: build_strs_index(sect_strs, transform.mapTo), }); } } else if (group.type === constants.tran_group_type_reorder) { tran.groups.push({ type: group.type, count: group.reorders.length, index: tran.reorders.length, // index of first item }); for (const reorder of group.reorders) { tran.reorders.push({ elements: build_elem_index(sect_elem, reorder.elements), before: build_elem_index(sect_elem, reorder.before), }); } } else { throw new Error(`Internal error: at transformGroup #${tran.groups.length + 1}: Unexpected transformGroup type ${group.type}`); } } // now set the sizes tran.transformCount = tran.transforms.length; tran.reorderCount = tran.reorders.length; tran.size = constants.length_tran + (constants.length_tran_group * source_tran.groups.length) + (constants.length_tran_transform * tran.transforms.length) + (constants.length_tran_reorder * tran.reorders.length); return tran; } |