Change convert style values: from different -> different formats + round

This commit is contained in:
Kibzik
2023-04-03 15:58:23 +03:00
parent 05323ddd45
commit 74913bb156

View File

@@ -22,16 +22,16 @@ class StyleReader:
"font-variant": lambda x: x,
"text-transform": lambda x: x,
"text-align": lambda x: x,
"text-indent": lambda x: self.convert_tag_style_values(x, is_indent=True),
"text-indent": lambda x: self.convert_tag_style_values(x, is_indent=True, to_round_value=30),
"margin": self.convert_tag_style_values,
"margin-top": self.convert_tag_style_values,
"margin-right": self.convert_tag_style_values,
"margin-left": lambda x: self.convert_tag_style_values(x, is_indent=True),
"margin-left": lambda x: self.convert_tag_style_values(x, is_indent=True, to_round_value=5, target_unit="%"),
"margin-bottom": self.convert_tag_style_values,
"padding": self.convert_tag_style_values,
"padding-top": self.convert_tag_style_values,
"padding-right": self.convert_tag_style_values,
"padding-left": self.convert_tag_style_values,
"padding-left": lambda x: self.convert_tag_style_values(x, is_indent=True, to_round_value=5, target_unit="%"),
"padding-bottom": self.convert_tag_style_values,
"color": self.get_text_color,
"background-color": self.get_bg_color,
@@ -63,16 +63,17 @@ class StyleReader:
return color
@staticmethod
def convert_tag_style_values(size_value: str, is_indent: bool = False) -> str:
def convert_tag_style_values(size_value: str, is_indent: bool = False, to_round_value: int = 1, target_unit: str = "px") -> str:
"""
Function
- converts values of tags from em/%/pt/in to px
- find closest font-size px
- converts values of tags from em/%/pt/in to px or another specified unit
- finds closest font-size in the specified unit
Parameters
----------
size_value: str
is_indent: bool
to_round_value: bool
target_unit: str
Returns
-------
@@ -80,25 +81,31 @@ class StyleReader:
converted value size
"""
def convert_size_number(size_number: str, unit_to_replace: str, multiplier: float) -> str:
size_number = float(size_number.replace(unit_to_replace, "")) * multiplier
return str(size_number) + "px"
has_size = re.search(r"(\d+(?:\.\d+)?)([\w%]+)", size_value)
values: List = size_value.split(" ")
UNITS = {
"%": 5.76 if is_indent else 0.16,
"em": 18 if not is_indent else 16,
"pt": 4 / 3,
"in": 96,
"rem": 80 / 7,
"px": 1
}
def convert_size_number(size_number: str, from_unit: str, to_unit: str) -> str:
size_number = float(size_number.replace(from_unit, "")) * UNITS[from_unit] / UNITS[to_unit]
if to_round_value:
# size_number = size_number - (size_number % to_round_value) down
# size_number = ((size_number + to_round_value - 1) // to_round_value) * to_round_value up
q = round(size_number / to_round_value)
size_number = to_round_value * q
return str(size_number) + to_unit
has_size = re.match(r"(\d+(?:\.\d+)?)([\w%]+)", size_value)
values = size_value.split(" ")
if has_size:
size_number_idx = [i for i, value in enumerate(values) if re.search("(\d+)([\w%]+)", value)][0]
if has_size.group(2) == "%":
multiplier = 5.76 if is_indent else 0.16
values[size_number_idx] = convert_size_number(values[size_number_idx], "%", multiplier)
elif has_size.group(2) == "em":
multiplier = 18 if is_indent else 16
values[size_number_idx] = convert_size_number(values[size_number_idx], "em", multiplier)
elif has_size.group(2) == "pt":
values[size_number_idx] = convert_size_number(values[size_number_idx], "pt", 4 / 3)
elif has_size.group(2) == "in":
values[size_number_idx] = convert_size_number(values[size_number_idx], "in", 96)
elif has_size.group(2) == "rem":
values[size_number_idx] = convert_size_number(values[size_number_idx], "rem", 80 / 7)
from_unit = has_size.group(2)
if from_unit != target_unit:
values[size_number_idx] = convert_size_number(values[size_number_idx], from_unit, target_unit)
size_value = " ".join(values)
return size_value