minify-html/rust/onepass/src/unit/style.rs

43 lines
1.2 KiB
Rust
Raw Normal View History

use aho_corasick::{AhoCorasick, AhoCorasickBuilder};
2022-06-21 11:36:27 -04:00
use css_minify::optimizations::{Level, Minifier};
use lazy_static::lazy_static;
2021-04-14 11:36:06 -04:00
2022-06-21 11:36:27 -04:00
use std::str::from_utf8_unchecked;
2021-04-14 11:36:06 -04:00
use crate::err::ProcessingResult;
2022-06-21 11:36:27 -04:00
use crate::proc::checkpoint::WriteCheckpoint;
2021-04-14 11:36:06 -04:00
use crate::proc::MatchAction::*;
use crate::proc::MatchMode::*;
use crate::proc::Processor;
2021-08-08 03:58:10 -04:00
use crate::Cfg;
2021-01-07 08:26:02 -05:00
lazy_static! {
2021-08-08 03:58:10 -04:00
static ref STYLE_END: AhoCorasick = AhoCorasickBuilder::new()
.ascii_case_insensitive(true)
.build(&["</style"]);
}
#[inline(always)]
2021-01-07 08:26:02 -05:00
pub fn process_style(proc: &mut Processor, cfg: &Cfg) -> ProcessingResult<()> {
2021-08-08 03:58:10 -04:00
let start = WriteCheckpoint::new(proc);
proc.require_not_at_end()?;
2022-06-21 11:36:27 -04:00
let src = proc.m(WhileNotSeq(&STYLE_END), Discard);
// `process_tag` will require closing tag.
2021-01-07 08:26:02 -05:00
if cfg.minify_css {
2022-06-21 11:36:27 -04:00
let result = Minifier::default()
.minify(unsafe { from_utf8_unchecked(&proc[src]) }, Level::Three)
.ok();
// TODO Collect error as warning.
if result.as_ref().filter(|r| r.len() < src.len()).is_some() {
proc.write_slice(result.unwrap().as_bytes());
} else {
proc.write_range(src);
2021-01-07 08:26:02 -05:00
};
2022-06-21 11:36:27 -04:00
} else {
proc.write_range(src);
2021-01-07 08:26:02 -05:00
};
Ok(())
}