Skip to content

Commit 9b1d788

Browse files
authored
Merge pull request rust-lang#1088 from benediktwerner/master
Fix hiding of empty boring lines
2 parents 0f8a479 + 3a4d5ee commit 9b1d788

File tree

2 files changed

+67
-53
lines changed

2 files changed

+67
-53
lines changed

src/renderer/html_handlebars/hbs_renderer.rs

+67-50
Original file line numberDiff line numberDiff line change
@@ -601,65 +601,44 @@ fn fix_code_blocks(html: &str) -> String {
601601
}
602602

603603
fn add_playpen_pre(html: &str, playpen_config: &Playpen) -> String {
604-
let boring_line_regex = Regex::new(r"^(\s*)#(#|.)(.*)$").unwrap();
605604
let regex = Regex::new(r##"((?s)<code[^>]?class="([^"]+)".*?>(.*?)</code>)"##).unwrap();
606605
regex
607606
.replace_all(html, |caps: &Captures<'_>| {
608607
let text = &caps[1];
609608
let classes = &caps[2];
610609
let code = &caps[3];
611610

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,
626619
{
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()
651626
} 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)
659637
}
660-
result
661-
}
662-
)
638+
)
639+
} else {
640+
format!("<code class=\"{}\">{}</code>", classes, hide_lines(code))
641+
}
663642
} else {
664643
// not language-rust, so no-op
665644
text.to_owned()
@@ -668,6 +647,38 @@ fn add_playpen_pre(html: &str, playpen_config: &Playpen) -> String {
668647
.into_owned()
669648
}
670649

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+
671682
fn partition_source(s: &str) -> (String, String) {
672683
let mut after_header = false;
673684
let mut before = String::new();
@@ -740,13 +751,19 @@ mod tests {
740751
fn add_playpen() {
741752
let inputs = [
742753
("<code class=\"language-rust\">x()</code>",
743-
"<pre class=\"playpen\"><code class=\"language-rust\">\n<span class=\"boring\">#![allow(unused_variables)]\nfn 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>"),
744755
("<code class=\"language-rust\">fn main() {}</code>",
745756
"<pre class=\"playpen\"><code class=\"language-rust\">fn main() {}\n</code></pre>"),
746757
("<code class=\"language-rust editable\">let s = \"foo\n # bar\n\";</code>",
747758
"<pre class=\"playpen\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";\n</code></pre>"),
748759
("<code class=\"language-rust editable\">let s = \"foo\n ## bar\n\";</code>",
749760
"<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]\nlet s = \"foo\";\n #[some_attr]</code>",
766+
"<pre class=\"playpen\"><code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]\n</code></pre>"),
750767
];
751768
for (src, should_be) in &inputs {
752769
let got = add_playpen_pre(

src/theme/book.js

-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ function playpen_text(playpen) {
1616
}
1717

1818
(function codeSnippets() {
19-
// Hide Rust code lines prepended with a specific character
20-
var hiding_character = "#";
21-
2219
function fetch_with_timeout(url, options, timeout = 6000) {
2320
return Promise.race([
2421
fetch(url, options),

0 commit comments

Comments
 (0)