@@ -43,7 +43,7 @@ use html::highlight;
43
43
use html:: escape:: Escape ;
44
44
use test;
45
45
46
- use pulldown_cmark:: { self , Parser } ;
46
+ use pulldown_cmark:: { self , Event , Parser } ;
47
47
48
48
/// A unit struct which has the `fmt::Display` trait implemented. When
49
49
/// formatted, this struct will emit the HTML corresponding to the rendered
@@ -467,7 +467,7 @@ pub fn render(w: &mut fmt::Formatter,
467
467
PLAYGROUND . with ( |play| {
468
468
// insert newline to clearly separate it from the
469
469
// previous block so we can shorten the html output
470
- let mut s = String :: from ( " \n " ) ;
470
+ buffer . push ( '\n' ) ;
471
471
let playground_button = play. borrow ( ) . as_ref ( ) . and_then ( |& ( ref krate, ref url) | {
472
472
if url. is_empty ( ) {
473
473
return None ;
@@ -506,12 +506,11 @@ pub fn render(w: &mut fmt::Formatter,
506
506
url, test_escaped, channel
507
507
) )
508
508
} ) ;
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) ) ) ;
515
514
} ) ;
516
515
}
517
516
@@ -587,29 +586,84 @@ pub fn render(w: &mut fmt::Formatter,
587
586
buffer. push_str ( & format ! ( "<code>{}</code>" , Escape ( & collapse_whitespace( & content) ) ) ) ;
588
587
}
589
588
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 {
599
632
if let Some ( event) = next_event {
600
633
match event {
601
634
pulldown_cmark:: Event :: Start ( pulldown_cmark:: Tag :: CodeBlock ( s) ) => {
602
- block ( & mut parser, & * s, & mut buffer) ;
635
+ block ( parser, & * s, buffer) ;
603
636
}
604
637
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) ;
606
639
}
607
640
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 ( ) ) ;
609
648
}
610
649
_ => { }
611
650
}
651
+ true
612
652
} 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) {
613
667
break
614
668
}
615
669
}
0 commit comments