@@ -554,9 +554,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for Footnotes<'a, I> {
554
554
pub fn find_testable_code < T : test:: Tester > ( doc : & str , tests : & mut T , error_codes : ErrorCodes ,
555
555
enable_per_target_ignores : bool ) {
556
556
let mut parser = Parser :: new ( doc) . into_offset_iter ( ) ;
557
- let mut nb_lines = 0 ;
558
557
let mut register_header = None ;
559
- let mut prev_offset = 0 ;
560
558
while let Some ( ( event, offset) ) = parser. next ( ) {
561
559
match event {
562
560
Event :: Start ( Tag :: CodeBlock ( s) ) => {
@@ -578,10 +576,10 @@ pub fn find_testable_code<T: test::Tester>(doc: &str, tests: &mut T, error_codes
578
576
. map ( |l| map_line ( l) . for_code ( ) )
579
577
. collect :: < Vec < Cow < ' _ , str > > > ( )
580
578
. join ( "\n " ) ;
581
- nb_lines += doc[ prev_offset..offset. end ] . lines ( ) . count ( ) ;
579
+ // "+ 1" is to take into account the start of the code block
580
+ let nb_lines = doc[ ..offset. start ] . lines ( ) . count ( ) + 1 ;
582
581
let line = tests. get_line ( ) + nb_lines;
583
582
tests. add_test ( text, block_info, line) ;
584
- prev_offset = offset. start ;
585
583
}
586
584
Event :: Start ( Tag :: Heading ( level) ) => {
587
585
register_header = Some ( level as u32 ) ;
@@ -927,8 +925,8 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
927
925
let mut code_block = None ;
928
926
let mut code_start = 0 ;
929
927
let mut is_fenced = false ;
930
- let mut previous_offset = Range { start : 0 , end : 0 } ;
931
928
let mut in_rust_code_block = false ;
929
+ let mut previous_offset = Range { start : 0 , end : 0 } ;
932
930
while let Some ( ( event, offset_range) ) = p. next ( ) {
933
931
match event {
934
932
Event :: Start ( Tag :: CodeBlock ( syntax) ) => {
@@ -942,35 +940,31 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
942
940
in_rust_code_block = true ;
943
941
code_block = Some ( offset_range. clone ( ) ) ;
944
942
945
- code_start = match md[ offset_range. clone ( ) ] . find ( "```" ) {
946
- Some ( _) => {
947
- is_fenced = true ;
948
- offset_range. start + md[ offset_range. clone ( ) ]
949
- . lines ( )
950
- . next ( )
951
- . map_or ( 0 , |x| x. len ( ) + 1 )
952
- }
953
- None => {
954
- is_fenced = false ;
955
- offset_range. start
956
- }
943
+ code_start = if !md[ previous_offset. end ..offset_range. start ] . ends_with ( " " ) {
944
+ is_fenced = true ;
945
+ offset_range. start + md[ offset_range. clone ( ) ]
946
+ . lines ( )
947
+ . next ( )
948
+ . map_or ( 0 , |x| x. len ( ) + 1 )
949
+ } else {
950
+ is_fenced = false ;
951
+ offset_range. start
957
952
} ;
958
- previous_offset = Range { start : code_start, end : offset_range. end } ;
959
953
}
960
954
}
961
955
Event :: End ( Tag :: CodeBlock ( syntax) ) if in_rust_code_block => {
962
956
in_rust_code_block = false ;
963
957
964
958
let code_end = if is_fenced {
965
- let last_len = md[ previous_offset . clone ( ) ]
959
+ let last_len = md[ offset_range . clone ( ) ]
966
960
. lines ( )
967
961
. last ( )
962
+ . filter ( |l| l. ends_with ( "```" ) )
968
963
. map_or ( 0 , |l| l. len ( ) ) ;
969
- previous_offset . end - last_len
964
+ offset_range . end - last_len
970
965
} else {
971
- previous_offset . end
966
+ offset_range . end
972
967
} ;
973
-
974
968
code_blocks. push ( RustCodeBlock {
975
969
is_fenced,
976
970
range : code_block. clone ( ) . unwrap ( ) ,
@@ -987,6 +981,7 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
987
981
}
988
982
_ => ( ) ,
989
983
}
984
+ previous_offset = offset_range;
990
985
}
991
986
992
987
code_blocks
0 commit comments