applySubs static method

void applySubs(
  1. List<int> gls,
  2. int ci,
  3. Map<String, dynamic> tab,
  4. List<Map<String, dynamic>> llist,
)

Implementation

static void applySubs(List<int> gls, int ci, Map<String, dynamic> tab, List<Map<String,dynamic>> llist) {
  int rlim = gls.length - ci - 1;
  for (int j = 0; j < tab["tabs"].length; j++) {
    if (tab["tabs"][j] == null) continue;
    Map<String, dynamic> ltab = Map<String, dynamic>.from(tab["tabs"][j]);
    int? ind;
    if (ltab["coverage"] != null) {
      ind = Typr_LCTF.coverageIndex(ltab["coverage"], gls[ci]);
      if (ind == -1) continue;
    }

    var _ltype = tab["ltype"];
    var _fmt = ltab["fmt"];

    if (_ltype == 1) {
      if (_fmt == 1){
        gls[ci] = gls[ci] + (ltab["delta"] as int);
      }
      else{
        gls[ci] = ltab["newg"][ind];
      }
    }
    else if (_ltype == 4) {
      var vals = ltab["vals"][ind];

      for (int k = 0; k < vals.length; k++) {
        Map<String, dynamic> lig = vals[k];
        int rl = lig["chain"].length;
        if (rl > rlim) continue;
        bool good = true;
        int em1 = 0;
        for (int l = 0; l < rl; l++) {
          while (gls[ci + em1 + (1 + l)] == -1) em1++;
          if (lig["chain"][l] != gls[ci + em1 + (1 + l)]) good = false;
        }
        if (!good) continue;
        gls[ci] = lig["nglyph"];
        for (int l = 0; l < rl + em1; l++) gls[ci + l + 1] = -1;
        break;
      }
    }
    else if (_ltype == 5 && _fmt == 2) {
      int cind = Typr_LCTF.getInterval(ltab["cDef"], gls[ci]);
      var cls = ltab["cDef"][cind + 2], scs = ltab["scset"][cls];
      for (int i = 0; i < scs.length; i++) {
        var sc = scs[i], inp = sc.input;
        if (inp.length > rlim) continue;
        bool good = true;
        for (int l = 0; l < inp.length; l++) {
          var cind2 = Typr_LCTF.getInterval(ltab["cDef"], gls[ci + 1 + l]);
          if (cind == -1 && ltab["cDef"][cind2 + 2] != inp[l]) {
            good = false;
            break;
          }
        }
        if (!good) continue;
      }
    } else if (_ltype == 6 && _fmt == 3) {
      if (!_glsCovered(gls, ltab["backCvg"], ci - (ltab["backCvg"].length as int)))
        continue;
      if (!_glsCovered(gls, ltab["inptCvg"], ci)) continue;
      if (!_glsCovered(gls, ltab["ahedCvg"], ci + (ltab["inptCvg"].length as int)))
        continue;
      var lr = ltab["lookupRec"]; //console.warn(ci, gl, lr);
      for (int i = 0; i < lr.length; i += 2) {
        int cind = lr[i];
        Map<String,dynamic> tab2 = llist[lr[i + 1]];
        applySubs(gls, ci + cind, tab2, llist);
      }
    }
  }
}