@@ -26,6 +26,7 @@ var readline = require( 'readline' );
26
26
var logger = require ( 'debug' ) ;
27
27
var format = require ( '@stdlib/string/format' ) ;
28
28
var setNonEnumerableReadOnly = require ( '@stdlib/utils/define-nonenumerable-read-only-property' ) ;
29
+ var isEmptyArray = require ( '@stdlib/assert/is-empty-array' ) ;
29
30
var objectKeys = require ( '@stdlib/utils/keys' ) ;
30
31
var omit = require ( '@stdlib/utils/omit' ) ;
31
32
var hasOwnProp = require ( '@stdlib/assert/has-own-property' ) ;
@@ -54,6 +55,26 @@ function tokenComparator( a, b ) {
54
55
return a . start - b . start ;
55
56
}
56
57
58
+ /**
59
+ * Removes duplicate tokens from a sorted tokens array.
60
+ *
61
+ * @private
62
+ * @param {Array<Object> } tokens - sorted tokens array
63
+ * @returns {Array<Object> } array with unique tokens
64
+ */
65
+ function removeDuplicateTokens ( tokens ) {
66
+ var out = [ ] ;
67
+ var i ;
68
+
69
+ out . push ( tokens [ 0 ] ) ;
70
+ for ( i = 1 ; i < tokens . length ; i ++ ) {
71
+ if ( tokens [ i - 1 ] . start !== tokens [ i ] . start ) {
72
+ out . push ( tokens [ i ] ) ;
73
+ }
74
+ }
75
+ return out ;
76
+ }
77
+
57
78
58
79
// MAIN //
59
80
@@ -125,8 +146,7 @@ setNonEnumerableReadOnly( SyntaxHighlighter.prototype, '_highlightLine', functio
125
146
var i ;
126
147
var j ;
127
148
128
- // Sort and traverse the tokens...
129
- tokens . sort ( tokenComparator ) ;
149
+ // Traverse the tokens...
130
150
for ( i = 0 ; i < tokens . length ; i ++ ) {
131
151
token = tokens [ i ] ;
132
152
color = theme [ token . type ] ;
@@ -309,11 +329,15 @@ setNonEnumerableReadOnly( SyntaxHighlighter.prototype, 'onKeypress', function on
309
329
// Tokenize:
310
330
debug ( 'Line change detected. Tokenizing line: %s' , this . _rli . line ) ;
311
331
tokens = tokenizer ( this . _rli . line , this . _repl . _context ) ;
312
- if ( ! tokens ) {
332
+ if ( isEmptyArray ( tokens ) ) {
313
333
debug ( 'No tokens found. Skipping highlighting...' ) ;
314
334
this . _multilineHandler . updateLine ( this . _rli . line ) ; // save displayed line
315
335
return ;
316
336
}
337
+ // Process tokens:
338
+ tokens . sort ( tokenComparator ) ;
339
+ tokens = removeDuplicateTokens ( tokens ) ;
340
+
317
341
// Highlight:
318
342
debug ( '%d tokens found. Highlighting...' , tokens . length ) ;
319
343
this . _line = this . _rli . line ; // updated line buffer
0 commit comments