forked from LiveCarta/BookConverter
Change convert style values: from different -> different formats + round
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user