@@ -43,7 +43,7 @@ use html::highlight;
4343use html:: escape:: Escape ;
4444use 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