From ac9e3cdfffd335b7e3c838837fb05f88708ea87b Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 2 Feb 2022 10:59:17 +0000 Subject: [PATCH] Re-add support for variable references --- src/textual/css/parse.py | 17 ++++--------- tests/css/test_tokenize.py | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/textual/css/parse.py b/src/textual/css/parse.py index b1bde0f70..05482f575 100644 --- a/src/textual/css/parse.py +++ b/src/textual/css/parse.py @@ -208,10 +208,9 @@ def parse_declarations(css: str, path: str) -> Styles: return styles_builder.styles -# def _resolve_variables(tokens: Iterator[Token]): -# # First pass to collect variable declarations +# def _with_resolved_variables(tokens: Iterable[Token]) -> Iterable[Token]: # variables: dict[str, list[Token]] = defaultdict(list) -# while True: +# for token in tokens: # token = next(tokens, None) # if token is None: # break @@ -223,19 +222,13 @@ def parse_declarations(css: str, path: str) -> Styles: def parse(css: str, path: str) -> Iterable[RuleSet]: - # Make two iterators over the same tokens - tokens1, tokens2 = itertools.tee(iter(tokenize(css, path))) - - # First pass in order to resolve variables - # variables = _resolve_variables(tokens1) - - # Parsing rulesets + tokens = iter((tokenize(css, path))) while True: - token = next(tokens2, None) + token = next(tokens, None) if token is None: break if token.name.startswith("selector_start"): - yield from parse_rule_set(tokens2, token) + yield from parse_rule_set(tokens, token) if __name__ == "__main__": diff --git a/tests/css/test_tokenize.py b/tests/css/test_tokenize.py index 5272f2253..65b2823e3 100644 --- a/tests/css/test_tokenize.py +++ b/tests/css/test_tokenize.py @@ -109,3 +109,53 @@ def test_variables_declarations_amongst_rulesets(): Token(name='number', value='2', path='', code=css, location=(0, 27)), Token(name='variable_value_end', value=';', path='', code=css, location=(0, 28)), ] + + +def test_variables_reference_in_rule_declaration_value(): + css = ".warn{text: $warning;}" + assert list(tokenize(css, "")) == [ + Token(name='selector_start_class', value='.warn', path='', code=css, location=(0, 0)), + Token(name='declaration_set_start', value='{', path='', code=css, location=(0, 5)), + Token(name='declaration_name', value='text:', path='', code=css, location=(0, 6)), + Token(name='whitespace', value=' ', path='', code=css, location=(0, 11)), + Token(name='variable_ref', value='$warning', path='', code=css, location=(0, 12)), + Token(name='declaration_end', value=';', path='', code=css, location=(0, 20)), + Token(name='declaration_set_end', value='}', path='', code=css, location=(0, 21)), + ] + + +def test_variables_reference_in_rule_declaration_value_multiple(): + css = ".card{padding: $pad-y $pad-x;}" + assert list(tokenize(css, "")) == [ + Token(name='selector_start_class', value='.card', path='', code=css, location=(0, 0)), + Token(name='declaration_set_start', value='{', path='', code=css, location=(0, 5)), + Token(name='declaration_name', value='padding:', path='', code=css, location=(0, 6)), + Token(name='whitespace', value=' ', path='', code=css, location=(0, 14)), + Token(name='variable_ref', value='$pad-y', path='', code=css, location=(0, 15)), + Token(name='whitespace', value=' ', path='', code=css, location=(0, 21)), + Token(name='variable_ref', value='$pad-x', path='', code=css, location=(0, 22)), + Token(name='declaration_end', value=';', path='', code=css, location=(0, 28)), + Token(name='declaration_set_end', value='}', path='', code=css, location=(0, 29)), + ] + + +def test_variables_reference_in_variable_declaration(): + css = "$x: $y;" + assert list(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='variable_ref', value='$y', path='', code=css, location=(0, 4)), + Token(name='variable_value_end', value=';', path='', code=css, location=(0, 6)), + ] + + +def test_variable_references_in_variable_declaration_multiple(): + css = "$x: $y $z\n" + assert list(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='variable_ref', value='$y', path='', code=css, location=(0, 4)), + Token(name='whitespace', value=' ', path='', code=css, location=(0, 6)), + Token(name='variable_ref', value='$z', path='', code=css, location=(0, 8)), + Token(name='variable_value_end', value='\n', path='', code=css, location=(0, 10)), + ]