Skip to content

Commit 9908e02

Browse files
Add minification for CSS and JS files
1 parent e8dff6f commit 9908e02

File tree

4 files changed

+60
-22
lines changed

4 files changed

+60
-22
lines changed

Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ handlebars = "6.0"
3535
hex = "0.4.3"
3636
log = "0.4.17"
3737
memchr = "2.5.0"
38+
minifier = "0.3.6"
3839
opener = "0.8.1"
3940
pulldown-cmark = { version = "0.10.0", default-features = false, features = ["html"] } # Do not update, part of the public api.
4041
regex = "1.8.1"

src/book/init.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,18 +131,18 @@ impl BookBuilder {
131131
}
132132

133133
let mut general_css = File::create(cssdir.join("general.css"))?;
134-
general_css.write_all(theme::GENERAL_CSS)?;
134+
theme::GENERAL_CSS.write_into(&mut general_css)?;
135135

136136
let mut chrome_css = File::create(cssdir.join("chrome.css"))?;
137-
chrome_css.write_all(theme::CHROME_CSS)?;
137+
theme::CHROME_CSS.write_into(&mut chrome_css)?;
138138

139139
if html_config.print.enable {
140140
let mut print_css = File::create(cssdir.join("print.css"))?;
141-
print_css.write_all(theme::PRINT_CSS)?;
141+
theme::PRINT_CSS.write_into(&mut print_css)?;
142142
}
143143

144144
let mut variables_css = File::create(cssdir.join("variables.css"))?;
145-
variables_css.write_all(theme::VARIABLES_CSS)?;
145+
theme::VARIABLES_CSS.write_into(&mut variables_css)?;
146146

147147
let mut favicon = File::create(themedir.join("favicon.png"))?;
148148
favicon.write_all(theme::FAVICON_PNG)?;
@@ -151,10 +151,10 @@ impl BookBuilder {
151151
favicon.write_all(theme::FAVICON_SVG)?;
152152

153153
let mut js = File::create(themedir.join("book.js"))?;
154-
js.write_all(theme::JS)?;
154+
theme::JS.write_into(&mut js)?;
155155

156156
let mut highlight_css = File::create(themedir.join("highlight.css"))?;
157-
highlight_css.write_all(theme::HIGHLIGHT_CSS)?;
157+
theme::HIGHLIGHT_CSS.write_into(&mut highlight_css)?;
158158

159159
let mut highlight_js = File::create(themedir.join("highlight.js"))?;
160160
highlight_js.write_all(theme::HIGHLIGHT_JS)?;

src/front-end/mod.rs

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ pub static REDIRECT: &[u8] = include_bytes!("templates/redirect.hbs");
1919
pub static HEADER: &[u8] = include_bytes!("templates/header.hbs");
2020
pub static TOC_JS: &[u8] = include_bytes!("templates/toc.js.hbs");
2121
pub static TOC_HTML: &[u8] = include_bytes!("templates/toc.html.hbs");
22-
pub static CHROME_CSS: &[u8] = include_bytes!("css/chrome.css");
23-
pub static GENERAL_CSS: &[u8] = include_bytes!("css/general.css");
24-
pub static PRINT_CSS: &[u8] = include_bytes!("css/print.css");
25-
pub static VARIABLES_CSS: &[u8] = include_bytes!("css/variables.css");
22+
pub static CHROME_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/chrome.css"));
23+
pub static GENERAL_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/general.css"));
24+
pub static PRINT_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/print.css"));
25+
pub static VARIABLES_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/variables.css"));
2626
pub static FAVICON_PNG: &[u8] = include_bytes!("images/favicon.png");
2727
pub static FAVICON_SVG: &[u8] = include_bytes!("images/favicon.svg");
28-
pub static JS: &[u8] = include_bytes!("js/book.js");
28+
pub static JS: ContentToMinify = ContentToMinify::JS(include_str!("js/book.js"));
2929
pub static HIGHLIGHT_JS: &[u8] = include_bytes!("js/highlight.js");
30-
pub static TOMORROW_NIGHT_CSS: &[u8] = include_bytes!("css/tomorrow-night.css");
31-
pub static HIGHLIGHT_CSS: &[u8] = include_bytes!("css/highlight.css");
32-
pub static AYU_HIGHLIGHT_CSS: &[u8] = include_bytes!("css/ayu-highlight.css");
30+
pub static TOMORROW_NIGHT_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/tomorrow-night.css"));
31+
pub static HIGHLIGHT_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/highlight.css"));
32+
pub static AYU_HIGHLIGHT_CSS: ContentToMinify = ContentToMinify::CSS(include_str!("css/ayu-highlight.css"));
3333
pub static CLIPBOARD_JS: &[u8] = include_bytes!("js/clipboard.min.js");
3434
pub static FONT_AWESOME: &[u8] = include_bytes!("css/font-awesome.min.css");
3535
pub static FONT_AWESOME_EOT: &[u8] = include_bytes!("fonts/fontawesome-webfont.eot");
@@ -39,6 +39,33 @@ pub static FONT_AWESOME_WOFF: &[u8] = include_bytes!("fonts/fontawesome-webfont.
3939
pub static FONT_AWESOME_WOFF2: &[u8] = include_bytes!("fonts/fontawesome-webfont.woff2");
4040
pub static FONT_AWESOME_OTF: &[u8] = include_bytes!("fonts/FontAwesome.otf");
4141

42+
#[derive(Clone, Copy)]
43+
pub enum ContentToMinify {
44+
CSS(&'static str),
45+
JS(&'static str),
46+
}
47+
48+
impl ContentToMinify {
49+
pub fn minified(self) -> Vec<u8> {
50+
let mut out = Vec::new();
51+
self.write_into(&mut out).unwrap();
52+
out
53+
}
54+
55+
pub fn write_into<W: std::io::Write>(self, out: &mut W) -> std::io::Result<()> {
56+
match self {
57+
Self::CSS(data) => {
58+
match minifier::css::minify(data) {
59+
Ok(data) => return data.write(out),
60+
Err(_) => out.write(data.as_bytes())?,
61+
}
62+
}
63+
Self::JS(data) => return minifier::js::minify(data).write(out),
64+
};
65+
Ok(())
66+
}
67+
}
68+
4269
/// The `Theme` struct should be used instead of the static variables because
4370
/// the `new()` method will look if the user has a theme directory in their
4471
/// source folder and use the users theme instead of the default.
@@ -181,18 +208,18 @@ impl Default for Theme {
181208
header: HEADER.to_owned(),
182209
toc_js: TOC_JS.to_owned(),
183210
toc_html: TOC_HTML.to_owned(),
184-
chrome_css: CHROME_CSS.to_owned(),
185-
general_css: GENERAL_CSS.to_owned(),
186-
print_css: PRINT_CSS.to_owned(),
187-
variables_css: VARIABLES_CSS.to_owned(),
211+
chrome_css: CHROME_CSS.minified(),
212+
general_css: GENERAL_CSS.minified(),
213+
print_css: PRINT_CSS.minified(),
214+
variables_css: VARIABLES_CSS.minified(),
188215
fonts_css: None,
189216
font_files: Vec::new(),
190217
favicon_png: Some(FAVICON_PNG.to_owned()),
191218
favicon_svg: Some(FAVICON_SVG.to_owned()),
192-
js: JS.to_owned(),
193-
highlight_css: HIGHLIGHT_CSS.to_owned(),
194-
tomorrow_night_css: TOMORROW_NIGHT_CSS.to_owned(),
195-
ayu_highlight_css: AYU_HIGHLIGHT_CSS.to_owned(),
219+
js: JS.minified(),
220+
highlight_css: HIGHLIGHT_CSS.minified(),
221+
tomorrow_night_css: TOMORROW_NIGHT_CSS.minified(),
222+
ayu_highlight_css: AYU_HIGHLIGHT_CSS.minified(),
196223
highlight_js: HIGHLIGHT_JS.to_owned(),
197224
clipboard_js: CLIPBOARD_JS.to_owned(),
198225
}

0 commit comments

Comments
 (0)