Esempio n. 1
0
  private void Arg_itm_end(
      Xop_ctx ctx,
      Arg_nde_tkn nde,
      Arg_itm_tkn itm,
      int ws_bgn_idx,
      int ws_end_idx,
      int subs_len,
      int lxr_bgn,
      int wkr_typ,
      boolean key_exists,
      boolean cur_itm_is_key,
      boolean itm_is_static,
      byte[] src,
      int arg_idx) {
    // PURPOSE: mark tkns Ignore; find dat_bgn, dat_end
    int dat_bgn = itm.Src_bgn(), dat_end = lxr_bgn;
    boolean trim = false;
    // trim ws at bgn
    boolean wkr_is_not_prm = wkr_typ != Xop_arg_wkr_.Typ_prm;
    if (ws_bgn_idx
        != -1) { // ignore ws if (ws_found_at_bgn && (tmpl_arg || (lnki_arg && key))); lnki_arg &&
                 // val does not ignore at bgn; EX: [[alt= a b c]] -> " a b c"
      switch (wkr_typ) {
        case Xop_arg_wkr_.Typ_prm:
          trim = arg_idx == 0;
          break;
        case Xop_arg_wkr_.Typ_tmpl:
          trim = key_exists || arg_idx == 0;
          break;
        case Xop_arg_wkr_.Typ_lnki:
          trim = cur_itm_is_key || !key_exists;
          break; // NOTE: trim if "a= b"; skip if " a=b" or " a"
      }
      if (trim) {
        for (int i = 0; i <= ws_bgn_idx; i++) {
          Xop_tkn_itm sub_tkn = itm.Subs_get(i); // NOTE: tknTypeId should be space, newline, or tab
          if (wkr_is_not_prm)
            sub_tkn.Ignore_y_grp_(ctx, itm, i); // mark tkn ignore unless wkr is prm; SEE:NOTE_1
          if (i == ws_bgn_idx)
            dat_bgn = sub_tkn.Src_end_grp(itm, i); // if last_tkn, set dat_bgn to bgn
        }
      }
    }
    // trim ws at end
    if (ws_end_idx
        != -1) { // ignore ws if (ws_found_at_end && (tmpl_arg || (lnki_arg && val))); lnki_arg &&
                 // key does not ignore at end; EX: [[alt =a b c]] -> unrecognized nde ("alt ")
      trim = false;
      switch (wkr_typ) {
        case Xop_arg_wkr_.Typ_prm:
          trim = arg_idx == 0;
          break;
        case Xop_arg_wkr_.Typ_tmpl:
          trim = key_exists || arg_idx == 0;
          break; // NOTE: never set "trim = true";
                 // PAGE:fr.w:Histoire_de_la_marine_française_sous_Louis_XV_et_Louis_XVI
                 // DATE:2015-11-17
        case Xop_arg_wkr_.Typ_lnki:
          trim = !cur_itm_is_key;
          break;
      }
      if (trim) {
        for (int i = ws_end_idx; i < subs_len; i++) {
          Xop_tkn_itm sub_tkn = itm.Subs_get(i); // NOTE: tknTypeId should be space, newline, or tab
          if (wkr_is_not_prm)
            sub_tkn.Ignore_y_grp_(ctx, itm, i); // mark tkn ignore unless wkr is prm; SEE:NOTE_1
          if (i == ws_end_idx)
            dat_end = sub_tkn.Src_bgn_grp(itm, i); // if 1st_tkn; set dat_end to bgn
        }
      }
    }
    itm.Src_end_(lxr_bgn);
    nde.Src_end_(lxr_bgn); // NOTE: src_end is lxr_bgn; EX: {{a}} has src_end at 3; lxr_bgn for }}
    itm.Dat_rng_(
        dat_bgn,
        dat_end); // always set dat, even if itm has dynamic parts; EX: {{{ a{{{1}}}b }}} has 4,13,
                  // not 3,14 (ignore ws)

    //			if (itm_is_static)
    //				itm.Dat_ary_(dat_end == dat_bgn ? Bry_.Empty : Bry_.Mid(src, dat_bgn, dat_end));
    itm.Itm_static_(itm_is_static);
  }