@@ -368,11 +368,11 @@ impl<'a, 'b, 'ids, I: Iterator<Item = Event<'a>>> Iterator for HeadingLinks<'a,
368
368
}
369
369
370
370
let event = self . inner . next ( ) ;
371
- if let Some ( Event :: Start ( Tag :: Header ( level) ) ) = event {
371
+ if let Some ( Event :: Start ( Tag :: Heading ( level) ) ) = event {
372
372
let mut id = String :: new ( ) ;
373
373
for event in & mut self . inner {
374
374
match & event {
375
- Event :: End ( Tag :: Header ( ..) ) => break ,
375
+ Event :: End ( Tag :: Heading ( ..) ) => break ,
376
376
Event :: Text ( text) | Event :: Code ( text) => {
377
377
id. extend ( text. chars ( ) . filter_map ( slugify) ) ;
378
378
}
@@ -386,16 +386,16 @@ impl<'a, 'b, 'ids, I: Iterator<Item = Event<'a>>> Iterator for HeadingLinks<'a,
386
386
let mut html_header = String :: new ( ) ;
387
387
html:: push_html ( & mut html_header, self . buf . iter ( ) . cloned ( ) ) ;
388
388
let sec = builder. push ( level as u32 , html_header, id. clone ( ) ) ;
389
- self . buf . push_front ( Event :: InlineHtml ( format ! ( "{} " , sec) . into ( ) ) ) ;
389
+ self . buf . push_front ( Event :: Html ( format ! ( "{} " , sec) . into ( ) ) ) ;
390
390
}
391
391
392
- self . buf . push_back ( Event :: InlineHtml ( format ! ( "</a></h{}>" , level) . into ( ) ) ) ;
392
+ self . buf . push_back ( Event :: Html ( format ! ( "</a></h{}>" , level) . into ( ) ) ) ;
393
393
394
394
let start_tags = format ! ( "<h{level} id=\" {id}\" class=\" section-header\" >\
395
395
<a href=\" #{id}\" >",
396
396
id = id,
397
397
level = level) ;
398
- return Some ( Event :: InlineHtml ( start_tags. into ( ) ) ) ;
398
+ return Some ( Event :: Html ( start_tags. into ( ) ) ) ;
399
399
}
400
400
event
401
401
}
@@ -553,15 +553,13 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for Footnotes<'a, I> {
553
553
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
- let mut parser = Parser :: new ( doc) ;
557
- let mut prev_offset = 0 ;
556
+ let mut parser = Parser :: new ( doc) . into_offset_iter ( ) ;
558
557
let mut nb_lines = 0 ;
559
558
let mut register_header = None ;
560
- while let Some ( event) = parser. next ( ) {
559
+ let mut prev_offset = 0 ;
560
+ while let Some ( ( event, offset) ) = parser. next ( ) {
561
561
match event {
562
562
Event :: Start ( Tag :: CodeBlock ( s) ) => {
563
- let offset = parser. get_offset ( ) ;
564
-
565
563
let block_info = if s. is_empty ( ) {
566
564
LangString :: all_false ( )
567
565
} else {
@@ -571,8 +569,7 @@ pub fn find_testable_code<T: test::Tester>(doc: &str, tests: &mut T, error_codes
571
569
continue ;
572
570
}
573
571
let mut test_s = String :: new ( ) ;
574
-
575
- while let Some ( Event :: Text ( s) ) = parser. next ( ) {
572
+ while let Some ( ( Event :: Text ( s) , _) ) = parser. next ( ) {
576
573
test_s. push_str ( & s) ;
577
574
}
578
575
@@ -581,12 +578,12 @@ pub fn find_testable_code<T: test::Tester>(doc: &str, tests: &mut T, error_codes
581
578
. map ( |l| map_line ( l) . for_code ( ) )
582
579
. collect :: < Vec < Cow < ' _ , str > > > ( )
583
580
. join ( "\n " ) ;
584
- nb_lines += doc[ prev_offset..offset] . lines ( ) . count ( ) ;
581
+ nb_lines += doc[ prev_offset..offset. end ] . lines ( ) . count ( ) ;
585
582
let line = tests. get_line ( ) + nb_lines;
586
583
tests. add_test ( text, block_info, line) ;
587
- prev_offset = offset;
584
+ prev_offset = offset. start ;
588
585
}
589
- Event :: Start ( Tag :: Header ( level) ) => {
586
+ Event :: Start ( Tag :: Heading ( level) ) => {
590
587
register_header = Some ( level as u32 ) ;
591
588
}
592
589
Event :: Text ( ref s) if register_header. is_some ( ) => {
@@ -766,7 +763,7 @@ impl MarkdownHtml<'_> {
766
763
767
764
// Treat inline HTML as plain text.
768
765
let p = p. map ( |event| match event {
769
- Event :: Html ( text) | Event :: InlineHtml ( text ) => Event :: Text ( text) ,
766
+ Event :: Html ( text) => Event :: Text ( text) ,
770
767
_ => event
771
768
} ) ;
772
769
@@ -823,10 +820,10 @@ pub fn plain_summary_line(md: &str) -> String {
823
820
let next_event = next_event. unwrap ( ) ;
824
821
let ( ret, is_in) = match next_event {
825
822
Event :: Start ( Tag :: Paragraph ) => ( None , 1 ) ,
826
- Event :: Start ( Tag :: Header ( _) ) => ( None , 1 ) ,
823
+ Event :: Start ( Tag :: Heading ( _) ) => ( None , 1 ) ,
827
824
Event :: Code ( code) => ( Some ( format ! ( "`{}`" , code) ) , 0 ) ,
828
825
Event :: Text ( ref s) if self . is_in > 0 => ( Some ( s. as_ref ( ) . to_owned ( ) ) , 0 ) ,
829
- Event :: End ( Tag :: Paragraph ) | Event :: End ( Tag :: Header ( _) ) => ( None , -1 ) ,
826
+ Event :: End ( Tag :: Paragraph ) | Event :: End ( Tag :: Heading ( _) ) => ( None , -1 ) ,
830
827
_ => ( None , 0 ) ,
831
828
} ;
832
829
if is_in > 0 || ( is_in < 0 && self . is_in > 0 ) {
@@ -925,16 +922,14 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
925
922
return code_blocks;
926
923
}
927
924
928
- let mut p = Parser :: new_ext ( md, opts ( ) ) ;
925
+ let mut p = Parser :: new_ext ( md, opts ( ) ) . into_offset_iter ( ) ;
929
926
930
- let mut code_block_start = 0 ;
927
+ let mut code_block = None ;
931
928
let mut code_start = 0 ;
932
929
let mut is_fenced = false ;
933
- let mut previous_offset = 0 ;
930
+ let mut previous_offset = Range { start : 0 , end : 0 } ;
934
931
let mut in_rust_code_block = false ;
935
- while let Some ( event) = p. next ( ) {
936
- let offset = p. get_offset ( ) ;
937
-
932
+ while let Some ( ( event, offset_range) ) = p. next ( ) {
938
933
match event {
939
934
Event :: Start ( Tag :: CodeBlock ( syntax) ) => {
940
935
let lang_string = if syntax. is_empty ( ) {
@@ -945,55 +940,40 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
945
940
946
941
if lang_string. rust {
947
942
in_rust_code_block = true ;
943
+ code_block = Some ( offset_range. clone ( ) ) ;
948
944
949
- code_start = offset;
950
- code_block_start = match md[ previous_offset..offset] . find ( "```" ) {
951
- Some ( fence_idx) => {
945
+ code_start = match md[ offset_range. clone ( ) ] . find ( "```" ) {
946
+ Some ( _) => {
952
947
is_fenced = true ;
953
- previous_offset + fence_idx
948
+ offset_range. start + md[ offset_range. clone ( ) ]
949
+ . lines ( )
950
+ . next ( )
951
+ . map_or ( 0 , |x| x. len ( ) + 1 )
954
952
}
955
953
None => {
956
954
is_fenced = false ;
957
- offset
955
+ offset_range . start
958
956
}
959
957
} ;
958
+ previous_offset = Range { start : code_start, end : offset_range. end } ;
960
959
}
961
960
}
962
961
Event :: End ( Tag :: CodeBlock ( syntax) ) if in_rust_code_block => {
963
962
in_rust_code_block = false ;
964
963
965
- let code_block_end = if is_fenced {
966
- let fence_str = & md[ previous_offset..offset]
967
- . chars ( )
968
- . rev ( )
969
- . collect :: < String > ( ) ;
970
- fence_str
971
- . find ( "```" )
972
- . map ( |fence_idx| offset - fence_idx)
973
- . unwrap_or_else ( || offset)
974
- } else if md
975
- . as_bytes ( )
976
- . get ( offset)
977
- . map ( |b| * b == b'\n' )
978
- . unwrap_or_default ( )
979
- {
980
- offset - 1
981
- } else {
982
- offset
983
- } ;
984
-
985
964
let code_end = if is_fenced {
986
- previous_offset
965
+ let last_len = md[ previous_offset. clone ( ) ]
966
+ . lines ( )
967
+ . last ( )
968
+ . map_or ( 0 , |l| l. len ( ) ) ;
969
+ previous_offset. end - last_len
987
970
} else {
988
- code_block_end
971
+ previous_offset . end
989
972
} ;
990
973
991
974
code_blocks. push ( RustCodeBlock {
992
975
is_fenced,
993
- range : Range {
994
- start : code_block_start,
995
- end : code_block_end,
996
- } ,
976
+ range : code_block. clone ( ) . unwrap ( ) ,
997
977
code : Range {
998
978
start : code_start,
999
979
end : code_end,
@@ -1007,8 +987,6 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
1007
987
}
1008
988
_ => ( ) ,
1009
989
}
1010
-
1011
- previous_offset = offset;
1012
990
}
1013
991
1014
992
code_blocks
0 commit comments