Files
test/html_to_django/formatters/style_formatter.py
T

41 lines
1.2 KiB
Python

from bs4 import BeautifulSoup
def parse_style(style: str) -> dict[str, str]:
result: dict[str, str] = {}
key_buffer = ""
buffer = ""
for char in style:
if char == ":" and not key_buffer:
key_buffer = buffer
buffer = ""
elif char == ";":
result[key_buffer] = buffer
key_buffer = ""
buffer = ""
elif char != " ":
buffer += char
if key_buffer and buffer:
result[key_buffer] = buffer
return result
def style_to_string(style: dict[str, str]) -> str:
result = ";".join([f"{name}:{value}" for name, value in style.items()])
if len(style) != 0:
result += ";"
return result
def format(soup: BeautifulSoup) -> None:
for element in soup.find_all(attrs={"dj-style": True}):
if element.has_attr("style"):
style = parse_style(element["style"])
else:
style = {}
dj_style = element.get("dj-style")
for name, value, value_type in [declaration.split(";") for declaration in dj_style.split("~") if declaration]:
style[name] = f"{{{{ {value} }}}}{value_type}"
element["style"] = style_to_string(style)
del element.attrs["dj-style"]