changes in response to PR review

This commit is contained in:
Mick Grove 2026-04-08 09:42:37 -07:00
commit eee7697e24
7 changed files with 246 additions and 19 deletions

View file

@ -1,3 +1,5 @@
use std::cell::Cell;
use anyhow::Result;
use cssparser::{
parse_important, AtRuleParser, CowRcStr, DeclarationParser, ParseError, Parser, ParserInput,
@ -15,14 +17,20 @@ where
let mut input = ParserInput::new(&css);
let mut parser = Parser::new(&mut input);
let mut collector = Collector { sink, stopped: false };
for _ in StyleSheetParser::new(&mut parser, &mut collector) {}
let stopped = Cell::new(false);
let mut collector = Collector { sink, stopped: &stopped };
let mut stylesheet = StyleSheetParser::new(&mut parser, &mut collector);
while !stopped.get() {
if stylesheet.next().is_none() {
break;
}
}
Ok(())
}
struct Collector<'a, F> {
sink: &'a mut F,
stopped: bool,
stopped: &'a Cell<bool>,
}
impl<'a, F> Collector<'a, F>
@ -30,11 +38,11 @@ where
F: FnMut(&str) -> bool,
{
fn emit(&mut self, name: &str, value: &str) {
if self.stopped {
if self.stopped.get() {
return;
}
let candidate = format!("{name} = {value}");
self.stopped = !(self.sink)(&candidate);
self.stopped.set(!(self.sink)(&candidate));
}
}
@ -82,7 +90,7 @@ where
for value in values {
self.emit(&name, &value);
if self.stopped {
if self.stopped.get() {
break;
}
}
@ -118,7 +126,13 @@ where
_start: &ParserState,
input: &mut Parser<'i, 't>,
) -> Result<(), ParseError<'i, ()>> {
for _ in RuleBodyParser::new(input, self) {}
let stopped = self.stopped;
let mut rule_body = RuleBodyParser::new(input, self);
while !stopped.get() {
if rule_body.next().is_none() {
break;
}
}
Ok(())
}
}

View file

@ -23,6 +23,7 @@ where
continue;
};
let tag_name = tag.name().as_utf8_str().to_string();
let normalized_tag_name = tag_name.to_ascii_lowercase();
for (key, value) in tag.attributes().iter() {
let Some(value) = value else {
@ -35,7 +36,7 @@ where
}
let inner_text = tag.inner_text(parser).trim().to_string();
match tag_name.as_str() {
match normalized_tag_name.as_str() {
"script" => {
let candidate = format!("<script> = {inner_text}");
if !inner_text.is_empty() && !sink(&candidate) {