UNPKG

terminal.js

Version:

terminal emulation library for javascript.

490 lines (437 loc) 9.86 kB
"use strict"; // function(cmd, n, m, args, mod); /** * csi command handlers * @enum {Function|string} * @readonly * @this refers to calling {@link Terminal} */ var csi = { /** * CSI Ps @ <br> * Insert Ps (Blank) Character(s) (default = 1) (ICH) */ "@": function(cmd, n, m, args, mod) { this.state.insertBlank(n || 1); }, /** * CSI Ps A <br> * Cursor Up Ps Times (default = 1) (CUU) */ "A": function(cmd, n, m, args, mod) { this.state.mvCursor(0, -(n || 1)); }, /** * CSI Ps B <br> * Cursor Down Ps Times (default = 1) (CUD) */ "B": function(cmd, n, m, args, mod) { this.state.mvCursor(0, n || 1); }, /** * CSI Ps C <br> * Cursor Forward Ps Times (default = 1) (CUF) */ "C": function(cmd, n, m, args, mod) { this.state.mvCursor(n || 1, 0); }, /** * CSI Ps D <br> * Cursor backward Ps Times (default = 1) (CUB) */ "D": function(cmd, n, m, args, mod) { this.state.mvCursor(-(n || 1), 0); }, /** * CSI Ps E <br> * Cursor down Ps Rows, to column 1 (default = 1) (CNL , NEL) */ "E": function(cmd, n, m, args, mod) { this.state.mvCursor(0, n || 1).setCursor(0, null); }, /** * CSI Ps F <br> * Cursor Preceding Line PS Times (default = 1) (CPL) */ "F": function(cmd, n, m, args, mod) { // (vt52 compatibility mode - Use special graphics character set? ) this.state.mvCursor(0, -n || -1).setCursor(0, null); }, /** * CSI Ps G <br> * Cursor Character Absolute [column] (default = [row,1]) (CHA) */ "G": function(cmd, n, m, args, mod) { //vt52 compatibility mode - Use normal US/UK character set ) this.state.setCursor((n || 1) - 1); }, /** * CSI Ps ; Ps H <br> * Cursor Position [row;column] (default = [1,1]) (CUP) */ "H": function(cmd, n, m, args, mod) { this.state.setCursor((m || 1) - 1, (n || 1) - 1); }, /** * CSI Ps I <br> * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT) */ "I": function(cmd, n, m, args, mod) { this.state.mvTab(n || 1); }, /** * CSI Ps J <br> * Erase in Display (default = 0) (ED) * <ul> * <li>J - erase from cursor to end of display</li> * <li>0J - erase from cursor to end of display</li> * <li>1J - erase from start to cursor</li> * <li>2J - erase whole display</li> * </ul> */ "J": function(cmd, n, m, args, mod) { this.state.eraseInDisplay(n || 0); }, /** * CSI Ps K <br> * Erase in Line (default = 0) (EL) * <ul> * <li>K - erase from cursor to end of line</li> * <li>0K - erase from cursor to end of line</li> * <li>1K - erase from start of line to cursor</li> * <li>2K - erase whole line</li> * </ul> */ "K": function(cmd, n, m, args, mod) { this.state.eraseInLine(n || 0); }, /** * CSI Ps L <br> * Insert Ps Line(s) (default = 1) (IL) */ "L": function(cmd, n, m, args, mod) { this.state.insertLine(n || 1); this.state.setCursor(0, null); }, /** * CSI Ps M <br> * Delete Ps Line(s) (default = 1) (DL) */ "M": function(cmd, n, m, args, mod) { this.state.removeLine(n || 1); }, /** * CSI Ps P <br> * Delete Ps Character(s) (default = 1) (DCH) */ "P": function(cmd, n, m, args, mod) { this.state.removeChar(n || 1); }, /** * CSI Pl ; Pc R <br> * Report cursor pAosition (CPR)<br> * <ul> * <li>Pl indicates what line the cursor is on</li> * <li>Pr indicated what row the cursor is on</li> * </ul> * @todo implement */ "R": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Ps S <br> * Scroll up Ps lines (default = 1) (SU) */ "S": function(cmd, n, m, args, mod) { this.state.scroll(n || 1); }, /** * CSI Ps T <br> * Scroll down Ps lines (default = 1) (SD) <br> * CSI Ps ; Ps ; Ps ; Ps ; Ps T <br> * Initiate highlight mouse tracking <br> * CSI > Ps; Ps T <br> * @todo handle ">" mode */ "T": function(cmd, n, m, args, mod) { if(args.length <= 1) this.state.scroll(-n || -1); }, /** * CSI Ps X <br> * Erase Ps Character(s) (default = 1) (ECH) */ "X": function(cmd, n, m, args, mod) { this.state.eraseCharacters(n || 1); }, /** * CSI Ps Z <br> * Cursor Backward Tabulation Ps tab stops (default = 1) (CBT) */ "Z": function(cmd, n, m, args, mod) { this.state.mvTab(-(n || 1)); }, /** * CSI Ps a <br> * Move cursor right the indicated # of columns (default = 1) (HPR) */ "a": function(cmd, n, m, args, mod) { this.state.mvCursor(n || 1, 0); }, /** * CSI Ps b <br> * Repeat the preceding graphic character Ps times (REP) */ "b": function(cmd, n, m, args, mod) { // TODO }, /** * CSI P s c <br> * Send Device Attributes (Primary DA) <br> * CSI > P s c <br> * Send Device Attributes (Secondary DA) <br> */ "c": function(cmd, n, m, args, mod) { // TODO this.emit("request", "\x1b>0;95;c"); }, /** * CSI Pm d <br> * Line Position Absolute [row] (default = [1,column]) (VPA) */ "d": function(cmd, n, m, args, mod) { this.state.setCursor(null, (n || 1) - 1); }, /** * CSI Pm e <br> * Vertical position relative. * Move cursor down the indicated # of rows (default = 1) (VPR) */ "e": function(cmd, n, m, args, mod) { this.state.mvCursor(0, n || 1); }, /** * CSI Ps ; Ps f <br> * Horizontal and Vertical Position [row;column] (default = [1,1]) (HVP) */ "f": function(cmd, n, m, args, mod) { this.state.setCursor((m || 1) - 1, (n || 1) - 1); }, /** * CSI Ps g <br> * Tab Clear (default = 0) (TBC) */ "g": function(cmd, n, m, args, mod) { // 0g = clear tab stop at the current position // 3g = delete all tab stops // TODO this.state.tabClear(n || 0); }, /** * CSI Pm h <br> * Set Mode (SM) <br> * CSI ? Pm h - mouse escape codes, cursor escape codes <br> */ "h": function(cmd, n, m, args, mod) { var i; for(i = 0; i < args.length; i++) this.callHandler("mode", mod+args[i], true); }, /** * CSI Pm i Media Copy (MC) <br> * CSI ? Pm i <br> */ "i": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Pm l Reset Mode (RM) <br> * CSI ? Pm l <br> */ "l": function(cmd, n, m, args, mod) { var i; for(i = 0; i < args.length; i++) this.callHandler("mode", mod+args[i], false); }, /** * CSI Pm m <br> * Character Attributes (SGR) <br> * CSI > Ps; Ps m <br> */ "m": function(cmd, n, m, args, mod) { // Set graphic rendition var i; if(args[1] === 5 && args[0] === 38) this.state.setAttribute("fg", args[2]); else if(args[1] === 5 && args[0] === 48) this.state.setAttribute("bg", args[2]); else { for(i = 0; i < args.length; i++) this.callHandler("sgr", args[i]); if(i === 0) this.callHandler("sgr", 0); } }, /** * CSI Ps n Device Status Report (DSR) <br> * CSI > Ps n <br> * <ul> * <li>5n - Device Status report</li> * <li>0n - Response: terminal is OK</li> * <li>3n - Response: terminal is not OK</li> * <li>6n - Request cursor position (CPR)</li> * </ul> * @todo implement */ "n": function(cmd, n, m, args, mod) { // TODO }, /** * CSI > Ps p Set pointer mode <br> * CSI ! p Soft terminal reset (DECSTR) <br> * CSI Ps$ p <br> * Request ANSI mode (DECRQM) <br> * CSI ? Ps$ p <br> * Request DEC private mode (DECRQM) <br> * CSI Ps ; Ps " p <br> */ "p": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Ps q <br> * Load LEDs (DECLL) <br> * CSI Ps SP q <br> * CSI Ps " q <br> * <ul> * <li>0q - turn off all four leds</li> * <li>1q - turn on Led #1</li> * <li>2q - turn on Led #2</li> * <li>3q - turn on Led #3</li> * <li>4q - turn on Led #4</li> * </ul> */ "q": function(cmd, n, m, args, mod) { if(n === 0) this.state.resetLeds(); else this.state.ledOn(n-1); }, /** * CSI Ps ; Ps r <br> * Set Scrolling Region [top;bottom] (default = full size of window) * (DECSTBM) <br> * CSI ? Pm r <br> * CSI Pt; Pl; Pb; Pr; Ps$ r <br> */ "r": function(cmd, n, m, args, mod) { // TODO handle ? prefix, $ ends this.state.setScrollRegion((n || 1) -1 , (m || (this.state.rows) ) -1); }, /** * CSI ? Pm s <br> * Save cursor (ANSI.SYS) */ "s": function(cmd, n, m, args, mod) { this.state.saveCursor(); }, /** * CSI t <br> * unknown * @todo implement */ "t": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Ps SP u <br> * Restore cursor (ANSI.SYS) */ "u": function(cmd, n, m, args, mod) { this.state.restoreCursor(); }, /** * CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v <br> * (DECCRA) * @todo implement */ "v": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Pt ; Pl ; Pb ; Pr " w <br> * (DECEFR) * @todo implement */ "w": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Ps x Request Terminal Parameters (DECREQTPARM) <br> * CSI Ps x Select Attribute Change Extent (DECSACE) <br> * CSI Pc; Pt; Pl; Pb; Pr$ x <br> * @todo implement */ "x": function(cmd, n, m, args, mod) { // TODO }, /** * Request Checksum of Rectangular Area * DECRQCRA * @todo implement */ "y": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Ps ; Pu " z <br> * CSI Pt; Pl; Pb; Pr$ z <br> * (DECELR) / (DECERA) * Erase rectangular area */ "z": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Pm ` Character Position Absolute <br> * [column] (default = [row,1]) (HPA) */ "`": function(cmd, n, m, args, mod) { this.state.setCursor((n || 1) - 1); }, /** * CSI Pm " { <br> * CSI Pt; Pl; Pb; Pr$ { <br> * Selectively erase retangular area (DECSLE) / (DECSERA) * @todo implement */ "{": function(cmd, n, m, args, mod) { // TODO }, /** * CSI Ps " | <br> * Request locator position (DECRQLP) * @todo implement */ "|": function(cmd, n, m, args, mod) { // TODO }, /** * CSI P m SP } <br> * Insert P s Column(s) (default = 1) (DECIC), VT420 and up * @todo implement */ "}": function(cmd, n, m, args, mod) { // TODO }, /** * CSI P m SP ~ <br> * Delete P s Column(s) (default = 1) (DECDC), VT420 and up * @todo implement */ "~": function(cmd, n, m, args, mod) { // TODO } }; module.exports = csi;