@@ -8,6 +8,7 @@ struct EventIterator<'a> {
8
8
last_range : Range ,
9
9
next : Option < ( Event < ' a > , Range ) > ,
10
10
allow_empty_text_events : bool ,
11
+ in_table_count : i8 ,
11
12
}
12
13
13
14
impl < ' a > EventIterator < ' a > {
@@ -23,22 +24,23 @@ impl<'a> EventIterator<'a> {
23
24
} ,
24
25
next,
25
26
allow_empty_text_events : false ,
27
+ in_table_count : 0 ,
26
28
}
27
29
}
28
30
29
31
pub fn next ( & mut self ) -> Option < Event < ' a > > {
30
32
if let Some ( ( event, range) ) = self . next . take ( ) {
31
33
// println!("{:?} {:?}", range, event);
32
34
self . last_range = range;
33
- self . next = self . iterator . next ( ) ;
35
+ self . next = self . move_iterator_next ( ) ;
34
36
35
37
if !self . allow_empty_text_events {
36
38
// skip over any empty text or html events
37
39
loop {
38
40
match & self . next {
39
41
Some ( ( Event :: Text ( text) , _) ) | Some ( ( Event :: Html ( text) , _) ) => {
40
42
if text. trim ( ) . is_empty ( ) {
41
- self . next = self . iterator . next ( ) ;
43
+ self . next = self . move_iterator_next ( ) ;
42
44
} else {
43
45
break ;
44
46
}
@@ -54,6 +56,22 @@ impl<'a> EventIterator<'a> {
54
56
}
55
57
}
56
58
59
+ fn move_iterator_next ( & mut self ) -> Option < ( Event < ' a > , Range ) > {
60
+ let next = self . iterator . next ( ) ;
61
+
62
+ match next {
63
+ Some ( ( Event :: Start ( Tag :: Table ( _) ) , _) ) => self . in_table_count += 1 ,
64
+ Some ( ( Event :: End ( Tag :: Table ( _) ) , _) ) => self . in_table_count -= 1 ,
65
+ _ => { }
66
+ }
67
+
68
+ next
69
+ }
70
+
71
+ pub fn is_in_table ( & self ) -> bool {
72
+ self . in_table_count > 0
73
+ }
74
+
57
75
pub fn start ( & self ) -> usize {
58
76
self . last_range . start
59
77
}
@@ -91,19 +109,12 @@ pub fn parse_cmark_ast(markdown_text: &str) -> Result<SourceFile, ParseError> {
91
109
let mut children: Vec < Node > = Vec :: new ( ) ;
92
110
let mut iterator = EventIterator :: new ( markdown_text, Parser :: new_ext ( markdown_text, options) . into_offset_iter ( ) ) ;
93
111
let mut last_event_range: Option < Range > = None ;
94
- let mut is_in_table = 0 ;
95
112
96
113
while let Some ( event) = iterator. next ( ) {
97
- match event {
98
- Event :: Start ( Tag :: Table ( _) ) => is_in_table += 1 ,
99
- Event :: End ( Tag :: Table ( _) ) => is_in_table += 1 ,
100
- _ => { }
101
- }
102
-
103
114
let current_range = iterator. get_last_range ( ) ;
104
115
105
116
// do not parse for link references while inside a table
106
- if is_in_table == 0 {
117
+ if !iterator . is_in_table ( ) {
107
118
if let Some ( references) = parse_references ( & last_event_range, current_range. start , & mut iterator) ? {
108
119
children. push ( references) ;
109
120
}
0 commit comments