@@ -304,30 +304,42 @@ const parse = (input, options = {}) => {
304
304
push ( { type : 'text' , value } ) ;
305
305
}
306
306
307
+ flattenBlocks ( stack )
308
+ markImbalancedBraces ( ast ) ;
309
+ push ( { type : 'eos' } ) ;
310
+
311
+ return ast ;
312
+ } ;
313
+
314
+ module . exports = parse ;
315
+
316
+ function markImbalancedBraces ( { nodes} ) {
307
317
// Mark imbalanced braces and brackets as invalid
318
+ for ( const node of nodes ) {
319
+ if ( node . nodes || node . invalid )
320
+ continue ;
321
+
322
+ if ( node . type === 'open' ) node . isOpen = true ;
323
+ if ( node . type === 'close' ) node . isClose = true ;
324
+ if ( ! node . nodes ) node . type = 'text' ;
325
+
326
+ node . invalid = true ;
327
+ delete node . parent ;
328
+ }
329
+ }
330
+
331
+ function flattenBlocks ( stack ) {
332
+ let block ;
308
333
do {
309
334
block = stack . pop ( ) ;
310
335
311
- if ( block . type !== 'root' ) {
312
- block . nodes . forEach ( node => {
313
- if ( ! node . nodes ) {
314
- if ( node . type === 'open' ) node . isOpen = true ;
315
- if ( node . type === 'close' ) node . isClose = true ;
316
- if ( ! node . nodes ) node . type = 'text' ;
317
- node . invalid = true ;
318
- }
319
- } ) ;
336
+ if ( block . type === 'root' )
337
+ continue ;
320
338
321
- // get the location of the block on parent.nodes (block's siblings)
322
- let parent = stack [ stack . length - 1 ] ;
323
- let index = parent . nodes . indexOf ( block ) ;
324
- // replace the (invalid) block with it's nodes
325
- parent . nodes . splice ( index , 1 , ...block . nodes ) ;
326
- }
339
+ // get the location of the block on parent.nodes (block's siblings)
340
+ let parent = stack . at ( - 1 ) ;
341
+ let index = parent . nodes . indexOf ( block ) ;
342
+ // replace the (invalid) block with its nodes
343
+ parent . nodes . splice ( index , 1 , ...block . nodes ) ;
327
344
} while ( stack . length > 0 ) ;
328
-
329
- push ( { type : 'eos' } ) ;
330
- return ast ;
331
- } ;
332
-
333
- module . exports = parse ;
345
+ }
0 commit comments