minify-html/src/unit/style.rs

72 lines
1.6 KiB
Rust
Raw Normal View History

2019-12-29 05:53:49 -05:00
use crate::err::{ErrorType, ProcessingResult};
use crate::proc::Processor;
fn is_string_delimiter(c: u8) -> bool {
match c {
b'"' | b'\'' => true,
_ => false,
}
}
fn parse_comment(proc: &mut Processor) -> ProcessingResult<()> {
2019-12-29 19:33:49 -05:00
if cfg!(debug_assertions) {
chain!(proc.match_seq(b"/*").expect().keep());
} else {
2020-01-04 21:28:34 -05:00
proc.accept_amount_expect(2);
2019-12-29 19:33:49 -05:00
};
// Unlike script tags, style comments do NOT end at closing tag.
2019-12-25 07:29:18 -05:00
while !chain!(proc.match_seq(b"*/").keep().matched()) {
proc.accept()?;
};
Ok(())
}
fn parse_string(proc: &mut Processor) -> ProcessingResult<()> {
2019-12-29 19:33:49 -05:00
let delim = if cfg!(debug_assertions) {
chain!(proc.match_pred(is_string_delimiter).expect().keep().char())
} else {
proc.accept_expect()
};
let mut escaping = false;
loop {
let c = proc.accept()?;
if c == b'\\' {
escaping = !escaping;
continue;
}
if c == delim && !escaping {
break;
}
2019-12-25 07:29:18 -05:00
if chain!(proc.match_line_terminator().keep().matched()) {
if !escaping {
return Err(ErrorType::UnterminatedCssString);
}
}
escaping = false;
};
Ok(())
}
pub fn process_style(proc: &mut Processor) -> ProcessingResult<()> {
2019-12-25 07:29:18 -05:00
while !chain!(proc.match_seq(b"</").matched()) {
if chain!(proc.match_seq(b"/*").matched()) {
parse_comment(proc)?;
2019-12-25 07:29:18 -05:00
} else if chain!(proc.match_pred(is_string_delimiter).matched()) {
parse_string(proc)?;
} else {
proc.accept()?;
}
};
Ok(())
}