1
1
use crate :: ctype:: { isalpha, isdigit, ispunct, isspace} ;
2
- use crate :: nodes:: TableAlignment ;
3
2
use crate :: nodes:: {
4
3
AstNode , ListDelimType , ListType , NodeCodeBlock , NodeHeading , NodeHtmlBlock , NodeLink ,
5
4
NodeMath , NodeTable , NodeValue , NodeWikiLink ,
6
5
} ;
6
+ use crate :: nodes:: { NodeList , TableAlignment } ;
7
7
#[ cfg( feature = "shortcodes" ) ]
8
8
use crate :: parser:: shortcodes:: NodeShortCode ;
9
9
use crate :: parser:: Options ;
@@ -61,6 +61,7 @@ struct CommonMarkFormatter<'a, 'o> {
61
61
in_tight_list_item : bool ,
62
62
custom_escape : Option < fn ( & ' a AstNode < ' a > , u8 ) -> bool > ,
63
63
footnote_ix : u32 ,
64
+ ol_stack : Vec < usize > ,
64
65
}
65
66
66
67
#[ derive( PartialEq , Clone , Copy ) ]
@@ -98,6 +99,7 @@ impl<'a, 'o> CommonMarkFormatter<'a, 'o> {
98
99
in_tight_list_item : false ,
99
100
custom_escape : None ,
100
101
footnote_ix : 0 ,
102
+ ol_stack : vec ! [ ] ,
101
103
}
102
104
}
103
105
@@ -420,18 +422,37 @@ impl<'a, 'o> CommonMarkFormatter<'a, 'o> {
420
422
}
421
423
422
424
fn format_list ( & mut self , node : & ' a AstNode < ' a > , entering : bool ) {
423
- if !entering
424
- && match node. next_sibling ( ) {
425
+ let ol_start = match node. data . borrow ( ) . value {
426
+ NodeValue :: List ( NodeList {
427
+ list_type : ListType :: Ordered ,
428
+ start,
429
+ ..
430
+ } ) => Some ( start) ,
431
+ _ => None ,
432
+ } ;
433
+
434
+ if entering {
435
+ if let Some ( start) = ol_start {
436
+ println ! ( "pushing {:?} onto ol_stack {:?}" , start, self . ol_stack) ;
437
+ self . ol_stack . push ( start) ;
438
+ }
439
+ } else {
440
+ if ol_start. is_some ( ) {
441
+ println ! ( "popping ol_stack {:?}" , self . ol_stack) ;
442
+ self . ol_stack . pop ( ) ;
443
+ }
444
+
445
+ if match node. next_sibling ( ) {
425
446
Some ( next_sibling) => matches ! (
426
447
next_sibling. data. borrow( ) . value,
427
448
NodeValue :: CodeBlock ( ..) | NodeValue :: List ( ..)
428
449
) ,
429
450
_ => false ,
451
+ } {
452
+ self . cr ( ) ;
453
+ write ! ( self , "<!-- end list -->" ) . unwrap ( ) ;
454
+ self . blankline ( ) ;
430
455
}
431
- {
432
- self . cr ( ) ;
433
- write ! ( self , "<!-- end list -->" ) . unwrap ( ) ;
434
- self . blankline ( ) ;
435
456
}
436
457
}
437
458
@@ -446,11 +467,11 @@ impl<'a, 'o> CommonMarkFormatter<'a, 'o> {
446
467
let marker_width = if parent. list_type == ListType :: Bullet {
447
468
2
448
469
} else {
449
- let list_number = match node . data . borrow ( ) . value {
450
- NodeValue :: Item ( ref ni ) => ni . start ,
451
- NodeValue :: TaskItem ( _ ) => parent . start ,
452
- _ => unreachable ! ( ) ,
453
- } ;
470
+ let last_stack = self . ol_stack . last_mut ( ) . unwrap ( ) ;
471
+ let list_number = * last_stack ;
472
+ if entering {
473
+ * last_stack += 1 ;
474
+ }
454
475
let list_delim = parent. delimiter ;
455
476
write ! (
456
477
listmarker,
0 commit comments