diff options
Diffstat (limited to 'vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs')
-rw-r--r-- | vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs b/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs index b933a359a..1b648dac1 100644 --- a/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs +++ b/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs @@ -14,7 +14,10 @@ use std::path::{Path, PathBuf}; use crate::utils::fs::get_404_output_file; use handlebars::Handlebars; +use log::{debug, trace, warn}; +use once_cell::sync::Lazy; use regex::{Captures, Regex}; +use serde_json::json; #[derive(Default)] pub struct HtmlHandlebars; @@ -337,6 +340,7 @@ impl HtmlHandlebars { ); handlebars.register_helper("previous", Box::new(helpers::navigation::previous)); handlebars.register_helper("next", Box::new(helpers::navigation::next)); + // TODO: remove theme_option in 0.5, it is not needed. handlebars.register_helper("theme_option", Box::new(helpers::theme::theme_option)); } @@ -627,6 +631,7 @@ fn make_data( ); } + // TODO: remove default_theme in 0.5, it is not needed. let default_theme = match html_config.default_theme { Some(ref theme) => theme.to_lowercase(), None => "light".to_string(), @@ -764,9 +769,8 @@ fn make_data( /// Goes through the rendered HTML, making sure all header tags have /// an anchor respectively so people can link to sections directly. fn build_header_links(html: &str) -> String { - lazy_static! { - static ref BUILD_HEADER_LINKS: Regex = Regex::new(r"<h(\d)>(.*?)</h\d>").unwrap(); - } + static BUILD_HEADER_LINKS: Lazy<Regex> = + Lazy::new(|| Regex::new(r"<h(\d)>(.*?)</h\d>").unwrap()); let mut id_counter = HashMap::new(); @@ -807,10 +811,8 @@ fn insert_link_into_header( // ``` // This function replaces all commas by spaces in the code block classes fn fix_code_blocks(html: &str) -> String { - lazy_static! { - static ref FIX_CODE_BLOCKS: Regex = - Regex::new(r##"<code([^>]+)class="([^"]+)"([^>]*)>"##).unwrap(); - } + static FIX_CODE_BLOCKS: Lazy<Regex> = + Lazy::new(|| Regex::new(r##"<code([^>]+)class="([^"]+)"([^>]*)>"##).unwrap()); FIX_CODE_BLOCKS .replace_all(html, |caps: &Captures<'_>| { @@ -833,10 +835,9 @@ fn add_playground_pre( playground_config: &Playground, edition: Option<RustEdition>, ) -> String { - lazy_static! { - static ref ADD_PLAYGROUND_PRE: Regex = - Regex::new(r##"((?s)<code[^>]?class="([^"]+)".*?>(.*?)</code>)"##).unwrap(); - } + static ADD_PLAYGROUND_PRE: Lazy<Regex> = + Lazy::new(|| Regex::new(r##"((?s)<code[^>]?class="([^"]+)".*?>(.*?)</code>)"##).unwrap()); + ADD_PLAYGROUND_PRE .replace_all(html, |caps: &Captures<'_>| { let text = &caps[1]; @@ -899,18 +900,19 @@ fn add_playground_pre( } fn hide_lines(content: &str) -> String { - lazy_static! { - static ref BORING_LINES_REGEX: Regex = Regex::new(r"^(\s*)#(.?)(.*)$").unwrap(); - } + static BORING_LINES_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"^(\s*)#(.?)(.*)$").unwrap()); let mut result = String::with_capacity(content.len()); - for line in content.lines() { + let mut lines = content.lines().peekable(); + while let Some(line) = lines.next() { + // Don't include newline on the last line. + let newline = if lines.peek().is_none() { "" } else { "\n" }; if let Some(caps) = BORING_LINES_REGEX.captures(line) { if &caps[2] == "#" { result += &caps[1]; result += &caps[2]; result += &caps[3]; - result += "\n"; + result += newline; continue; } else if &caps[2] != "!" && &caps[2] != "[" { result += "<span class=\"boring\">"; @@ -919,13 +921,13 @@ fn hide_lines(content: &str) -> String { result += &caps[2]; } result += &caps[3]; - result += "\n"; + result += newline; result += "</span>"; continue; } } result += line; - result += "\n"; + result += newline; } result } @@ -1005,19 +1007,19 @@ mod tests { fn add_playground() { let inputs = [ ("<code class=\"language-rust\">x()</code>", - "<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>"), + "<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>"), ("<code class=\"language-rust\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust\">fn main() {}</code></pre>"), ("<code class=\"language-rust editable\">let s = \"foo\n # bar\n\";</code>", - "<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";</code></pre>"), ("<code class=\"language-rust editable\">let s = \"foo\n ## bar\n\";</code>", - "<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n # bar\n\";\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust editable\">let s = \"foo\n # bar\n\";</code></pre>"), ("<code class=\"language-rust editable\">let s = \"foo\n # bar\n#\n\";</code>", - "<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>"), + "<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>"), ("<code class=\"language-rust ignore\">let s = \"foo\n # bar\n\";</code>", - "<code class=\"language-rust ignore\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";\n</code>"), + "<code class=\"language-rust ignore\">let s = \"foo\n<span class=\"boring\"> bar\n</span>\";</code>"), ("<code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]</code>", - "<pre class=\"playground\"><code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust editable\">#![no_std]\nlet s = \"foo\";\n #[some_attr]</code></pre>"), ]; for (src, should_be) in &inputs { let got = add_playground_pre( @@ -1035,13 +1037,13 @@ mod tests { fn add_playground_edition2015() { let inputs = [ ("<code class=\"language-rust\">x()</code>", - "<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>"), + "<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>"), ("<code class=\"language-rust\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"), ("<code class=\"language-rust edition2015\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"), ("<code class=\"language-rust edition2018\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"), ]; for (src, should_be) in &inputs { let got = add_playground_pre( @@ -1059,13 +1061,13 @@ mod tests { fn add_playground_edition2018() { let inputs = [ ("<code class=\"language-rust\">x()</code>", - "<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>"), + "<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>"), ("<code class=\"language-rust\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"), ("<code class=\"language-rust edition2015\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"), ("<code class=\"language-rust edition2018\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"), ]; for (src, should_be) in &inputs { let got = add_playground_pre( @@ -1083,13 +1085,13 @@ mod tests { fn add_playground_edition2021() { let inputs = [ ("<code class=\"language-rust\">x()</code>", - "<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>"), + "<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>"), ("<code class=\"language-rust\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2021\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2021\">fn main() {}</code></pre>"), ("<code class=\"language-rust edition2015\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}</code></pre>"), ("<code class=\"language-rust edition2018\">fn main() {}</code>", - "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"), + "<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}</code></pre>"), ]; for (src, should_be) in &inputs { let got = add_playground_pre( |