From 74913bb1560bbb0f56ca1ae26ede1aa140cf3e21 Mon Sep 17 00:00:00 2001 From: Kibzik Date: Mon, 3 Apr 2023 15:58:23 +0300 Subject: [PATCH] Change convert style values: from different -> different formats + round --- src/style_reader.py | 55 +++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/style_reader.py b/src/style_reader.py index e5288fa..191afa2 100644 --- a/src/style_reader.py +++ b/src/style_reader.py @@ -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