Merge pull request #441 from Textualize/bugfix-css-color-names-should-be-able-to-include-digits

[css][bugfix] CSS colors can now have digits at the end of their names
This commit is contained in:
Will McGugan
2022-04-28 14:59:58 +01:00
committed by GitHub
2 changed files with 50 additions and 1 deletions

View File

@@ -11,7 +11,7 @@ DURATION = r"\d+\.?\d*(?:ms|s)"
NUMBER = r"\-?\d+\.?\d*"
COLOR = r"\#[0-9a-fA-F]{8}|\#[0-9a-fA-F]{6}|rgb\(\-?\d+\.?\d*,\-?\d+\.?\d*,\-?\d+\.?\d*\)|rgba\(\-?\d+\.?\d*,\-?\d+\.?\d*,\-?\d+\.?\d*,\-?\d+\.?\d*\)"
KEY_VALUE = r"[a-zA-Z_-][a-zA-Z0-9_-]*=[0-9a-zA-Z_\-\/]+"
TOKEN = "[a-zA-Z_-]+"
TOKEN = "[a-zA-Z][a-zA-Z0-9_-]*"
STRING = r"\".*?\""
VARIABLE_REF = r"\$[a-zA-Z0-9_\-]+"

View File

@@ -0,0 +1,49 @@
from contextlib import nullcontext as does_not_raise
import pytest
from textual.color import Color
from textual.css.stylesheet import Stylesheet, StylesheetParseError
from textual.css.tokenizer import TokenizeError
@pytest.mark.parametrize(
"css_value,expectation,expected_color",
[
# Valid values:
["red", does_not_raise(), Color(128, 0, 0)],
["dark_cyan", does_not_raise(), Color(0, 175, 135)],
["medium_turquoise", does_not_raise(), Color(95, 215, 215)],
["turquoise4", does_not_raise(), Color(0, 135, 135)],
["#ffcc00", does_not_raise(), Color(255, 204, 0)],
["#ffcc0033", does_not_raise(), Color(255, 204, 0, 0.2)],
["rgb(200,90,30)", does_not_raise(), Color(200, 90, 30)],
["rgba(200,90,30,0.3)", does_not_raise(), Color(200, 90, 30, 0.3)],
# Some invalid ones:
["coffee", pytest.raises(StylesheetParseError), None], # invalid color name
["turquoise10", pytest.raises(StylesheetParseError), None],
["turquoise 4", pytest.raises(StylesheetParseError), None], # space in it
["1", pytest.raises(StylesheetParseError), None], # invalid value
["()", pytest.raises(TokenizeError), None], # invalid tokens
# TODO: implement hex colors with 3 chars? @link https://devdocs.io/css/color_value
["#09f", pytest.raises(TokenizeError), None],
# TODO: allow spaces in rgb/rgba expressions?
["rgb(200, 90, 30)", pytest.raises(TokenizeError), None],
["rgba(200,90,30, 0.4)", pytest.raises(TokenizeError), None],
],
)
def test_color_property_parsing(css_value, expectation, expected_color):
stylesheet = Stylesheet()
css = """
* {
background: ${COLOR};
}
""".replace(
"${COLOR}", css_value
)
with expectation:
stylesheet.parse(css)
if expected_color:
css_rule = stylesheet.rules[0]
assert css_rule.styles.background == expected_color