]> git.proxmox.com Git - mirror_xterm.js.git/blobdiff - src/Parser.ts
Merge pull request #926 from ficristo/search-fix
[mirror_xterm.js.git] / src / Parser.ts
index 02028005e6e70544157f537bcd6d41722992fb71..1c2fb6b038e7bacbf4ed21d18c6f6397fab04984 100644 (file)
@@ -4,7 +4,7 @@
 
 import { C0 } from './EscapeSequences';
 import { IInputHandler } from './Interfaces';
-import { CHARSETS } from './Charsets';
+import { CHARSETS, DEFAULT_CHARSET } from './Charsets';
 
 const normalStateHandler: {[key: string]: (parser: Parser, handler: IInputHandler) => void} = {};
 normalStateHandler[C0.BEL] = (parser, handler) => handler.bell();
@@ -52,7 +52,7 @@ escapedStateHandler['c'] = (parser, terminal) => {
 };
 escapedStateHandler['E'] = (parser, terminal) => {
   // ESC E Next Line ( NEL is 0x85).
-  terminal.x = 0;
+  terminal.buffer.x = 0;
   terminal.index();
   parser.setState(ParserState.NORMAL);
 };
@@ -70,10 +70,11 @@ escapedStateHandler['%'] = (parser, terminal) => {
   // ESC % Select default/utf-8 character set.
   // @ = default, G = utf-8
   terminal.setgLevel(0);
-  terminal.setgCharset(0, CHARSETS.US);
+  terminal.setgCharset(0, DEFAULT_CHARSET); // US (default)
   parser.setState(ParserState.NORMAL);
   parser.skipNextChar();
 };
+escapedStateHandler[C0.CAN] = (parser) => parser.setState(ParserState.NORMAL);
 
 const csiParamStateHandler: {[key: string]: (parser: Parser) => void} = {};
 csiParamStateHandler['?'] = (parser) => parser.setPrefix('?');
@@ -94,8 +95,9 @@ csiParamStateHandler['"'] = (parser) => parser.setPostfix('"');
 csiParamStateHandler[' '] = (parser) => parser.setPostfix(' ');
 csiParamStateHandler['\''] = (parser) => parser.setPostfix('\'');
 csiParamStateHandler[';'] = (parser) => parser.finalizeParam();
+csiParamStateHandler[C0.CAN] = (parser) => parser.setState(ParserState.NORMAL);
 
-const csiStateHandler: {[key: string]: (handler: IInputHandler, params: number[], prefix: string, postfix: string) => void} = {};
+const csiStateHandler: {[key: string]: (handler: IInputHandler, params: number[], prefix: string, postfix: string, parser: Parser) => void} = {};
 csiStateHandler['@'] = (handler, params, prefix) => handler.insertChars(params);
 csiStateHandler['A'] = (handler, params, prefix) => handler.cursorUp(params);
 csiStateHandler['B'] = (handler, params, prefix) => handler.cursorDown(params);
@@ -144,28 +146,7 @@ csiStateHandler['q'] = (handler, params, prefix, postfix) => {
 csiStateHandler['r'] = (handler, params) => handler.setScrollRegion(params);
 csiStateHandler['s'] = (handler, params) => handler.saveCursor(params);
 csiStateHandler['u'] = (handler, params) => handler.restoreCursor(params);
-
-// TODO: Many codes/charsets appear to not be supported
-// See: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
-const charsetMap = {
-  '0': CHARSETS.SCLD,
-  'A': CHARSETS.UK, // United Kingdom
-  'B': CHARSETS.US, // United States (USASCII)
-  '4': CHARSETS.Dutch,
-  'C': CHARSETS.Finnish,
-  '5': CHARSETS.Finnish,
-  'f': CHARSETS.French,
-  'Q': CHARSETS.FrenchCanadian,
-  'K': CHARSETS.German,
-  'Y': CHARSETS.Italian,
-  'E': CHARSETS.NorwegianDanish,
-  '6': CHARSETS.NorwegianDanish,
-  'Z': CHARSETS.Spanish,
-  'H': CHARSETS.Swedish,
-  '7': CHARSETS.Swedish,
-  '=': CHARSETS.Swiss,
-  '/': CHARSETS.ISOLatin // ISOLatin is actually /A
-};
+csiStateHandler[C0.CAN] = (handler, params, prefix, postfix, parser) => parser.setState(ParserState.NORMAL);
 
 enum ParserState {
   NORMAL = 0,
@@ -200,9 +181,13 @@ export class Parser {
    *
    * @param data The data to parse.
    */
-  public parse(data: string) {
+  public parse(data: string): ParserState {
     let l = data.length, j, cs, ch, code, low;
 
+    if (this._terminal.debug) {
+      this._terminal.log('data: ' + data);
+    }
+
     this._position = 0;
     // apply leftover surrogate high from last write
     if (this._terminal.surrogate_high) {
@@ -371,13 +356,13 @@ export class Parser {
           break;
 
         case ParserState.CHARSET:
-          if (ch in charsetMap) {
-            cs = charsetMap[ch];
+          if (ch in CHARSETS) {
+            cs = CHARSETS[ch];
             if (ch === '/') { // ISOLatin is actually /A
               this.skipNextChar();
             }
           } else {
-            cs = CHARSETS.US; // Default
+            cs = DEFAULT_CHARSET;
           }
           this._terminal.setgCharset(this._terminal.gcharset, cs);
           this._terminal.gcharset = null;
@@ -477,7 +462,10 @@ export class Parser {
 
         case ParserState.CSI:
           if (ch in csiStateHandler) {
-            csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix);
+            if (this._terminal.debug) {
+              this._terminal.log(`CSI ${this._terminal.prefix ? this._terminal.prefix : ''} ${this._terminal.params ? this._terminal.params.join(';') : ''} ${this._terminal.postfix ? this._terminal.postfix : ''} ${ch}`);
+            }
+            csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix, this);
           } else {
             this._terminal.error('Unknown CSI code: %s.', ch);
           }
@@ -490,6 +478,8 @@ export class Parser {
         case ParserState.DCS:
           if (ch === C0.ESC || ch === C0.BEL) {
             if (ch === C0.ESC) this._position++;
+            let pt;
+            let valid: boolean;
 
             switch (this._terminal.prefix) {
               // User-Defined Keys (DECUDK).
@@ -499,8 +489,8 @@ export class Parser {
               // Request Status String (DECRQSS).
               // test: echo -e '\eP$q"p\e\\'
               case '$q':
-                let pt = this._terminal.currentParam
-                valid = false;
+                pt = this._terminal.currentParam;
+                valid = false;
 
                 switch (pt) {
                   // DECSCA
@@ -516,9 +506,9 @@ export class Parser {
                   // DECSTBM
                   case 'r':
                     pt = ''
-                      + (this._terminal.scrollTop + 1)
+                      + (this._terminal.buffer.scrollTop + 1)
                       + ';'
-                      + (this._terminal.scrollBottom + 1)
+                      + (this._terminal.buffer.scrollBottom + 1)
                       + 'r';
                     break;
 
@@ -545,9 +535,8 @@ export class Parser {
               // This can cause a small glitch in vim.
               // test: echo -ne '\eP+q6b64\e\\'
               case '+q':
-                // TODO: Don't declare pt twice
-                /*let*/ pt = this._terminal.currentParam
-                , valid = false;
+                pt = this._terminal.currentParam;
+                valid = false;
 
                 this._terminal.send(C0.ESC + 'P' + +valid + '+r' + pt + C0.ESC + '\\');
                 break;
@@ -582,6 +571,7 @@ export class Parser {
           break;
       }
     }
+    return this._state;
   }
 
   /**