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

45 lines
1.3 KiB
Rust
Raw Normal View History

use aho_corasick::{AhoCorasick, AhoCorasickBuilder};
use lazy_static::lazy_static;
use crate::cfg::Cfg;
use crate::err::ProcessingResult;
2022-06-21 11:36:27 -04:00
use crate::proc::checkpoint::WriteCheckpoint;
2020-01-25 02:04:02 -05:00
use crate::proc::MatchAction::*;
use crate::proc::MatchMode::*;
2020-07-21 03:59:56 -04:00
use crate::proc::Processor;
lazy_static! {
2021-08-08 03:58:10 -04:00
static ref SCRIPT_END: AhoCorasick = AhoCorasickBuilder::new()
.ascii_case_insensitive(true)
.build(&["</script"]);
}
2022-09-27 22:51:44 -04:00
// Provide `None` to `mode` if not JS.
#[inline(always)]
2022-09-27 22:51:44 -04:00
pub fn process_script(
proc: &mut Processor,
cfg: &Cfg,
mode: Option<minify_js::TopLevelMode>,
) -> 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(&SCRIPT_END), Discard);
// `process_tag` will require closing tag.
2022-09-27 22:51:44 -04:00
if cfg.minify_js && mode.is_some() {
2022-06-21 11:36:27 -04:00
// TODO Write to `out` directly, but only if we can guarantee that the length will never exceed the input.
let mut output = Vec::new();
2022-09-27 22:51:44 -04:00
let result = minify_js::minify(mode.unwrap(), proc[src].to_vec(), &mut output);
2022-06-21 11:36:27 -04:00
// TODO Collect error as warning.
if !result.is_err() && output.len() < src.len() {
proc.write_slice(output.as_slice());
} else {
proc.write_range(src);
};
2022-06-21 11:36:27 -04:00
} else {
proc.write_range(src);
};
Ok(())
}