2019-12-23 06:48:41 -05:00
|
|
|
use crate::proc::Processor;
|
2019-12-25 21:47:18 -05:00
|
|
|
use crate::err::{ProcessingResult, ErrorType};
|
2019-12-23 06:48:41 -05:00
|
|
|
|
|
|
|
fn is_string_delimiter(c: u8) -> bool {
|
|
|
|
match c {
|
|
|
|
b'"' | b'\'' => true,
|
|
|
|
_ => false,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-25 21:47:18 -05:00
|
|
|
fn parse_comment(proc: &mut Processor) -> ProcessingResult<()> {
|
2019-12-25 07:29:18 -05:00
|
|
|
chain!(proc.match_seq(b"/*").expect().keep());
|
2019-12-23 06:48:41 -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()?;
|
2019-12-23 06:48:41 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2019-12-25 21:47:18 -05:00
|
|
|
fn parse_string(proc: &mut Processor) -> ProcessingResult<()> {
|
2019-12-25 07:29:18 -05:00
|
|
|
let delim = chain!(proc.match_pred(is_string_delimiter).expect().keep().char());
|
2019-12-23 06:48:41 -05:00
|
|
|
|
|
|
|
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()) {
|
2019-12-23 06:48:41 -05:00
|
|
|
if !escaping {
|
2019-12-25 21:47:18 -05:00
|
|
|
return Err(ErrorType::UnterminatedCssString);
|
2019-12-23 06:48:41 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
escaping = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2019-12-25 21:47:18 -05:00
|
|
|
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()) {
|
2019-12-23 06:48:41 -05:00
|
|
|
parse_comment(proc)?;
|
2019-12-25 07:29:18 -05:00
|
|
|
} else if chain!(proc.match_pred(is_string_delimiter).matched()) {
|
2019-12-23 06:48:41 -05:00
|
|
|
parse_string(proc)?;
|
|
|
|
} else {
|
|
|
|
proc.accept()?;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|