X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FParser.ts;h=1c2fb6b038e7bacbf4ed21d18c6f6397fab04984;hb=HEAD;hp=02028005e6e70544157f537bcd6d41722992fb71;hpb=6918e83787f4001053b02beda4f803710fc4df89;p=mirror_xterm.js.git diff --git a/src/Parser.ts b/src/Parser.ts index 0202800..1c2fb6b 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -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; } /**