diff --git a/pandas/io/formats/css.py b/pandas/io/formats/css.py index 0f1a7302aa808..4a6c2e36156f6 100644 --- a/pandas/io/formats/css.py +++ b/pandas/io/formats/css.py @@ -20,6 +20,17 @@ ) +def _lowercase_outside_quotes(value: str) -> str: + parts = re.split(r'(".*?")', value) + new_parts = [] + for part in parts: + if part.startswith('"') and part.endswith('"'): + new_parts.append(part) # preserve case + else: + new_parts.append(part.lower()) + return "".join(new_parts) + + def _side_expander(prop_fmt: str) -> Callable: """ Wrapper to expand shorthand property into top, right, bottom, left properties @@ -391,7 +402,7 @@ def _error() -> str: def atomize(self, declarations: Iterable) -> Generator[tuple[str, str]]: for prop, value in declarations: prop = prop.lower() - value = value.lower() + value = _lowercase_outside_quotes(value) if prop in self.CSS_EXPANSIONS: expand = self.CSS_EXPANSIONS[prop] yield from expand(self, prop, value) @@ -414,7 +425,8 @@ def parse(self, declarations_str: str) -> Iterator[tuple[str, str]]: prop, sep, val = decl.partition(":") prop = prop.strip().lower() # TODO: don't lowercase case sensitive parts of values (strings) - val = val.strip().lower() + raw_val = val.strip() + val = _lowercase_outside_quotes(raw_val) if sep: yield prop, val else: