@@ -414,11 +414,13 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
414414 }
415415}
416416
417+ type SpannedEvent < ' a > = ( Event < ' a > , Range < usize > ) ;
418+
417419/// Make headings links with anchor IDs and build up TOC.
418420struct HeadingLinks < ' a , ' b , ' ids , I > {
419421 inner : I ,
420422 toc : Option < & ' b mut TocBuilder > ,
421- buf : VecDeque < Event < ' a > > ,
423+ buf : VecDeque < SpannedEvent < ' a > > ,
422424 id_map : & ' ids mut IdMap ,
423425}
424426
@@ -428,48 +430,48 @@ impl<'a, 'b, 'ids, I> HeadingLinks<'a, 'b, 'ids, I> {
428430 }
429431}
430432
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 > ;
433437
434438 fn next ( & mut self ) -> Option < Self :: Item > {
435439 if let Some ( e) = self . buf . pop_front ( ) {
436440 return Some ( e) ;
437441 }
438442
439443 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 {
441445 let mut id = String :: new ( ) ;
442446 for event in & mut self . inner {
443- match & event {
447+ match & event. 0 {
444448 Event :: End ( Tag :: Heading ( ..) ) => break ,
449+ Event :: Start ( Tag :: Link ( _, _, _) ) | Event :: End ( Tag :: Link ( ..) ) => { }
445450 Event :: Text ( text) | Event :: Code ( text) => {
446451 id. extend ( text. chars ( ) . filter_map ( slugify) ) ;
452+ self . buf . push_back ( event) ;
447453 }
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) ,
453455 }
454456 }
455457 let id = self . id_map . derive ( id) ;
456458
457459 if let Some ( ref mut builder) = self . toc {
458460 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 ( ) ) ) ;
460462 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 ) ) ;
462464 }
463465
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 ) ) ;
465467
466468 let start_tags = format ! (
467469 "<h{level} id=\" {id}\" class=\" section-header\" >\
468470 <a href=\" #{id}\" >",
469471 id = id,
470472 level = level
471473 ) ;
472- return Some ( Event :: Html ( start_tags. into ( ) ) ) ;
474+ return Some ( ( Event :: Html ( start_tags. into ( ) ) , 0 .. 0 ) ) ;
473475 }
474476 event
475477 }
@@ -560,23 +562,23 @@ impl<'a, I> Footnotes<'a, I> {
560562 }
561563}
562564
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 > ;
565567
566568 fn next ( & mut self ) -> Option < Self :: Item > {
567569 loop {
568570 match self . inner . next ( ) {
569- Some ( Event :: FootnoteReference ( ref reference) ) => {
571+ Some ( ( Event :: FootnoteReference ( ref reference) , range ) ) => {
570572 let entry = self . get_entry ( & reference) ;
571573 let reference = format ! (
572574 "<sup id=\" fnref{0}\" ><a href=\" #fn{0}\" >{0}</a></sup>" ,
573575 ( * entry) . 1
574576 ) ;
575- return Some ( Event :: Html ( reference. into ( ) ) ) ;
577+ return Some ( ( Event :: Html ( reference. into ( ) ) , range ) ) ;
576578 }
577- Some ( Event :: Start ( Tag :: FootnoteDefinition ( def) ) ) => {
579+ Some ( ( Event :: Start ( Tag :: FootnoteDefinition ( def) ) , _ ) ) => {
578580 let mut content = Vec :: new ( ) ;
579- for event in & mut self . inner {
581+ for ( event, _ ) in & mut self . inner {
580582 if let Event :: End ( Tag :: FootnoteDefinition ( ..) ) = event {
581583 break ;
582584 }
@@ -607,7 +609,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for Footnotes<'a, I> {
607609 ret. push_str ( "</li>" ) ;
608610 }
609611 ret. push_str ( "</ol></div>" ) ;
610- return Some ( Event :: Html ( ret. into ( ) ) ) ;
612+ return Some ( ( Event :: Html ( ret. into ( ) ) , 0 .. 0 ) ) ;
611613 } else {
612614 return None ;
613615 }
@@ -917,13 +919,14 @@ impl Markdown<'_> {
917919 } ;
918920
919921 let p = Parser :: new_with_broken_link_callback ( md, opts ( ) , Some ( & mut replacer) ) ;
922+ let p = p. into_offset_iter ( ) ;
920923
921924 let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
922925
923926 let p = HeadingLinks :: new ( p, None , & mut ids) ;
924- let p = LinkReplacer :: new ( p, links) ;
925- let p = CodeBlocks :: new ( p, codes, edition, playground) ;
926927 let p = Footnotes :: new ( p) ;
928+ let p = LinkReplacer :: new ( p. map ( |( ev, _) | ev) , links) ;
929+ let p = CodeBlocks :: new ( p, codes, edition, playground) ;
927930 html:: push_html ( & mut s, p) ;
928931
929932 s
@@ -934,16 +937,16 @@ impl MarkdownWithToc<'_> {
934937 crate fn into_string ( self ) -> String {
935938 let MarkdownWithToc ( md, mut ids, codes, edition, playground) = self ;
936939
937- let p = Parser :: new_ext ( md, opts ( ) ) ;
940+ let p = Parser :: new_ext ( md, opts ( ) ) . into_offset_iter ( ) ;
938941
939942 let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
940943
941944 let mut toc = TocBuilder :: new ( ) ;
942945
943946 {
944947 let p = HeadingLinks :: new ( p, Some ( & mut toc) , & mut ids) ;
945- let p = CodeBlocks :: new ( p, codes, edition, playground) ;
946948 let p = Footnotes :: new ( p) ;
949+ let p = CodeBlocks :: new ( p. map ( |( ev, _) | ev) , codes, edition, playground) ;
947950 html:: push_html ( & mut s, p) ;
948951 }
949952
@@ -959,19 +962,19 @@ impl MarkdownHtml<'_> {
959962 if md. is_empty ( ) {
960963 return String :: new ( ) ;
961964 }
962- let p = Parser :: new_ext ( md, opts ( ) ) ;
965+ let p = Parser :: new_ext ( md, opts ( ) ) . into_offset_iter ( ) ;
963966
964967 // 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 ) ,
967970 _ => event,
968971 } ) ;
969972
970973 let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
971974
972975 let p = HeadingLinks :: new ( p, None , & mut ids) ;
973- let p = CodeBlocks :: new ( p, codes, edition, playground) ;
974976 let p = Footnotes :: new ( p) ;
977+ let p = CodeBlocks :: new ( p. map ( |( ev, _) | ev) , codes, edition, playground) ;
975978 html:: push_html ( & mut s, p) ;
976979
977980 s
@@ -1153,15 +1156,16 @@ crate fn markdown_links(md: &str) -> Vec<(String, Option<Range<usize>>)> {
11531156 shortcut_links. push ( ( link. reference . to_owned ( ) , locate ( link. reference ) ) ) ;
11541157 None
11551158 } ;
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 ( ) ;
11571161
11581162 // There's no need to thread an IdMap through to here because
11591163 // the IDs generated aren't going to be emitted anywhere.
11601164 let mut ids = IdMap :: new ( ) ;
11611165 let iter = Footnotes :: new ( HeadingLinks :: new ( p, None , & mut ids) ) ;
11621166
11631167 for ev in iter {
1164- if let Event :: Start ( Tag :: Link ( _, dest, _) ) = ev {
1168+ if let Event :: Start ( Tag :: Link ( _, dest, _) ) = ev. 0 {
11651169 debug ! ( "found link: {}" , dest) ;
11661170 links. push ( match dest {
11671171 CowStr :: Borrowed ( s) => ( s. to_owned ( ) , locate ( s) ) ,
0 commit comments