1
1
import { Line , SerialMonitorOutput } from './serial-monitor-send-output' ;
2
2
3
- function writeOverLine ( line : Line , insert : string , cursorPosition : number ) : [ number , number ] {
4
- var lenBefore = line . message . length ;
3
+ function writeOverLine ( line : Line , insert : string , cursorPosition : number , charCount : number ) : [ number , number ] {
4
+ const lenBefore = line . message . length ;
5
5
line . message = line . message . substring ( 0 , cursorPosition ) + insert + line . message . substring ( cursorPosition + insert . length )
6
6
cursorPosition = cursorPosition + insert . length ;
7
7
line . lineLen = line . message . length ;
8
- return [ line . lineLen - lenBefore , cursorPosition ] ;
8
+ return [ charCount + ( line . lineLen - lenBefore ) , cursorPosition ] ;
9
9
}
10
10
11
- const escapeSequenceGoHome = '\x1B[H' ;
12
- const escapeSequenceClearScreen = '\x1B[2J' ;
11
+ const escape = '\x1B' ;
12
+ const escapeSequenceGoHome = escape + '[H' ;
13
+ const escapeSequenceClearScreen = escape + '[2J' ;
13
14
14
15
export function messagesToLines (
15
16
messages : string [ ] ,
@@ -28,17 +29,21 @@ export function messagesToLines(
28
29
let allMessages = messages . join ( '' ) ;
29
30
let overflow = null ;
30
31
31
- if ( allMessages . indexOf ( escapeSequenceGoHome ) >= 0 ) {
32
- const before = allMessages . substring ( 0 , allMessages . indexOf ( escapeSequenceGoHome ) ) ;
33
- const after = allMessages . substring ( allMessages . indexOf ( escapeSequenceGoHome ) + escapeSequenceGoHome . length ) ;
34
- const [ _lines , _charCount ] = messagesToLines ( [ before ] , prevLines , charCount , currentLineIndex , currentCursorPosition , separator ) ;
35
- return messagesToLines ( [ after ] , _lines , _charCount , 0 , 0 , separator ) ;
36
- } else if ( allMessages . indexOf ( escapeSequenceClearScreen ) >= 0 ) {
32
+ let goHomeSequenceIndex = allMessages . indexOf ( escapeSequenceGoHome ) ;
33
+ let clearScreenSequenceIndex = allMessages . indexOf ( escapeSequenceClearScreen ) ;
34
+ let lastEscapeIndex = allMessages . lastIndexOf ( escape ) ;
35
+
36
+ if ( goHomeSequenceIndex >= 0 ) {
37
+ const before = allMessages . substring ( 0 , goHomeSequenceIndex ) ;
38
+ const after = allMessages . substring ( goHomeSequenceIndex + escapeSequenceGoHome . length ) ;
39
+ const [ updatedLines , updatedCharCount ] = messagesToLines ( [ before ] , prevLines , charCount , currentLineIndex , currentCursorPosition , separator ) ;
40
+ return messagesToLines ( [ after ] , updatedLines , updatedCharCount , 0 , 0 , separator ) ;
41
+ } else if ( clearScreenSequenceIndex >= 0 ) {
37
42
const after = allMessages . substring ( allMessages . lastIndexOf ( escapeSequenceClearScreen ) + escapeSequenceClearScreen . length ) ;
38
43
return messagesToLines ( [ after ] , [ ] , 0 , 0 , 0 , separator ) ;
39
- } else if ( allMessages . lastIndexOf ( '\x1B' ) >= 0 ) {
40
- overflow = allMessages . substring ( allMessages . lastIndexOf ( '\x1B' ) ) ;
41
- const result = messagesToLines ( [ allMessages . substring ( 0 , allMessages . lastIndexOf ( '\x1B' ) ) ] , prevLines , charCount , currentLineIndex , currentCursorPosition , separator ) ;
44
+ } else if ( lastEscapeIndex >= 0 ) {
45
+ overflow = allMessages . substring ( lastEscapeIndex ) ;
46
+ const result = messagesToLines ( [ allMessages . substring ( 0 , lastEscapeIndex ) ] , prevLines , charCount , currentLineIndex , currentCursorPosition , separator ) ;
42
47
result [ 4 ] = overflow ;
43
48
return result ;
44
49
}
@@ -54,15 +59,11 @@ export function messagesToLines(
54
59
if ( currentLineIndex > prevLines . length - 1 ) {
55
60
prevLines . push ( { message : '' , lineLen : 0 , timestamp : new Date ( ) } ) ;
56
61
}
57
- let [ _addedCharacters , _currentCursorPosition ] = writeOverLine ( prevLines [ currentLineIndex ] , chunk , currentCursorPosition )
58
- charCount += _addedCharacters ;
59
- currentCursorPosition = _currentCursorPosition ;
62
+ [ charCount , currentCursorPosition ] = writeOverLine ( prevLines [ currentLineIndex ] , chunk , currentCursorPosition , charCount )
60
63
}
61
64
62
65
if ( i < chunks . length - 1 ) {
63
- let [ _addedCharacters , _currentCursorPosition ] = writeOverLine ( prevLines [ currentLineIndex ] , separator , currentCursorPosition )
64
- charCount += _addedCharacters ;
65
- currentCursorPosition = _currentCursorPosition ;
66
+ [ charCount , currentCursorPosition ] = writeOverLine ( prevLines [ currentLineIndex ] , separator , currentCursorPosition , charCount )
66
67
}
67
68
}
68
69
0 commit comments