@@ -414,11 +414,13 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
414
414
}
415
415
}
416
416
417
+ type SpannedEvent < ' a > = ( Event < ' a > , Range < usize > ) ;
418
+
417
419
/// Make headings links with anchor IDs and build up TOC.
418
420
struct HeadingLinks < ' a , ' b , ' ids , I > {
419
421
inner : I ,
420
422
toc : Option < & ' b mut TocBuilder > ,
421
- buf : VecDeque < Event < ' a > > ,
423
+ buf : VecDeque < SpannedEvent < ' a > > ,
422
424
id_map : & ' ids mut IdMap ,
423
425
}
424
426
@@ -428,48 +430,48 @@ impl<'a, 'b, 'ids, I> HeadingLinks<'a, 'b, 'ids, I> {
428
430
}
429
431
}
430
432
431
- impl < ' a , ' b , ' ids , I : Iterator < Item = Event < ' a > > > Iterator for HeadingLinks < ' a , ' b , ' ids , I > {
432
- type Item = Event < ' a > ;
433
+ impl < ' a , ' b , ' ids , I : Iterator < Item = SpannedEvent < ' a > > > Iterator
434
+ for HeadingLinks < ' a , ' b , ' ids , I >
435
+ {
436
+ type Item = SpannedEvent < ' a > ;
433
437
434
438
fn next ( & mut self ) -> Option < Self :: Item > {
435
439
if let Some ( e) = self . buf . pop_front ( ) {
436
440
return Some ( e) ;
437
441
}
438
442
439
443
let event = self . inner . next ( ) ;
440
- if let Some ( Event :: Start ( Tag :: Heading ( level) ) ) = event {
444
+ if let Some ( ( Event :: Start ( Tag :: Heading ( level) ) , _ ) ) = event {
441
445
let mut id = String :: new ( ) ;
442
446
for event in & mut self . inner {
443
- match & event {
447
+ match & event. 0 {
444
448
Event :: End ( Tag :: Heading ( ..) ) => break ,
449
+ Event :: Start ( Tag :: Link ( _, _, _) ) | Event :: End ( Tag :: Link ( ..) ) => { }
445
450
Event :: Text ( text) | Event :: Code ( text) => {
446
451
id. extend ( text. chars ( ) . filter_map ( slugify) ) ;
452
+ self . buf . push_back ( event) ;
447
453
}
448
- _ => { }
449
- }
450
- match event {
451
- Event :: Start ( Tag :: Link ( _, _, _) ) | Event :: End ( Tag :: Link ( ..) ) => { }
452
- event => self . buf . push_back ( event) ,
454
+ _ => self . buf . push_back ( event) ,
453
455
}
454
456
}
455
457
let id = self . id_map . derive ( id) ;
456
458
457
459
if let Some ( ref mut builder) = self . toc {
458
460
let mut html_header = String :: new ( ) ;
459
- html:: push_html ( & mut html_header, self . buf . iter ( ) . cloned ( ) ) ;
461
+ html:: push_html ( & mut html_header, self . buf . iter ( ) . map ( | ( ev , _ ) | ev . clone ( ) ) ) ;
460
462
let sec = builder. push ( level as u32 , html_header, id. clone ( ) ) ;
461
- self . buf . push_front ( Event :: Html ( format ! ( "{} " , sec) . into ( ) ) ) ;
463
+ self . buf . push_front ( ( Event :: Html ( format ! ( "{} " , sec) . into ( ) ) , 0 .. 0 ) ) ;
462
464
}
463
465
464
- self . buf . push_back ( Event :: Html ( format ! ( "</a></h{}>" , level) . into ( ) ) ) ;
466
+ self . buf . push_back ( ( Event :: Html ( format ! ( "</a></h{}>" , level) . into ( ) ) , 0 .. 0 ) ) ;
465
467
466
468
let start_tags = format ! (
467
469
"<h{level} id=\" {id}\" class=\" section-header\" >\
468
470
<a href=\" #{id}\" >",
469
471
id = id,
470
472
level = level
471
473
) ;
472
- return Some ( Event :: Html ( start_tags. into ( ) ) ) ;
474
+ return Some ( ( Event :: Html ( start_tags. into ( ) ) , 0 .. 0 ) ) ;
473
475
}
474
476
event
475
477
}
@@ -560,23 +562,23 @@ impl<'a, I> Footnotes<'a, I> {
560
562
}
561
563
}
562
564
563
- impl < ' a , I : Iterator < Item = Event < ' a > > > Iterator for Footnotes < ' a , I > {
564
- type Item = Event < ' a > ;
565
+ impl < ' a , I : Iterator < Item = SpannedEvent < ' a > > > Iterator for Footnotes < ' a , I > {
566
+ type Item = SpannedEvent < ' a > ;
565
567
566
568
fn next ( & mut self ) -> Option < Self :: Item > {
567
569
loop {
568
570
match self . inner . next ( ) {
569
- Some ( Event :: FootnoteReference ( ref reference) ) => {
571
+ Some ( ( Event :: FootnoteReference ( ref reference) , range ) ) => {
570
572
let entry = self . get_entry ( & reference) ;
571
573
let reference = format ! (
572
574
"<sup id=\" fnref{0}\" ><a href=\" #fn{0}\" >{0}</a></sup>" ,
573
575
( * entry) . 1
574
576
) ;
575
- return Some ( Event :: Html ( reference. into ( ) ) ) ;
577
+ return Some ( ( Event :: Html ( reference. into ( ) ) , range ) ) ;
576
578
}
577
- Some ( Event :: Start ( Tag :: FootnoteDefinition ( def) ) ) => {
579
+ Some ( ( Event :: Start ( Tag :: FootnoteDefinition ( def) ) , _ ) ) => {
578
580
let mut content = Vec :: new ( ) ;
579
- for event in & mut self . inner {
581
+ for ( event, _ ) in & mut self . inner {
580
582
if let Event :: End ( Tag :: FootnoteDefinition ( ..) ) = event {
581
583
break ;
582
584
}
@@ -607,7 +609,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for Footnotes<'a, I> {
607
609
ret. push_str ( "</li>" ) ;
608
610
}
609
611
ret. push_str ( "</ol></div>" ) ;
610
- return Some ( Event :: Html ( ret. into ( ) ) ) ;
612
+ return Some ( ( Event :: Html ( ret. into ( ) ) , 0 .. 0 ) ) ;
611
613
} else {
612
614
return None ;
613
615
}
@@ -917,13 +919,14 @@ impl Markdown<'_> {
917
919
} ;
918
920
919
921
let p = Parser :: new_with_broken_link_callback ( md, opts ( ) , Some ( & mut replacer) ) ;
922
+ let p = p. into_offset_iter ( ) ;
920
923
921
924
let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
922
925
923
926
let p = HeadingLinks :: new ( p, None , & mut ids) ;
924
- let p = LinkReplacer :: new ( p, links) ;
925
- let p = CodeBlocks :: new ( p, codes, edition, playground) ;
926
927
let p = Footnotes :: new ( p) ;
928
+ let p = LinkReplacer :: new ( p. map ( |( ev, _) | ev) , links) ;
929
+ let p = CodeBlocks :: new ( p, codes, edition, playground) ;
927
930
html:: push_html ( & mut s, p) ;
928
931
929
932
s
@@ -934,16 +937,16 @@ impl MarkdownWithToc<'_> {
934
937
crate fn into_string ( self ) -> String {
935
938
let MarkdownWithToc ( md, mut ids, codes, edition, playground) = self ;
936
939
937
- let p = Parser :: new_ext ( md, opts ( ) ) ;
940
+ let p = Parser :: new_ext ( md, opts ( ) ) . into_offset_iter ( ) ;
938
941
939
942
let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
940
943
941
944
let mut toc = TocBuilder :: new ( ) ;
942
945
943
946
{
944
947
let p = HeadingLinks :: new ( p, Some ( & mut toc) , & mut ids) ;
945
- let p = CodeBlocks :: new ( p, codes, edition, playground) ;
946
948
let p = Footnotes :: new ( p) ;
949
+ let p = CodeBlocks :: new ( p. map ( |( ev, _) | ev) , codes, edition, playground) ;
947
950
html:: push_html ( & mut s, p) ;
948
951
}
949
952
@@ -959,19 +962,19 @@ impl MarkdownHtml<'_> {
959
962
if md. is_empty ( ) {
960
963
return String :: new ( ) ;
961
964
}
962
- let p = Parser :: new_ext ( md, opts ( ) ) ;
965
+ let p = Parser :: new_ext ( md, opts ( ) ) . into_offset_iter ( ) ;
963
966
964
967
// Treat inline HTML as plain text.
965
- let p = p. map ( |event| match event {
966
- Event :: Html ( text) => Event :: Text ( text) ,
968
+ let p = p. map ( |event| match event. 0 {
969
+ Event :: Html ( text) => ( Event :: Text ( text) , event . 1 ) ,
967
970
_ => event,
968
971
} ) ;
969
972
970
973
let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
971
974
972
975
let p = HeadingLinks :: new ( p, None , & mut ids) ;
973
- let p = CodeBlocks :: new ( p, codes, edition, playground) ;
974
976
let p = Footnotes :: new ( p) ;
977
+ let p = CodeBlocks :: new ( p. map ( |( ev, _) | ev) , codes, edition, playground) ;
975
978
html:: push_html ( & mut s, p) ;
976
979
977
980
s
@@ -1153,15 +1156,16 @@ crate fn markdown_links(md: &str) -> Vec<(String, Option<Range<usize>>)> {
1153
1156
shortcut_links. push ( ( link. reference . to_owned ( ) , locate ( link. reference ) ) ) ;
1154
1157
None
1155
1158
} ;
1156
- let p = Parser :: new_with_broken_link_callback ( md, opts ( ) , Some ( & mut push) ) ;
1159
+ let p =
1160
+ Parser :: new_with_broken_link_callback ( md, opts ( ) , Some ( & mut push) ) . into_offset_iter ( ) ;
1157
1161
1158
1162
// There's no need to thread an IdMap through to here because
1159
1163
// the IDs generated aren't going to be emitted anywhere.
1160
1164
let mut ids = IdMap :: new ( ) ;
1161
1165
let iter = Footnotes :: new ( HeadingLinks :: new ( p, None , & mut ids) ) ;
1162
1166
1163
1167
for ev in iter {
1164
- if let Event :: Start ( Tag :: Link ( _, dest, _) ) = ev {
1168
+ if let Event :: Start ( Tag :: Link ( _, dest, _) ) = ev. 0 {
1165
1169
debug ! ( "found link: {}" , dest) ;
1166
1170
links. push ( match dest {
1167
1171
CowStr :: Borrowed ( s) => ( s. to_owned ( ) , locate ( s) ) ,
0 commit comments