All files / src/types/kmx/kmx-plus-builder build-tran.ts

43.68% Statements 45/103
100% Branches 0/0
0% Functions 0/1
43.68% Lines 45/103

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 1041x 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;
}