Skip to content

Commit 6279351

Browse files
authored
Revert "Move hiding of boring lines into static content (#846)"
This reverts commit 4448f3f.
1 parent 4448f3f commit 6279351

File tree

3 files changed

+60
-67
lines changed

3 files changed

+60
-67
lines changed

src/renderer/html_handlebars/hbs_renderer.rs

+15-59
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::renderer::{RenderContext, Renderer};
66
use crate::theme::{self, playpen_editor, Theme};
77
use crate::utils;
88

9-
use std::borrow::Cow;
109
use std::collections::BTreeMap;
1110
use std::collections::HashMap;
1211
use std::fs;
@@ -585,7 +584,6 @@ fn fix_code_blocks(html: &str) -> String {
585584
}
586585

587586
fn add_playpen_pre(html: &str, playpen_config: &Playpen) -> String {
588-
let boring_line_regex = Regex::new(r"^(\s*)#(#|.)(.*)$").unwrap();
589587
let regex = Regex::new(r##"((?s)<code[^>]?class="([^"]+)".*?>(.*?)</code>)"##).unwrap();
590588
regex
591589
.replace_all(html, |caps: &Captures<'_>| {
@@ -599,45 +597,21 @@ fn add_playpen_pre(html: &str, playpen_config: &Playpen) -> String {
599597
|| classes.contains("mdbook-runnable")
600598
{
601599
// wrap the contents in an external pre block
602-
format!("<pre class=\"playpen\"><code class=\"{}\">{}</code></pre>",
603-
classes,
604-
{
605-
let content: Cow<str> = if playpen_config.editable && classes.contains("editable")
606-
|| text.contains("fn main")
607-
|| text.contains("quick_main!")
608-
{
609-
code.into()
610-
} else {
611-
// we need to inject our own main
612-
let (attrs, code) = partition_source(code);
613-
614-
format!("\n# #![allow(unused_variables)]\n{}#fn main() {{\n{}#}}",
615-
attrs, code
616-
).into()
617-
};
618-
let mut prev_line_hidden = false;
619-
let mut result = String::with_capacity(content.len());
620-
for line in content.lines() {
621-
if let Some(caps) = boring_line_regex.captures(line) {
622-
if !prev_line_hidden && &caps[2] != "#" {
623-
result += "<span class=\"boring\">";
624-
prev_line_hidden = true;
625-
}
626-
result += &caps[1];
627-
if &caps[2] != " " { result += &caps[2]; }
628-
result += &caps[3];
629-
} else {
630-
if prev_line_hidden {
631-
result += "</span>";
632-
prev_line_hidden = false;
633-
}
634-
result += line;
635-
}
636-
result += "\n";
637-
}
638-
result
639-
}
640-
)
600+
if playpen_config.editable && classes.contains("editable")
601+
|| text.contains("fn main")
602+
|| text.contains("quick_main!")
603+
{
604+
format!("<pre class=\"playpen\">{}</pre>", text)
605+
} else {
606+
// we need to inject our own main
607+
let (attrs, code) = partition_source(code);
608+
609+
format!(
610+
"<pre class=\"playpen\"><code class=\"{}\">\n# \
611+
#![allow(unused_variables)]\n{}#fn main() {{\n{}#}}</code></pre>",
612+
classes, attrs, code
613+
)
614+
}
641615
} else {
642616
// not language-rust, so no-op
643617
text.to_owned()
@@ -713,22 +687,4 @@ mod tests {
713687
assert_eq!(got, should_be);
714688
}
715689
}
716-
717-
#[test]
718-
fn add_playpen() {
719-
let inputs = [
720-
("<code class=\"language-rust\">x()</code>",
721-
"<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>"),
722-
("<code class=\"language-rust\">fn main() {}</code>",
723-
"<pre class=\"playpen\"><code class=\"language-rust\">fn main() {}\n</code></pre>"),
724-
("<code class=\"language-rust editable\">let s = \"foo\n # bar\n\";</code>",
725-
"<pre class=\"playpen\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";\n</code></pre>"),
726-
("<code class=\"language-rust editable\">let s = \"foo\n ## bar\n\";</code>",
727-
"<pre class=\"playpen\"><code class=\"language-rust editable\">let s = \"foo\n # bar\n\";\n</code></pre>"),
728-
];
729-
for (src, should_be) in &inputs {
730-
let got = add_playpen_pre(src, &Playpen { editable: true, ..Playpen::default() });
731-
assert_eq!(&*got, *should_be);
732-
}
733-
}
734690
}

src/theme/book.js

+44-6
Original file line numberDiff line numberDiff line change
@@ -161,34 +161,72 @@ function playpen_text(playpen) {
161161

162162
Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) {
163163

164-
var lines = Array.from(block.querySelectorAll('.boring'));
164+
var code_block = block;
165+
var pre_block = block.parentNode;
166+
// hide lines
167+
var lines = code_block.innerHTML.split("\n");
168+
var first_non_hidden_line = false;
169+
var lines_hidden = false;
170+
var trimmed_line = "";
171+
172+
for (var n = 0; n < lines.length; n++) {
173+
trimmed_line = lines[n].trim();
174+
if (trimmed_line[0] == hiding_character && trimmed_line[1] != hiding_character) {
175+
if (first_non_hidden_line) {
176+
lines[n] = "<span class=\"hidden\">" + "\n" + lines[n].replace(/(\s*)# ?/, "$1") + "</span>";
177+
}
178+
else {
179+
lines[n] = "<span class=\"hidden\">" + lines[n].replace(/(\s*)# ?/, "$1") + "\n" + "</span>";
180+
}
181+
lines_hidden = true;
182+
}
183+
else if (first_non_hidden_line) {
184+
lines[n] = "\n" + lines[n];
185+
}
186+
else {
187+
first_non_hidden_line = true;
188+
}
189+
if (trimmed_line[0] == hiding_character && trimmed_line[1] == hiding_character) {
190+
lines[n] = lines[n].replace("##", "#")
191+
}
192+
}
193+
code_block.innerHTML = lines.join("");
194+
165195
// If no lines were hidden, return
166-
if (!lines.length) { return; }
167-
block.classList.add("hide-boring");
196+
if (!lines_hidden) { return; }
168197

169198
var buttons = document.createElement('div');
170199
buttons.className = 'buttons';
171200
buttons.innerHTML = "<button class=\"fa fa-expand\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>";
172201

173202
// add expand button
174-
var pre_block = block.parentNode;
175203
pre_block.insertBefore(buttons, pre_block.firstChild);
176204

177205
pre_block.querySelector('.buttons').addEventListener('click', function (e) {
178206
if (e.target.classList.contains('fa-expand')) {
207+
var lines = pre_block.querySelectorAll('span.hidden');
208+
179209
e.target.classList.remove('fa-expand');
180210
e.target.classList.add('fa-compress');
181211
e.target.title = 'Hide lines';
182212
e.target.setAttribute('aria-label', e.target.title);
183213

184-
block.classList.remove('hide-boring');
214+
Array.from(lines).forEach(function (line) {
215+
line.classList.remove('hidden');
216+
line.classList.add('unhidden');
217+
});
185218
} else if (e.target.classList.contains('fa-compress')) {
219+
var lines = pre_block.querySelectorAll('span.unhidden');
220+
186221
e.target.classList.remove('fa-compress');
187222
e.target.classList.add('fa-expand');
188223
e.target.title = 'Show hidden lines';
189224
e.target.setAttribute('aria-label', e.target.title);
190225

191-
block.classList.add('hide-boring');
226+
Array.from(lines).forEach(function (line) {
227+
line.classList.remove('unhidden');
228+
line.classList.add('hidden');
229+
});
192230
}
193231
});
194232
});

src/theme/css/general.css

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@ code {
2222

2323
.left { float: left; }
2424
.right { float: right; }
25-
.boring { opacity: 0.6; }
26-
.hide-boring .boring { display: none; }
2725
.hidden { display: none; }
26+
.play-button.hidden { display: none; }
2827

2928
h2, h3 { margin-top: 2.5em; }
3029
h4, h5 { margin-top: 2em; }

0 commit comments

Comments
 (0)