public charAttributes()

in src/InputHandler.ts [1568:1692]


  public charAttributes(params: number[]): void {
    // Optimize a single SGR0.
    if (params.length === 1 && params[0] === 0) {
      this._terminal.curAttr = DEFAULT_ATTR;
      return;
    }

    const l = params.length;
    let flags = this._terminal.curAttr >> 18;
    let fg = (this._terminal.curAttr >> 9) & 0x1ff;
    let bg = this._terminal.curAttr & 0x1ff;
    let p;

    for (let i = 0; i < l; i++) {
      p = params[i];
      if (p >= 30 && p <= 37) {
        // fg color 8
        fg = p - 30;
      } else if (p >= 40 && p <= 47) {
        // bg color 8
        bg = p - 40;
      } else if (p >= 90 && p <= 97) {
        // fg color 16
        p += 8;
        fg = p - 90;
      } else if (p >= 100 && p <= 107) {
        // bg color 16
        p += 8;
        bg = p - 100;
      } else if (p === 0) {
        // default
        flags = DEFAULT_ATTR >> 18;
        fg = (DEFAULT_ATTR >> 9) & 0x1ff;
        bg = DEFAULT_ATTR & 0x1ff;
        // flags = 0;
        // fg = 0x1ff;
        // bg = 0x1ff;
      } else if (p === 1) {
        // bold text
        flags |= FLAGS.BOLD;
      } else if (p === 3) {
        // italic text
        flags |= FLAGS.ITALIC;
      } else if (p === 4) {
        // underlined text
        flags |= FLAGS.UNDERLINE;
      } else if (p === 5) {
        // blink
        flags |= FLAGS.BLINK;
      } else if (p === 7) {
        // inverse and positive
        // test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m'
        flags |= FLAGS.INVERSE;
      } else if (p === 8) {
        // invisible
        flags |= FLAGS.INVISIBLE;
      } else if (p === 2) {
        // dimmed text
        flags |= FLAGS.DIM;
      } else if (p === 22) {
        // not bold nor faint
        flags &= ~FLAGS.BOLD;
        flags &= ~FLAGS.DIM;
      } else if (p === 23) {
        // not italic
        flags &= ~FLAGS.ITALIC;
      } else if (p === 24) {
        // not underlined
        flags &= ~FLAGS.UNDERLINE;
      } else if (p === 25) {
        // not blink
        flags &= ~FLAGS.BLINK;
      } else if (p === 27) {
        // not inverse
        flags &= ~FLAGS.INVERSE;
      } else if (p === 28) {
        // not invisible
        flags &= ~FLAGS.INVISIBLE;
      } else if (p === 39) {
        // reset fg
        fg = (DEFAULT_ATTR >> 9) & 0x1ff;
      } else if (p === 49) {
        // reset bg
        bg = DEFAULT_ATTR & 0x1ff;
      } else if (p === 38) {
        // fg color 256
        if (params[i + 1] === 2) {
          i += 2;
          fg = this._terminal.matchColor(
            params[i] & 0xff,
            params[i + 1] & 0xff,
            params[i + 2] & 0xff);
          if (fg === -1) fg = 0x1ff;
          i += 2;
        } else if (params[i + 1] === 5) {
          i += 2;
          p = params[i] & 0xff;
          fg = p;
        }
      } else if (p === 48) {
        // bg color 256
        if (params[i + 1] === 2) {
          i += 2;
          bg = this._terminal.matchColor(
            params[i] & 0xff,
            params[i + 1] & 0xff,
            params[i + 2] & 0xff);
          if (bg === -1) bg = 0x1ff;
          i += 2;
        } else if (params[i + 1] === 5) {
          i += 2;
          p = params[i] & 0xff;
          bg = p;
        }
      } else if (p === 100) {
        // reset fg/bg
        fg = (DEFAULT_ATTR >> 9) & 0x1ff;
        bg = DEFAULT_ATTR & 0x1ff;
      } else {
        this._terminal.error('Unknown SGR attribute: %d.', p);
      }
    }

    this._terminal.curAttr = (flags << 18) | (fg << 9) | bg;
  }