Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
autoComplete: options.autoComplete ,
autoCompleteMenu: options.autoCompleteMenu ,
autoCompleteHint: !! options.autoCompleteHint
} ;
// Now inputs is an array of input, input being an array of char (thanks to JS using UCS-2 instead of UTF-8)
if ( Array.isArray( options.history ) ) {
inputs = options.history.map( str => string.unicode.toArray( str ).slice( 0 , options.maxLength ) ) ;
}
if ( options.default && typeof options.default === 'string' ) {
inputs.push( string.unicode.toArray( options.default ).slice( 0 , options.maxLength ) ) ;
}
else {
inputs.push( [] ) ;
}
var init = () => {
inputIndex = inputs.length - 1 ;
offset = boundOffset( offset ) ;
if ( options.y !== undefined ) {
options.x = options.x || 1 ;
this.moveTo.eraseLineAfter( options.x , options.y ) ;
finishInit( options.x , options.y ) ;
}
if ( charCode >= 0x80 ) {
// Unicode bytes per char guessing
if ( charCode < 0xc0 ) { continue ; } // We are in a middle of an unicode multibyte sequence... Something fails somewhere, we will just continue for now...
else if ( charCode < 0xe0 ) { bytes = 2 ; }
else if ( charCode < 0xf0 ) { bytes = 3 ; }
else if ( charCode < 0xf8 ) { bytes = 4 ; }
else if ( charCode < 0xfc ) { bytes = 5 ; }
else { bytes = 6 ; }
charBuffer[ 0 ] = charCode ;
charBuffer[ 1 ] = charBuffer[ 2 ] = charBuffer[ 3 ] = charBuffer[ 4 ] = charBuffer[ 5 ] = 0 ;
( await readStream( stream , bytes - 1 ) ).copy( charBuffer , 1 ) ;
char = charBuffer.toString( 'utf8' ) ;
codepoint = string.unicode.firstCodePoint( char ) ;
//this.emit( 'key' , char , [ char ] , { isCharacter: true , codepoint: codepoint , code: charBuffer } ) ;
this.emit( 'char' , char , codepoint ) ;
}
else {
// Standard ASCII
char = String.fromCharCode( charCode ) ;
//this.emit( 'key' , char , [ char ] , { isCharacter: true , codepoint: charCode , code: charCode } ) ;
this.emit( 'char' , char , charCode ) ;
}
}
} ;
this.newLine() ;
return 1 ;
// Carriage Return
// PTY may emit both a carriage return followed by a newline when a single newline is emitted from the real child process
case 0x0d :
this.moveTo( 1 ) ;
return 1 ;
// Escape
case 0x1b :
if ( index + 1 < chunk.length ) { return this.escapeSequence( chunk , index + 1 ) ; }
return 1 ;
default :
console.error( string.format( 'Not implemented: Control 0x%x' , chunk[ index ] ) ) ;
return 1 ;
}
} ;
fg = Math.floor( fg ) ;
bg = Math.floor( bg ) ;
if ( fg < 0 || fg > 255 || bg < 0 || bg > 255 ) { return '' ; }
// If the register is greater than 15, find the 0..15 register that is close to it
if ( fg > 15 ) { fg = this.root.registerForRgb( this.root.rgbForRegister( fg ) , 0 , 15 ) ; }
if ( bg > 15 ) { bg = this.root.registerForRgb( this.root.rgbForRegister( bg ) , 0 , 15 ) ; }
//console.log( 'fg bg: ' , fg , bg ) ;
fg = fgCursorTable[ fg ] ;
bg = bgCursorTable[ bg ] ;
return string.format( '\x1b[?16;%u;%uc' , fg , bg * 16 ) ;
}
} ,
if ( Terminal.osc[ num ] ) { Terminal.osc[ num ].call( this , sequence.slice( index + 1 ) ) ; }
else { console.error( 'Not implemented: OSC "' + num + '" (sequence: ' + sequence.slice( index + 1 ) + '")' ) ; }
}
else
{
console.log( "Trouble: NaN!" ) ;
}
}
return sequence.length + 2 + ( chunk[ i ] === 0x07 ? 1 : 2 ) ; // ESC + ] + sequence + Bell/ST
}
sequence += char ;
}
console.log( "Trouble: " + string.escape.control( chunk.toString() ) ) ;
// We should never reach here, except if the buffer was too short
return null ;
} ;
break ;
}
else if ( this.rKeymapStarter[ i ] && this.rKeymapStarter[ i ][ keymapStartCode ] ) {
// Then test pattern sequences
keymapList = this.rKeymapStarter[ i ][ keymapStartCode ] ;
//console.log( 'for i:' , keymapList ) ;
for ( j = 0 ; j < keymapList.length ; j ++ ) {
keymap = keymapList[ j ] ;
if ( keymap.altEnder ) {
regexp = '^' +
string.escape.regExp( keymap.starter ) +
'([ -~]*)' + // [ -~] match only all ASCII non-control character
'(' + string.escape.regExp( keymap.ender ) + '|' + string.escape.regExp( keymap.altEnder ) + ')' ;
}
else {
regexp = '^' +
string.escape.regExp( keymap.starter ) +
'([ -~]*)' + // [ -~] match only all ASCII non-control character
string.escape.regExp( keymap.ender ) ;
}
matches = keymapCode.match( new RegExp( regexp ) , 'g' ) ;
//console.log( 'for j:' , keymap , regexp , matches ) ;
if ( matches ) {
found = true ;
}
else if ( this.rKeymapStarter[ i ] && this.rKeymapStarter[ i ][ keymapStartCode ] ) {
// Then test pattern sequences
keymapList = this.rKeymapStarter[ i ][ keymapStartCode ] ;
//console.log( 'for i:' , keymapList ) ;
for ( j = 0 ; j < keymapList.length ; j ++ ) {
keymap = keymapList[ j ] ;
if ( keymap.altEnder ) {
regexp = '^' +
string.escape.regExp( keymap.starter ) +
'([ -~]*)' + // [ -~] match only all ASCII non-control character
'(' + string.escape.regExp( keymap.ender ) + '|' + string.escape.regExp( keymap.altEnder ) + ')' ;
}
else {
regexp = '^' +
string.escape.regExp( keymap.starter ) +
'([ -~]*)' + // [ -~] match only all ASCII non-control character
string.escape.regExp( keymap.ender ) ;
}
matches = keymapCode.match( new RegExp( regexp ) , 'g' ) ;
//console.log( 'for j:' , keymap , regexp , matches ) ;
if ( matches ) {
found = true ;
handlerResult = keymap.handler.call( this , keymap.name , matches[ 1 ] ) ;
"w": term.str.bgWhite() ,
"W": term.str.bgBrightWhite() ,
"y": term.str.bgYellow() ,
"Y": term.str.bgBrightYellow()
}
}
} ;
term.formatConfig.rawMarkupConfig = Object.create( term.formatConfig ) ;
term.formatConfig.rawMarkupConfig.startingMarkupReset = false ;
term.formatConfig.rawMarkupConfig.endingMarkupReset = false ;
for ( k in term.escHandler ) { term.formatConfig.fn[ k ] = term.escHandler[ k ] ; }
for ( k in term.escOffHandler ) { term.formatConfig.fn[ k + '_off' ] = term.escOffHandler[ k ] ; }
term.format = string.createFormatter( term.formatConfig ) ;
term.markup = string.createMarkup( term.formatConfig ) ;
term.options = options ;
// Should come after any escape sequence definitions
createOptimized( term ) ;
// Register various exit handler
// Fix the issue #3, turn grabInput off on exit
// Disable input grabbing at exit.
// Note: the terminal can still send some garbage if it was about to do it when exit kickin.
process.on( 'exit' , () => {
//console.log( '>>> exit' ) ;
// Cleanup was done from elsewhere, probably by .asyncCleanup()
if ( term.shutdown ) { return ; }
term.shutdown = true ;
"W": term.str.bgBrightWhite() ,
"y": term.str.bgYellow() ,
"Y": term.str.bgBrightYellow()
}
}
} ;
term.formatConfig.rawMarkupConfig = Object.create( term.formatConfig ) ;
term.formatConfig.rawMarkupConfig.startingMarkupReset = false ;
term.formatConfig.rawMarkupConfig.endingMarkupReset = false ;
for ( k in term.escHandler ) { term.formatConfig.fn[ k ] = term.escHandler[ k ] ; }
for ( k in term.escOffHandler ) { term.formatConfig.fn[ k + '_off' ] = term.escOffHandler[ k ] ; }
term.format = string.createFormatter( term.formatConfig ) ;
term.markup = string.createMarkup( term.formatConfig ) ;
term.options = options ;
// Should come after any escape sequence definitions
createOptimized( term ) ;
// Register various exit handler
// Fix the issue #3, turn grabInput off on exit
// Disable input grabbing at exit.
// Note: the terminal can still send some garbage if it was about to do it when exit kickin.
process.on( 'exit' , () => {
//console.log( '>>> exit' ) ;
// Cleanup was done from elsewhere, probably by .asyncCleanup()
if ( term.shutdown ) { return ; }
term.shutdown = true ;
term.styleReset() ;
width = 0 ;
height = data.length ;
attr = options.attr !== undefined ? options.attr : ScreenBuffer.prototype.DEFAULT_ATTR ;
if ( attr && typeof attr === 'object' && ! attr.BYTES_PER_ELEMENT ) { attr = ScreenBuffer.object2attr( attr ) ; }
attrTrans = attr ;
if ( options.transparencyChar ) {
if ( ! options.transparencyType ) { attrTrans |= TRANSPARENCY ; }
else { attrTrans |= options.transparencyType & TRANSPARENCY ; }
}
// Compute the width of the screenBuffer
for ( y = 0 ; y < data.length ; y ++ ) {
lineWidth = string.unicode.width( data[ y ] ) ;
if ( lineWidth > width ) { width = lineWidth ; }
}
// Create the buffer with the right width & height
screenBuffer = new ScreenBuffer( { width: width , height: height } ) ;
// Fill the buffer with data
for ( y = 0 ; y < data.length ; y ++ ) {
if ( ! options.transparencyChar ) {
screenBuffer.put( { x: 0 , y: y , attr: attr } , data[ y ] ) ;
}
else {
length = data[ y ].length ;
for ( x = 0 ; x < length ; x ++ ) {
if ( data[ y ][ x ] === options.transparencyChar ) {