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,
|
"font-variant": lambda x: x,
|
||||||
"text-transform": lambda x: x,
|
"text-transform": lambda x: x,
|
||||||
"text-align": 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": self.convert_tag_style_values,
|
||||||
"margin-top": self.convert_tag_style_values,
|
"margin-top": self.convert_tag_style_values,
|
||||||
"margin-right": 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,
|
"margin-bottom": self.convert_tag_style_values,
|
||||||
"padding": self.convert_tag_style_values,
|
"padding": self.convert_tag_style_values,
|
||||||
"padding-top": self.convert_tag_style_values,
|
"padding-top": self.convert_tag_style_values,
|
||||||
"padding-right": 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,
|
"padding-bottom": self.convert_tag_style_values,
|
||||||
"color": self.get_text_color,
|
"color": self.get_text_color,
|
||||||
"background-color": self.get_bg_color,
|
"background-color": self.get_bg_color,
|
||||||
@@ -63,16 +63,17 @@ class StyleReader:
|
|||||||
return color
|
return color
|
||||||
|
|
||||||
@staticmethod
|
@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
|
Function
|
||||||
- converts values of tags from em/%/pt/in to px
|
- converts values of tags from em/%/pt/in to px or another specified unit
|
||||||
- find closest font-size px
|
- finds closest font-size in the specified unit
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size_value: str
|
size_value: str
|
||||||
|
|
||||||
is_indent: bool
|
is_indent: bool
|
||||||
|
to_round_value: bool
|
||||||
|
target_unit: str
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@@ -80,25 +81,31 @@ class StyleReader:
|
|||||||
converted value size
|
converted value size
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def convert_size_number(size_number: str, unit_to_replace: str, multiplier: float) -> str:
|
UNITS = {
|
||||||
size_number = float(size_number.replace(unit_to_replace, "")) * multiplier
|
"%": 5.76 if is_indent else 0.16,
|
||||||
return str(size_number) + "px"
|
"em": 18 if not is_indent else 16,
|
||||||
has_size = re.search(r"(\d+(?:\.\d+)?)([\w%]+)", size_value)
|
"pt": 4 / 3,
|
||||||
values: List = size_value.split(" ")
|
"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:
|
if has_size:
|
||||||
size_number_idx = [i for i, value in enumerate(values) if re.search("(\d+)([\w%]+)", value)][0]
|
size_number_idx = [i for i, value in enumerate(values) if re.search("(\d+)([\w%]+)", value)][0]
|
||||||
if has_size.group(2) == "%":
|
from_unit = has_size.group(2)
|
||||||
multiplier = 5.76 if is_indent else 0.16
|
if from_unit != target_unit:
|
||||||
values[size_number_idx] = convert_size_number(values[size_number_idx], "%", multiplier)
|
values[size_number_idx] = convert_size_number(values[size_number_idx], from_unit, target_unit)
|
||||||
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)
|
|
||||||
size_value = " ".join(values)
|
size_value = " ".join(values)
|
||||||
return size_value
|
return size_value
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user