Source code for tablate.classes.options.html.style.CssStyler
from typing import Callable, Union
from tablate.classes.options.html.style.subclasses.ElementStyler import ElementStyler
from tablate.classes.options.html.style.utilities.base_values import tablate_instance_key
from tablate.classes.options.html.style.utilities.style_dict import style_dict_key_builder, \
style_dict_css_append
from tablate.classes.options.html.style.utilities.style_types import ElementSelectorDictKeys, SelectorDictUnion, \
TableSelectorDictKeys, StyleItem
from tablate.library.calcs.random_string import random_string
from tablate.classes.options.html.style.utilities.css_factory import css_factory
from tablate.classes.options.html.style.utilities.selectors import frame_selector, instance_selector, \
base_selector_dict, table_selector, container_selector
[docs]
class CssStyler:
def __init__(self) -> None:
self._uid = random_string(6)
self._base_selector = instance_selector(uid=self._uid)
self.__style_dict: dict = {self._base_selector: {}}
self.__global_styles = []
self._css_head = ""
self._css_foot = ""
[docs]
def frame(self, frame_index: int):
selector_key: ElementSelectorDictKeys = "tablate_frame"
selector_value = frame_selector(frame_index)
selector_dict: SelectorDictUnion = base_selector_dict(base_selector=self._base_selector,
key=selector_key,
value=selector_value,
element_type=selector_key)
return ElementStyler(selector=selector_dict, create_style=self.__create_style())
@property
def table(self):
selector_key: TableSelectorDictKeys = "tablate_container"
selector_value = table_selector()
selector_dict: SelectorDictUnion = base_selector_dict(base_selector=self._base_selector,
key=selector_key,
value=selector_value,
element_type=selector_key)
return ElementStyler(selector=selector_dict, create_style=self.__create_style())
@property
def wrapper(self):
selector_key: TableSelectorDictKeys = "tablate_container"
selector_value = container_selector()
selector_dict: SelectorDictUnion = base_selector_dict(base_selector=self._base_selector,
key=selector_key,
value=selector_value,
element_type=selector_key)
return ElementStyler(selector=selector_dict, create_style=self.__create_style())
[docs]
def add_global_style_attribute(self, key: str, value: Union[str, int]):
self.__global_styles.append(f"{key}:{value}")
[docs]
def inject_css_block(self, css: str) -> None:
self._css_foot += css
[docs]
def inject_scoped_css(self, selector: str, css: str, sub_selector: str = None) -> None:
sub_selector = sub_selector if sub_selector is not None else ""
scoped_selector = f".{self._base_selector} {selector}{sub_selector}"
css_block = scoped_selector + "{" + css + "}"
self._css_foot += css_block
[docs]
def return_head_styles(self) -> str:
return_string = ""
if len(self.__global_styles) > 0:
return_string += f".{self._base_selector} *" + "{" + ";".join(self.__global_styles) + ";" + "}"
return_string += css_factory(self.__style_dict)
return f"<style>{return_string}</style>"
def __create_style(self) -> Callable[[SelectorDictUnion, StyleItem], None]:
def create_style(selector_dict: SelectorDictUnion, css_item: StyleItem) -> None:
style_dict_current = self.__style_dict[selector_dict[tablate_instance_key]]
if "tablate_container" in selector_dict:
style_dict_current = style_dict_key_builder(style_dict_current, selector_dict, "tablate_container")
if "tablate_frame" in selector_dict:
style_dict_current = style_dict_key_builder(style_dict_current, selector_dict, "tablate_frame")
style_dict_current = style_dict_key_builder(style_dict_current, selector_dict, "tablate_row")
style_dict_current = style_dict_key_builder(style_dict_current, selector_dict, "tablate_column")
style_dict_current = style_dict_key_builder(style_dict_current, selector_dict, "tablate_text")
style_dict_current = style_dict_key_builder(style_dict_current, selector_dict, "element_type")
style_dict_css_append(style_dict=style_dict_current, css_item=css_item)
return create_style