class SideBar: DIV: str = 'div' H1: str = 'h1' MORE: str = 'more' MORE_ITEMS_LENGTH = 3 SHOULD_COMPRESS_HTML: bool = True def __init__(self, title: str, memu_items: [str], more: str = MORE, more_items_length: int = MORE_ITEMS_LENGTH, should_compress_html: bool = SHOULD_COMPRESS_HTML ) -> None: self.title = title self.more = more self.should_compress_html = should_compress_html self.memu_items = memu_items self.more_items_length = more_items_length def __len__(self): return len(self.memu_items) def __repr__(self): return f'SideBar: {len(self)} memu items' @classmethod def _header(cls, title: str) -> str: return cls._build_header(cls.H1, title) @classmethod def _body(cls, menu_items:[str], should_compress_html: bool) -> str: join_char = cls._get_split_char(should_compress_html) return join_char.join( list(cls._build_body(cls.DIV, menu_items)) ) @classmethod def _more(cls, more): return cls._build_more(cls.DIV, more) @staticmethod def _build_header(tag_name: str, title: str) -> str: return f'<{tag_name}>{title}' @staticmethod def _build_body(tag_name: str, menu_items: [str]) -> str: for menu_item in menu_items: yield f'<{tag_name}>{menu_item}' @staticmethod def _build_more(tag_name: str, text: str) -> str: return f'<{tag_name}>{text}' @staticmethod def _get_split_char(should_compress_html: bool) -> str: return '' if should_compress_html else '\n' def _is_few_items(self): return len(self) < self.more_items_length def build(self) -> str: header = self._header(self.title) body = self._body(self.memu_items,self.should_compress_html) footer = self._more(self.more) if self._is_few_items() else '' split_char = self._get_split_char(self.should_compress_html) html = split_char.join([header, body, footer]) return html if __name__ == '__main__': side_bar = SideBar('DEMO SIDE BAR', ['item1', 'item2', 'item3', 'item4', 'item5'], should_compress_html=False, more_items_length=10) print(side_bar.build())