@@ -97,12 +97,11 @@ impl Renderer for HtmlHandlebars {
97
97
98
98
let filename = Path :: new ( & ch. path ) . with_extension ( "html" ) ;
99
99
100
- // create links for headers and fix anchors
100
+ // Do several kinds of post-processing
101
101
let rendered = build_header_links ( rendered, filename. to_str ( ) . unwrap_or ( "" ) ) ;
102
102
let rendered = fix_anchor_links ( rendered, filename. to_str ( ) . unwrap_or ( "" ) ) ;
103
-
104
- // fix code blocks
105
103
let rendered = fix_code_blocks ( rendered) ;
104
+ let rendered = add_playpen_pre ( rendered) ;
106
105
107
106
// Write to file
108
107
info ! ( "[*] Creating {:?} ✓" , filename. display( ) ) ;
@@ -146,11 +145,12 @@ impl Renderer for HtmlHandlebars {
146
145
debug ! ( "[*]: Render template" ) ;
147
146
148
147
let rendered = try!( handlebars. render ( "index" , & data) ) ;
148
+
149
+ // do several kinds of post-processing
149
150
let rendered = build_header_links ( rendered, "print.html" ) ;
150
151
let rendered = fix_anchor_links ( rendered, "print.html" ) ;
151
-
152
- // fix code blocks
153
152
let rendered = fix_code_blocks ( rendered) ;
153
+ let rendered = add_playpen_pre ( rendered) ;
154
154
155
155
try!( book. write_file ( Path :: new ( "print" ) . with_extension ( "html" ) , & rendered. into_bytes ( ) ) ) ;
156
156
info ! ( "[*] Creating print.html ✓" ) ;
@@ -292,3 +292,30 @@ fn fix_code_blocks(html: String) -> String {
292
292
format ! ( "<code{before}class=\" {classes}\" {after}>" , before=before, classes=classes, after=after)
293
293
} ) . into_owned ( )
294
294
}
295
+
296
+ fn add_playpen_pre ( html : String ) -> String {
297
+ let regex = Regex :: new ( r##"((?s)<code[^>]?class="([^"]+)".*?>(.*?)</code>)"## ) . unwrap ( ) ;
298
+ regex. replace_all ( & html, |caps : & Captures | {
299
+ let text = & caps[ 1 ] ;
300
+ let classes = & caps[ 2 ] ;
301
+ let code = & caps[ 3 ] ;
302
+
303
+ if classes. contains ( "language-rust" ) && !classes. contains ( "ignore" ) {
304
+ // wrap the contents in an external pre block
305
+
306
+ if text. contains ( "fn main" ) {
307
+ format ! ( "<pre class=\" playpen\" >{}</pre>" , text)
308
+ } else {
309
+ // we need to inject our own main
310
+ format ! ( "<pre class=\" playpen\" ><code class=\" {}\" ># #![allow(unused_variables)]
311
+ #
312
+ #fn main() {{
313
+ {}
314
+ #}}</code></pre>" , classes, code)
315
+ }
316
+ } else {
317
+ // not language-rust, so no-op
318
+ format ! ( "{}" , text)
319
+ }
320
+ } ) . into_owned ( )
321
+ }
0 commit comments