Skip to content

Commit fff067b

Browse files
authored
Merge pull request #1836 from mgeisler/trim-trailing-whitespace
Avoid empty last line in editable code blocks
2 parents 40c06f5 + 217546c commit fff067b

File tree

1 file changed

+26
-23
lines changed

1 file changed

+26
-23
lines changed

src/renderer/html_handlebars/hbs_renderer.rs

+26-23
Original file line numberDiff line numberDiff line change
@@ -904,13 +904,16 @@ fn hide_lines(content: &str) -> String {
904904
}
905905

906906
let mut result = String::with_capacity(content.len());
907-
for line in content.lines() {
907+
let mut lines = content.lines().peekable();
908+
while let Some(line) = lines.next() {
909+
// Don't include newline on the last line.
910+
let newline = if lines.peek().is_none() { "" } else { "\n" };
908911
if let Some(caps) = BORING_LINES_REGEX.captures(line) {
909912
if &caps[2] == "#" {
910913
result += &caps[1];
911914
result += &caps[2];
912915
result += &caps[3];
913-
result += "\n";
916+
result += newline;
914917
continue;
915918
} else if &caps[2] != "!" && &caps[2] != "[" {
916919
result += "<span class=\"boring\">";
@@ -919,13 +922,13 @@ fn hide_lines(content: &str) -> String {
919922
result += &caps[2];
920923
}
921924
result += &caps[3];
922-
result += "\n";
925+
result += newline;
923926
result += "</span>";
924927
continue;
925928
}
926929
}
927930
result += line;
928-
result += "\n";
931+
result += newline;
929932
}
930933
result
931934
}
@@ -1005,19 +1008,19 @@ mod tests {
10051008
fn add_playground() {
10061009
let inputs = [
10071010
("<code class=\"language-rust\">x()</code>",
1008-
"<pre class=\"playground\"><code class=\"language-rust\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}\n</span></code></pre>"),
1011+
"<pre class=\"playground\"><code class=\"language-rust\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}</span></code></pre>"),
10091012
("<code class=\"language-rust\">fn main() {}</code>",
1010-
"<pre class=\"playground\"><code class=\"language-rust\">fn main() {}\n</code></pre>"),
1013+
"<pre class=\"playground\"><code class=\"language-rust\">fn main() {}</code></pre>"),
10111014
("<code class=\"language-rust editable\">let s = \"foo\n # bar\n\";</code>",
1012-
"<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";\n</code></pre>"),
1015+
"<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";</code></pre>"),
10131016
("<code class=\"language-rust editable\">let s = \"foo\n ## bar\n\";</code>",
1014-
"<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n # bar\n\";\n</code></pre>"),
1017+
"<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n # bar\n\";</code></pre>"),
10151018
("<code class=\"language-rust editable\">let s = \"foo\n # bar\n#\n\";</code>",
1016-
"<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span><span class=\"boring\">\n</span>\";\n</code></pre>"),
1019+
"<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span><span class=\"boring\">\n</span>\";</code></pre>"),
10171020
("<code class=\"language-rust ignore\">let s = \"foo\n # bar\n\";</code>",
1018-
"<code class=\"language-rust ignore\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";\n</code>"),
1021+
"<code class=\"language-rust ignore\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";</code>"),
10191022
("<code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]</code>",
1020-
"<pre class=\"playground\"><code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]\n</code></pre>"),
1023+
"<pre class=\"playground\"><code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]</code></pre>"),
10211024
];
10221025
for (src, should_be) in &inputs {
10231026
let got = add_playground_pre(
@@ -1035,13 +1038,13 @@ mod tests {
10351038
fn add_playground_edition2015() {
10361039
let inputs = [
10371040
("<code class=\"language-rust\">x()</code>",
1038-
"<pre class=\"playground\"><code class=\"language-rust edition2015\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}\n</span></code></pre>"),
1041+
"<pre class=\"playground\"><code class=\"language-rust edition2015\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}</span></code></pre>"),
10391042
("<code class=\"language-rust\">fn main() {}</code>",
1040-
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"),
1043+
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"),
10411044
("<code class=\"language-rust edition2015\">fn main() {}</code>",
1042-
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"),
1045+
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"),
10431046
("<code class=\"language-rust edition2018\">fn main() {}</code>",
1044-
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"),
1047+
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"),
10451048
];
10461049
for (src, should_be) in &inputs {
10471050
let got = add_playground_pre(
@@ -1059,13 +1062,13 @@ mod tests {
10591062
fn add_playground_edition2018() {
10601063
let inputs = [
10611064
("<code class=\"language-rust\">x()</code>",
1062-
"<pre class=\"playground\"><code class=\"language-rust edition2018\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}\n</span></code></pre>"),
1065+
"<pre class=\"playground\"><code class=\"language-rust edition2018\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}</span></code></pre>"),
10631066
("<code class=\"language-rust\">fn main() {}</code>",
1064-
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"),
1067+
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"),
10651068
("<code class=\"language-rust edition2015\">fn main() {}</code>",
1066-
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"),
1069+
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"),
10671070
("<code class=\"language-rust edition2018\">fn main() {}</code>",
1068-
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"),
1071+
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"),
10691072
];
10701073
for (src, should_be) in &inputs {
10711074
let got = add_playground_pre(
@@ -1083,13 +1086,13 @@ mod tests {
10831086
fn add_playground_edition2021() {
10841087
let inputs = [
10851088
("<code class=\"language-rust\">x()</code>",
1086-
"<pre class=\"playground\"><code class=\"language-rust edition2021\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}\n</span></code></pre>"),
1089+
"<pre class=\"playground\"><code class=\"language-rust edition2021\"><span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}</span></code></pre>"),
10871090
("<code class=\"language-rust\">fn main() {}</code>",
1088-
"<pre class=\"playground\"><code class=\"language-rust edition2021\">fn main() {}\n</code></pre>"),
1091+
"<pre class=\"playground\"><code class=\"language-rust edition2021\">fn main() {}</code></pre>"),
10891092
("<code class=\"language-rust edition2015\">fn main() {}</code>",
1090-
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"),
1093+
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"),
10911094
("<code class=\"language-rust edition2018\">fn main() {}</code>",
1092-
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"),
1095+
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"),
10931096
];
10941097
for (src, should_be) in &inputs {
10951098
let got = add_playground_pre(

0 commit comments

Comments
 (0)