Skip to content

Commit c6a5d12

Browse files
authored
Merge pull request #222 from steveklabnik/gh29
Implement playpen support for ```rust
2 parents c7916c4 + b120ce7 commit c6a5d12

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

src/renderer/html_handlebars/hbs_renderer.rs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,11 @@ impl Renderer for HtmlHandlebars {
9797

9898
let filename = Path::new(&ch.path).with_extension("html");
9999

100-
// create links for headers and fix anchors
100+
// Do several kinds of post-processing
101101
let rendered = build_header_links(rendered, filename.to_str().unwrap_or(""));
102102
let rendered = fix_anchor_links(rendered, filename.to_str().unwrap_or(""));
103-
104-
// fix code blocks
105103
let rendered = fix_code_blocks(rendered);
104+
let rendered = add_playpen_pre(rendered);
106105

107106
// Write to file
108107
info!("[*] Creating {:?} ✓", filename.display());
@@ -146,11 +145,12 @@ impl Renderer for HtmlHandlebars {
146145
debug!("[*]: Render template");
147146

148147
let rendered = try!(handlebars.render("index", &data));
148+
149+
// do several kinds of post-processing
149150
let rendered = build_header_links(rendered, "print.html");
150151
let rendered = fix_anchor_links(rendered, "print.html");
151-
152-
// fix code blocks
153152
let rendered = fix_code_blocks(rendered);
153+
let rendered = add_playpen_pre(rendered);
154154

155155
try!(book.write_file(Path::new("print").with_extension("html"), &rendered.into_bytes()));
156156
info!("[*] Creating print.html ✓");
@@ -292,3 +292,30 @@ fn fix_code_blocks(html: String) -> String {
292292
format!("<code{before}class=\"{classes}\"{after}>", before=before, classes=classes, after=after)
293293
}).into_owned()
294294
}
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

Comments
 (0)