@@ -601,65 +601,44 @@ fn fix_code_blocks(html: &str) -> String {
601
601
}
602
602
603
603
fn add_playpen_pre ( html : & str , playpen_config : & Playpen ) -> String {
604
- let boring_line_regex = Regex :: new ( r"^(\s*)#(#|.)(.*)$" ) . unwrap ( ) ;
605
604
let regex = Regex :: new ( r##"((?s)<code[^>]?class="([^"]+)".*?>(.*?)</code>)"## ) . unwrap ( ) ;
606
605
regex
607
606
. replace_all ( html, |caps : & Captures < ' _ > | {
608
607
let text = & caps[ 1 ] ;
609
608
let classes = & caps[ 2 ] ;
610
609
let code = & caps[ 3 ] ;
611
610
612
- if ( classes. contains ( "language-rust" )
613
- && !classes. contains ( "ignore" )
614
- && !classes. contains ( "noplaypen" ) )
615
- || classes. contains ( "mdbook-runnable" )
616
- {
617
- // wrap the contents in an external pre block
618
- format ! (
619
- "<pre class=\" playpen\" ><code class=\" {}\" >{}</code></pre>" ,
620
- classes,
621
- {
622
- let content: Cow <' _, str > = if playpen_config. editable
623
- && classes. contains( "editable" )
624
- || text. contains( "fn main" )
625
- || text. contains( "quick_main!" )
611
+ if classes. contains ( "language-rust" ) {
612
+ if ( !classes. contains ( "ignore" ) && !classes. contains ( "noplaypen" ) )
613
+ || classes. contains ( "mdbook-runnable" )
614
+ {
615
+ // wrap the contents in an external pre block
616
+ format ! (
617
+ "<pre class=\" playpen\" ><code class=\" {}\" >{}</code></pre>" ,
618
+ classes,
626
619
{
627
- code. into( )
628
- } else {
629
- // we need to inject our own main
630
- let ( attrs, code) = partition_source( code) ;
631
-
632
- format!(
633
- "\n # #![allow(unused_variables)]\n {}#fn main() {{\n {}#}}" ,
634
- attrs, code
635
- )
636
- . into( )
637
- } ;
638
- let mut prev_line_hidden = false ;
639
- let mut result = String :: with_capacity( content. len( ) ) ;
640
- for line in content. lines( ) {
641
- if let Some ( caps) = boring_line_regex. captures( line) {
642
- if !prev_line_hidden && & caps[ 2 ] != "#" {
643
- result += "<span class=\" boring\" >" ;
644
- prev_line_hidden = true ;
645
- }
646
- result += & caps[ 1 ] ;
647
- if & caps[ 2 ] != " " {
648
- result += & caps[ 2 ] ;
649
- }
650
- result += & caps[ 3 ] ;
620
+ let content: Cow <' _, str > = if playpen_config. editable
621
+ && classes. contains( "editable" )
622
+ || text. contains( "fn main" )
623
+ || text. contains( "quick_main!" )
624
+ {
625
+ code. into( )
651
626
} else {
652
- if prev_line_hidden {
653
- result += "</span>" ;
654
- prev_line_hidden = false ;
655
- }
656
- result += line;
657
- }
658
- result += "\n " ;
627
+ // we need to inject our own main
628
+ let ( attrs, code) = partition_source( code) ;
629
+
630
+ format!(
631
+ "\n # #![allow(unused_variables)]\n {}#fn main() {{\n {}#}}" ,
632
+ attrs, code
633
+ )
634
+ . into( )
635
+ } ;
636
+ hide_lines( & content)
659
637
}
660
- result
661
- }
662
- )
638
+ )
639
+ } else {
640
+ format ! ( "<code class=\" {}\" >{}</code>" , classes, hide_lines( code) )
641
+ }
663
642
} else {
664
643
// not language-rust, so no-op
665
644
text. to_owned ( )
@@ -668,6 +647,38 @@ fn add_playpen_pre(html: &str, playpen_config: &Playpen) -> String {
668
647
. into_owned ( )
669
648
}
670
649
650
+ lazy_static ! {
651
+ static ref BORING_LINES_REGEX : Regex = Regex :: new( r"^(\s*)#(.?)(.*)$" ) . unwrap( ) ;
652
+ }
653
+
654
+ fn hide_lines ( content : & str ) -> String {
655
+ let mut result = String :: with_capacity ( content. len ( ) ) ;
656
+ for line in content. lines ( ) {
657
+ if let Some ( caps) = BORING_LINES_REGEX . captures ( line) {
658
+ if & caps[ 2 ] == "#" {
659
+ result += & caps[ 1 ] ;
660
+ result += & caps[ 2 ] ;
661
+ result += & caps[ 3 ] ;
662
+ result += "\n " ;
663
+ continue ;
664
+ } else if & caps[ 2 ] != "!" && & caps[ 2 ] != "[" {
665
+ result += "<span class=\" boring\" >" ;
666
+ result += & caps[ 1 ] ;
667
+ if & caps[ 2 ] != " " {
668
+ result += & caps[ 2 ] ;
669
+ }
670
+ result += & caps[ 3 ] ;
671
+ result += "\n " ;
672
+ result += "</span>" ;
673
+ continue ;
674
+ }
675
+ }
676
+ result += line;
677
+ result += "\n " ;
678
+ }
679
+ result
680
+ }
681
+
671
682
fn partition_source ( s : & str ) -> ( String , String ) {
672
683
let mut after_header = false ;
673
684
let mut before = String :: new ( ) ;
@@ -740,13 +751,19 @@ mod tests {
740
751
fn add_playpen ( ) {
741
752
let inputs = [
742
753
( "<code class=\" language-rust\" >x()</code>" ,
743
- "<pre class=\" playpen\" ><code class=\" language-rust\" >\n <span class=\" boring\" >#![allow(unused_variables)]\n fn main() {\n </span>x()\n <span class=\" boring\" >}\n </code></pre>" ) ,
754
+ "<pre class=\" playpen\" ><code class=\" language-rust\" >\n <span class=\" boring\" >#![allow(unused_variables)]\n </span><span class= \" boring \" >fn main() {\n </span>x()\n <span class=\" boring\" >}\n </span> </code></pre>" ) ,
744
755
( "<code class=\" language-rust\" >fn main() {}</code>" ,
745
756
"<pre class=\" playpen\" ><code class=\" language-rust\" >fn main() {}\n </code></pre>" ) ,
746
757
( "<code class=\" language-rust editable\" >let s = \" foo\n # bar\n \" ;</code>" ,
747
758
"<pre class=\" playpen\" ><code class=\" language-rust editable\" >let s = \" foo\n <span class=\" boring\" > bar\n </span>\" ;\n </code></pre>" ) ,
748
759
( "<code class=\" language-rust editable\" >let s = \" foo\n ## bar\n \" ;</code>" ,
749
760
"<pre class=\" playpen\" ><code class=\" language-rust editable\" >let s = \" foo\n # bar\n \" ;\n </code></pre>" ) ,
761
+ ( "<code class=\" language-rust editable\" >let s = \" foo\n # bar\n #\n \" ;</code>" ,
762
+ "<pre class=\" playpen\" ><code class=\" language-rust editable\" >let s = \" foo\n <span class=\" boring\" > bar\n </span><span class=\" boring\" >\n </span>\" ;\n </code></pre>" ) ,
763
+ ( "<code class=\" language-rust ignore\" >let s = \" foo\n # bar\n \" ;</code>" ,
764
+ "<code class=\" language-rust ignore\" >let s = \" foo\n <span class=\" boring\" > bar\n </span>\" ;\n </code>" ) ,
765
+ ( "<code class=\" language-rust editable\" >#![no_std]\n let s = \" foo\" ;\n #[some_attr]</code>" ,
766
+ "<pre class=\" playpen\" ><code class=\" language-rust editable\" >#![no_std]\n let s = \" foo\" ;\n #[some_attr]\n </code></pre>" ) ,
750
767
] ;
751
768
for ( src, should_be) in & inputs {
752
769
let got = add_playpen_pre (
0 commit comments