From 9de1c561f40d408e59bbdbad64eede51ed5b9b2c Mon Sep 17 00:00:00 2001 From: Jason Yundt Date: Thu, 20 Jan 2022 17:52:04 -0500 Subject: [PATCH 1/3] Include minify_css and minify_js in the public Rust API --- rust/main/src/lib.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/rust/main/src/lib.rs b/rust/main/src/lib.rs index 1e8f2715..34a3597c 100644 --- a/rust/main/src/lib.rs +++ b/rust/main/src/lib.rs @@ -5,6 +5,8 @@ pub use crate::cfg::Cfg; use crate::common::spec::tag::ns::Namespace; use crate::common::spec::tag::EMPTY_SLICE; use crate::minify::content::minify_content; +use crate::minify::css::minify_css as minify_css_internal; +use crate::minify::js::minify_js as minify_js_internal; use crate::parse::content::parse_content; use crate::parse::Code; @@ -50,6 +52,62 @@ pub fn minify(src: &[u8], cfg: &Cfg) -> Vec { out } +/// Minifies UTF-8 CSS code, represented as an array of bytes. +/// +/// [esbuild-rs](https://github.com/wilsonzlin/esbuild-rs) is used to minify +/// the CSS. The `js-esbuild` feature must be enabled, and cfg.minify_css must +/// be `true`; otherwise, this function has no effect. +/// +/// # Arguments +/// +/// * `code` - A slice of bytes representing the source code to minify. +/// * `cfg` - Configuration object to adjust minification approach. +/// +/// # Examples +/// +/// ``` +/// use minify_html::{Cfg, minify_css}; +/// +/// let code: &[u8] = b"a { color: red; }"; +/// let mut cfg = Cfg::new(); +/// cfg.minify_css = true; +/// let minified = minify_css(&code, &cfg); +/// assert!(minified.len() < code.len()); +/// ``` +pub fn minify_css(src: &[u8], cfg: &Cfg) -> Vec { + let mut out = Vec::with_capacity(src.len()); + minify_css_internal(cfg, &mut out, src); + out +} + +/// Minifies UTF-8 JavaScript code, represented as an array of bytes. +/// +/// [esbuild-rs](https://github.com/wilsonzlin/esbuild-rs) is used to minify +/// the JS. The `js-esbuild` feature must be enabled, and cfg.minify_js must +/// be `true`; otherwise, this function has no effect. +/// +/// # Arguments +/// +/// * `code` - A slice of bytes representing the source code to minify. +/// * `cfg` - Configuration object to adjust minification approach. +/// +/// # Examples +/// +/// ``` +/// use minify_html::{Cfg, minify_js}; +/// +/// let code: &[u8] = b"alert( 'Hello, world!' );"; +/// let mut cfg = Cfg::new(); +/// cfg.minify_js = true; +/// let minified = minify_js(&code, &cfg); +/// assert!(minified.len() < code.len()); +/// ``` +pub fn minify_js(src: &[u8], cfg: &Cfg) -> Vec { + let mut out = Vec::with_capacity(src.len()); + minify_js_internal(cfg, &mut out, src); + out +} + pub fn canonicalise(out: &mut T, src: &[u8]) -> std::io::Result<()> { let mut code = Code::new(src); let parsed = parse_content(&mut code, Namespace::Html, EMPTY_SLICE, EMPTY_SLICE); From 7c5aa713708b5620b55eaed0db1c9577f446a658 Mon Sep 17 00:00:00 2001 From: Jason Yundt Date: Fri, 21 Jan 2022 16:49:24 -0500 Subject: [PATCH 2/3] Allow CLI to minify CSS and JS --- cli/src/main.rs | 88 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 20 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index ec0aa8f9..869c9b97 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,9 +1,51 @@ +use std::fmt; use std::fs::File; use std::io::{stdin, stdout, Read, Write}; +use std::str::FromStr; use structopt::StructOpt; -use minify_html::{minify, Cfg}; +use minify_html::{minify, minify_css, minify_js, Cfg}; + +#[derive(PartialEq)] +enum SourceType { + Html, + Css, + Js, +} + +impl Default for SourceType { + fn default() -> Self { + SourceType::Html + } +} + +impl fmt::Display for SourceType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + match self { + SourceType::Html => "html", + SourceType::Css => "css", + SourceType::Js => "js", + } + ) + } +} + +impl FromStr for SourceType { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_ascii_lowercase().as_str() { + "html" => Ok(SourceType::Html), + "css" => Ok(SourceType::Css), + "js" => Ok(SourceType::Js), + _ => Err(format!("\"{}\" is not \"html\", \"css\" or \"js\".", s)), + } + } +} #[derive(StructOpt)] #[structopt( @@ -20,11 +62,11 @@ struct Cli { #[structopt(short, long, parse(from_os_str))] output: Option, - /// Minify JS in `