Fix issue with css variables with multiple values

This commit is contained in:
Darren Burns
2022-02-03 12:43:05 +00:00
parent a0a2a0666f
commit 6b1554d970
3 changed files with 40 additions and 4 deletions

View File

@@ -11,7 +11,7 @@ $animation: offset $animation-speed in_out_cubic;
App > View {
docks: side=left/1;
text: on $foo;
text: $animation;
}
Widget:hover {

View File

@@ -2,7 +2,6 @@ from __future__ import annotations
from collections import defaultdict
from functools import lru_cache
from itertools import dropwhile
from typing import Iterator, Iterable
from rich import print
@@ -259,8 +258,9 @@ def substitute_references(tokens: Iterator[Token]) -> Iterable[Token]:
ref_name = token.value[1:]
if ref_name in variables:
variable_tokens = variables[variable_name]
variable_tokens.extend(variables[ref_name])
yield from variable_tokens
reference_tokens = variables[ref_name]
variable_tokens.extend(reference_tokens)
yield from reference_tokens
else:
raise _unresolved(
variable_name=ref_name, location=token.location

View File

@@ -74,6 +74,42 @@ class TestVariableReferenceSubstitution:
Token(name='declaration_set_end', value='}', path='', code=css, location=(2, 20))
]
def test_multi_value_variable(self):
css = "$x: 2 4\n$y: 6 $x 2\n.thing { border: $y }"
assert list(substitute_references(tokenize(css, ""))) == [
Token(name='variable_name', value='$x:', path='', code=css, location=(0, 0)),
Token(name='whitespace', value=' ', path='', code=css, location=(0, 3)),
Token(name='number', value='2', path='', code=css, location=(0, 4)),
Token(name='whitespace', value=' ', path='', code=css, location=(0, 5)),
Token(name='number', value='4', path='', code=css, location=(0, 6)),
Token(name='variable_value_end', value='\n', path='', code=css, location=(0, 7)),
Token(name='variable_name', value='$y:', path='', code=css, location=(1, 0)),
Token(name='whitespace', value=' ', path='', code=css, location=(1, 3)),
Token(name='number', value='6', path='', code=css, location=(1, 4)),
Token(name='whitespace', value=' ', path='', code=css, location=(1, 5)),
Token(name='number', value='2', path='', code=css, location=(0, 4)),
Token(name='whitespace', value=' ', path='', code=css, location=(0, 5)),
Token(name='number', value='4', path='', code=css, location=(0, 6)),
Token(name='whitespace', value=' ', path='', code=css, location=(1, 8)),
Token(name='number', value='2', path='', code=css, location=(1, 9)),
Token(name='variable_value_end', value='\n', path='', code=css, location=(1, 10)),
Token(name='selector_start_class', value='.thing', path='', code=css, location=(2, 0)),
Token(name='whitespace', value=' ', path='', code=css, location=(2, 6)),
Token(name='declaration_set_start', value='{', path='', code=css, location=(2, 7)),
Token(name='whitespace', value=' ', path='', code=css, location=(2, 8)),
Token(name='declaration_name', value='border:', path='', code=css, location=(2, 9)),
Token(name='whitespace', value=' ', path='', code=css, location=(2, 16)),
Token(name='number', value='6', path='', code=css, location=(1, 4)),
Token(name='whitespace', value=' ', path='', code=css, location=(1, 5)),
Token(name='number', value='2', path='', code=css, location=(0, 4)),
Token(name='whitespace', value=' ', path='', code=css, location=(0, 5)),
Token(name='number', value='4', path='', code=css, location=(0, 6)),
Token(name='whitespace', value=' ', path='', code=css, location=(1, 8)),
Token(name='number', value='2', path='', code=css, location=(1, 9)),
Token(name='whitespace', value=' ', path='', code=css, location=(2, 19)),
Token(name='declaration_set_end', value='}', path='', code=css, location=(2, 20))
]
class TestParseLayout:
def test_valid_layout_name(self):