Style namespaces can have variables come before them
This commit is contained in:
parent
a3b260c0bd
commit
735f222e15
71
src/style.rs
71
src/style.rs
@ -74,7 +74,7 @@ impl<'a> StyleParser<'a> {
|
|||||||
toks.next();
|
toks.next();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
TokenKind::Symbol(Symbol::OpenCurlyBrace) | TokenKind::Interpolation => n += 1,
|
TokenKind::Interpolation => n += 1,
|
||||||
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {
|
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
break;
|
break;
|
||||||
@ -83,10 +83,8 @@ impl<'a> StyleParser<'a> {
|
|||||||
n -= 1;
|
n -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TokenKind::Symbol(Symbol::SemiColon) => {
|
TokenKind::Symbol(Symbol::OpenCurlyBrace)
|
||||||
toks.next();
|
| TokenKind::Symbol(Symbol::SemiColon) => break,
|
||||||
break;
|
|
||||||
}
|
|
||||||
TokenKind::Symbol(Symbol::BitAnd) => {
|
TokenKind::Symbol(Symbol::BitAnd) => {
|
||||||
style.push(Token {
|
style.push(Token {
|
||||||
kind: TokenKind::Ident(self.super_selector.to_string()),
|
kind: TokenKind::Ident(self.super_selector.to_string()),
|
||||||
@ -99,7 +97,6 @@ impl<'a> StyleParser<'a> {
|
|||||||
};
|
};
|
||||||
style.push(toks.next().unwrap());
|
style.push(toks.next().unwrap());
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
|
||||||
Value::from_tokens(&mut style.into_iter().peekable(), self.scope)
|
Value::from_tokens(&mut style.into_iter().peekable(), self.scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,29 +115,51 @@ impl<'a> StyleParser<'a> {
|
|||||||
loop {
|
loop {
|
||||||
let property = self.parse_property(toks, super_property.clone())?;
|
let property = self.parse_property(toks, super_property.clone())?;
|
||||||
if let Some(tok) = toks.peek() {
|
if let Some(tok) = toks.peek() {
|
||||||
match tok.kind {
|
if tok.equals_symbol(Symbol::OpenCurlyBrace) {
|
||||||
TokenKind::Symbol(Symbol::OpenCurlyBrace) => {
|
match self.eat_style_group(toks, property)? {
|
||||||
if let Expr::Styles(s) = self.eat_style_group(toks, property)? {
|
Expr::Styles(s) => styles.extend(s),
|
||||||
styles.extend(s);
|
Expr::Style(s) => styles.push(s),
|
||||||
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
if let Some(tok) = toks.peek() {
|
if let Some(tok) = toks.peek() {
|
||||||
match tok.kind {
|
if tok.equals_symbol(Symbol::CloseCurlyBrace) {
|
||||||
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {
|
|
||||||
toks.next();
|
toks.next();
|
||||||
devour_whitespace(toks);
|
devour_whitespace(toks);
|
||||||
return Ok(Expr::Styles(styles));
|
return Ok(Expr::Styles(styles));
|
||||||
}
|
} else {
|
||||||
_ => continue,
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
let value = self.parse_style_value(toks)?;
|
let value = self.parse_style_value(toks)?;
|
||||||
|
match toks.peek().unwrap().kind {
|
||||||
|
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {
|
||||||
styles.push(Style { property, value });
|
styles.push(Style { property, value });
|
||||||
|
}
|
||||||
|
TokenKind::Symbol(Symbol::SemiColon) => {
|
||||||
|
toks.next();
|
||||||
|
devour_whitespace(toks);
|
||||||
|
styles.push(Style { property, value });
|
||||||
|
}
|
||||||
|
TokenKind::Symbol(Symbol::OpenCurlyBrace) => {
|
||||||
|
styles.push(Style {
|
||||||
|
property: property.clone(),
|
||||||
|
value,
|
||||||
|
});
|
||||||
|
match self.eat_style_group(toks, property)? {
|
||||||
|
Expr::Style(s) => styles.push(s),
|
||||||
|
Expr::Styles(s) => styles.extend(s),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
devour_whitespace(toks);
|
||||||
|
styles.push(Style { property, value });
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(tok) = toks.peek() {
|
if let Some(tok) = toks.peek() {
|
||||||
match tok.kind {
|
match tok.kind {
|
||||||
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {
|
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {
|
||||||
@ -155,6 +174,26 @@ impl<'a> StyleParser<'a> {
|
|||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let val = self.parse_style_value(toks)?;
|
let val = self.parse_style_value(toks)?;
|
||||||
|
match toks.peek().unwrap().kind {
|
||||||
|
TokenKind::Symbol(Symbol::CloseCurlyBrace) => {}
|
||||||
|
TokenKind::Symbol(Symbol::SemiColon) => {
|
||||||
|
toks.next();
|
||||||
|
devour_whitespace(toks);
|
||||||
|
}
|
||||||
|
TokenKind::Symbol(Symbol::OpenCurlyBrace) => {
|
||||||
|
let mut v = vec![Style {
|
||||||
|
property: super_property.clone(),
|
||||||
|
value: val,
|
||||||
|
}];
|
||||||
|
match self.eat_style_group(toks, super_property)? {
|
||||||
|
Expr::Style(s) => v.push(s),
|
||||||
|
Expr::Styles(s) => v.extend(s),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
return Ok(Expr::Styles(v));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
return Ok(Expr::Style(Style {
|
return Ok(Expr::Style(Style {
|
||||||
property: super_property,
|
property: super_property,
|
||||||
value: val,
|
value: val,
|
||||||
|
@ -131,3 +131,13 @@ test!(
|
|||||||
"a {\n color: red;\n}\n"
|
"a {\n color: red;\n}\n"
|
||||||
);
|
);
|
||||||
test!(removes_null_value, "a {\n color: null;\n}\n", "");
|
test!(removes_null_value, "a {\n color: null;\n}\n", "");
|
||||||
|
test!(
|
||||||
|
namespace_before_open_brace,
|
||||||
|
"foo {\n a: b {\n c: d;\n }\n}\n",
|
||||||
|
"foo {\n a: b;\n a-c: d;\n}\n"
|
||||||
|
);
|
||||||
|
test!(
|
||||||
|
namespace_before_open_brace_nested,
|
||||||
|
"foo {\n a: b {\n c: d {\n e: f;\n }\n }\n}\n",
|
||||||
|
"foo {\n a: b;\n a-c: d;\n a-c-e: f;\n}\n"
|
||||||
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user