properly handle hash in string
This commit is contained in:
parent
31ec0cc7f8
commit
7164728c69
49
src/utils.rs
49
src/utils.rs
@ -56,49 +56,17 @@ pub(crate) fn devour_whitespace_or_comment<I: Iterator<Item = Token>>(
|
||||
}
|
||||
|
||||
pub(crate) fn parse_interpolation<I: Iterator<Item = Token>>(
|
||||
tokens: &mut Peekable<I>,
|
||||
toks: &mut Peekable<I>,
|
||||
scope: &Scope,
|
||||
super_selector: &Selector,
|
||||
) -> SassResult<Value> {
|
||||
let mut val = String::new();
|
||||
while let Some(tok) = tokens.next() {
|
||||
match tok.kind {
|
||||
'}' => break,
|
||||
'{' => todo!("invalid character in interpolation"),
|
||||
q @ '"' | q @ '\'' => {
|
||||
val.push_str(&parse_quoted_string(tokens, scope, q, super_selector)?.to_string())
|
||||
}
|
||||
'$' => val.push_str(
|
||||
&scope
|
||||
.get_var(&eat_ident(tokens, scope, super_selector)?)?
|
||||
.clone()
|
||||
.unquote()
|
||||
.to_string(),
|
||||
),
|
||||
'#' => {
|
||||
if tokens.next().unwrap().kind == '{' {
|
||||
val.push_str(
|
||||
&Lexer::new(
|
||||
&parse_interpolation(tokens, scope, super_selector)?.to_string(),
|
||||
)
|
||||
.map(|x| x.kind.to_string())
|
||||
.collect::<String>(),
|
||||
)
|
||||
} else {
|
||||
return Err("Expected identifier.".into());
|
||||
}
|
||||
}
|
||||
_ => val.push_str(&tok.kind.to_string()),
|
||||
}
|
||||
}
|
||||
if val.trim().is_empty() {
|
||||
return Ok(Value::Ident(String::new(), QuoteKind::None));
|
||||
}
|
||||
Ok(
|
||||
Value::from_tokens(&mut Lexer::new(&val).peekable(), scope, super_selector)?
|
||||
.eval()?
|
||||
.unquote(),
|
||||
)
|
||||
let val = Value::from_tokens(
|
||||
&mut read_until_closing_curly_brace(toks).into_iter().peekable(),
|
||||
scope,
|
||||
super_selector,
|
||||
)?;
|
||||
toks.next();
|
||||
Ok(val.eval()?.unquote())
|
||||
}
|
||||
|
||||
pub(crate) struct VariableDecl {
|
||||
@ -598,6 +566,7 @@ pub(crate) fn parse_quoted_string<I: Iterator<Item = Token>>(
|
||||
continue;
|
||||
} else {
|
||||
s.push('#');
|
||||
continue;
|
||||
}
|
||||
}
|
||||
'\n' => return Err("Expected \".".into()),
|
||||
|
@ -310,3 +310,8 @@ test!(
|
||||
"$zzz: zzz;\n##{$zzz} {\n a: b;\n}\n",
|
||||
"#zzz {\n a: b;\n}\n"
|
||||
);
|
||||
test!(
|
||||
interpolate_id_selector,
|
||||
"$bar: \"#foo\";\nul li#{$bar} {\n foo: bar;\n}\n",
|
||||
"ul li#foo {\n foo: bar;\n}\n"
|
||||
);
|
||||
|
@ -230,3 +230,4 @@ test!(
|
||||
"a {\n color: str-insert($string: \"foo\", $insert: \"X\", $index: -99999999999999999999);\n}\n",
|
||||
"a {\n color: \"Xfoo\";\n}\n"
|
||||
);
|
||||
test!(hash_in_string, "a {\n color: \"#foo\";\n}\n");
|
||||
|
Loading…
x
Reference in New Issue
Block a user