Skip to content

Commit 08f7b0a

Browse files
bugadaniJoshua Nelson
and
Joshua Nelson
committed
Use ranges returned by pulldown
Co-authored-by: Joshua Nelson <[email protected]>
1 parent 923e3d2 commit 08f7b0a

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

src/librustdoc/html/markdown.rs

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
418420
struct 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

Comments
 (0)