Skip to content

Commit c9415eb

Browse files
Remains to fix tables
1 parent 08a80cb commit c9415eb

File tree

1 file changed

+74
-20
lines changed

1 file changed

+74
-20
lines changed

src/librustdoc/html/markdown.rs

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ use html::highlight;
4343
use html::escape::Escape;
4444
use test;
4545

46-
use pulldown_cmark::{self, Parser};
46+
use pulldown_cmark::{self, Event, Parser};
4747

4848
/// A unit struct which has the `fmt::Display` trait implemented. When
4949
/// formatted, this struct will emit the HTML corresponding to the rendered
@@ -467,7 +467,7 @@ pub fn render(w: &mut fmt::Formatter,
467467
PLAYGROUND.with(|play| {
468468
// insert newline to clearly separate it from the
469469
// previous block so we can shorten the html output
470-
let mut s = String::from("\n");
470+
buffer.push('\n');
471471
let playground_button = play.borrow().as_ref().and_then(|&(ref krate, ref url)| {
472472
if url.is_empty() {
473473
return None;
@@ -506,12 +506,11 @@ pub fn render(w: &mut fmt::Formatter,
506506
url, test_escaped, channel
507507
))
508508
});
509-
s.push_str(&highlight::render_with_highlighting(
510-
&text,
511-
Some("rust-example-rendered"),
512-
None,
513-
playground_button.as_ref().map(String::as_str)));
514-
buffer.push_str(&s);
509+
buffer.push_str(&highlight::render_with_highlighting(
510+
&text,
511+
Some("rust-example-rendered"),
512+
None,
513+
playground_button.as_ref().map(String::as_str)));
515514
});
516515
}
517516

@@ -587,29 +586,84 @@ pub fn render(w: &mut fmt::Formatter,
587586
buffer.push_str(&format!("<code>{}</code>", Escape(&collapse_whitespace(&content))));
588587
}
589588

590-
let mut toc_builder = if print_toc {
591-
Some(TocBuilder::new())
592-
} else {
593-
None
594-
};
595-
let mut buffer = String::new();
596-
let mut parser = Parser::new(s);
597-
loop {
598-
let next_event = parser.next();
589+
fn link(parser: &mut Parser, buffer: &mut String, url: &str, mut title: String) {
590+
loop {
591+
let event = parser.next();
592+
if let Some(event) = event {
593+
match event {
594+
pulldown_cmark::Event::End(
595+
pulldown_cmark::Tag::Link(_, _)) => break,
596+
pulldown_cmark::Event::Text(ref s) => {
597+
title.push_str(s);
598+
}
599+
_ => {}
600+
}
601+
} else {
602+
break
603+
}
604+
}
605+
buffer.push_str(&format!("<a href=\"{}\">{}</a>", url, title));
606+
}
607+
608+
fn paragraph(parser: &mut Parser, buffer: &mut String, toc_builder: &mut Option<TocBuilder>) {
609+
let mut content = String::new();
610+
loop {
611+
let event = parser.next();
612+
if let Some(event) = event {
613+
match event {
614+
pulldown_cmark::Event::End(
615+
pulldown_cmark::Tag::Paragraph) => break,
616+
pulldown_cmark::Event::Text(ref s) => {
617+
content.push_str(s);
618+
}
619+
x => {
620+
looper(parser, &mut content, Some(x), toc_builder);
621+
}
622+
}
623+
} else {
624+
break
625+
}
626+
}
627+
buffer.push_str(&format!("<p>{}</p>", content));
628+
}
629+
630+
fn looper<'a>(parser: &'a mut Parser, buffer: &mut String, next_event: Option<Event<'a>>,
631+
toc_builder: &mut Option<TocBuilder>) -> bool {
599632
if let Some(event) = next_event {
600633
match event {
601634
pulldown_cmark::Event::Start(pulldown_cmark::Tag::CodeBlock(s)) => {
602-
block(&mut parser, &*s, &mut buffer);
635+
block(parser, &*s, buffer);
603636
}
604637
pulldown_cmark::Event::Start(pulldown_cmark::Tag::Header(level)) => {
605-
header(&mut parser, level, &mut toc_builder, &mut buffer);
638+
header(parser, level, toc_builder, buffer);
606639
}
607640
pulldown_cmark::Event::Start(pulldown_cmark::Tag::Code) => {
608-
codespan(&mut parser, &mut buffer);
641+
codespan(parser, buffer);
642+
}
643+
pulldown_cmark::Event::Start(pulldown_cmark::Tag::Paragraph) => {
644+
paragraph(parser, buffer, toc_builder);
645+
}
646+
pulldown_cmark::Event::Start(pulldown_cmark::Tag::Link(ref url, ref t)) => {
647+
link(parser, buffer, url, t.as_ref().to_owned());
609648
}
610649
_ => {}
611650
}
651+
true
612652
} else {
653+
false
654+
}
655+
}
656+
657+
let mut toc_builder = if print_toc {
658+
Some(TocBuilder::new())
659+
} else {
660+
None
661+
};
662+
let mut buffer = String::new();
663+
let mut parser = Parser::new(s);
664+
loop {
665+
let next_event = parser.next();
666+
if !looper(&mut parser, &mut buffer, next_event, &mut toc_builder) {
613667
break
614668
}
615669
}

0 commit comments

Comments
 (0)