ladybird/Meta/Utils/CSSGrammar/Parser/component_values.py
Callum Law a9d2b1dde6 Meta: Read dimensions from Units.json in CSS grammar parser
Avoids us having to maintain a separate hardcoded list.

This does mean we don't support parsing of `decibel` but it's not used
anywhere yet and will be supported automatically when added to
Units.json
2026-05-13 11:00:07 +01:00

72 lines
1.8 KiB
Python

from dataclasses import dataclass
from math import inf
from typing import Optional
from typing import Union
from Utils.css_dimensions import get_css_dimensions
@dataclass(frozen=True)
class NumericTypeRangeRestriction:
minimum: float
maximum: float
def dump(self) -> str:
return f"[{bound_value_to_string(self.minimum)},{bound_value_to_string(self.maximum)}]"
def bound_value_to_string(value: float) -> str:
if value == -inf:
return "-∞"
if value == inf:
return ""
return str(value)
def is_dimension_type(type_name: str) -> bool:
return type_name in get_css_dimensions().keys()
def is_dimension_percentage_mix_type(type_name: str) -> bool:
# https://drafts.csswg.org/css-values-4/#mixed-percentages
return type_name in (
"angle-percentage",
"frequency-percentage",
"length-percentage",
"time-percentage",
)
def is_numeric_type(type_name: str) -> bool:
# https://drafts.csswg.org/css-values-4/#numeric-data-types
return type_name in ("integer", "number", "percentage") or is_dimension_type(type_name)
@dataclass(frozen=True)
class Type:
name: str
custom_ident_blacklist: list[str]
numeric_type_accepted_range: Optional[NumericTypeRangeRestriction]
def dump(self, indent: int) -> str:
output = f"{'': >{indent}}Type: {self.name}"
if self.custom_ident_blacklist:
output += f" ![{', '.join(self.custom_ident_blacklist)}]"
if self.numeric_type_accepted_range:
output += f" {self.numeric_type_accepted_range.dump()}"
return output + "\n"
@dataclass(frozen=True)
class Keyword:
value: str
def dump(self, indent: int) -> str:
return f"{'': >{indent}}Keyword: {self.value}\n"
# https://drafts.csswg.org/css-values-4/#component-types
ComponentValue = Union[Type, Keyword]