Spaces:
Sleeping
Sleeping
| import enum | |
| class ExtendedSymbols: | |
| class Symbol(enum.Enum): | |
| # Correctly differentiating between single and double line symbols | |
| TOP_RIGHT_L = '\u2510' # β Single line top right corner | |
| BOTTOM_RIGHT_L = '\u2518' # β Single line bottom right corner | |
| TOP_LEFT_L = '\u250C' # β Single line top left corner | |
| BOTTOM_LEFT_L = '\u2514' # β Single line bottom left corner | |
| RIGHT_T = '\u2524' # β€ Single line right T | |
| LEFT_T = '\u251C' # β Single line left T | |
| TOP_T = '\u252C' # β¬ Single line top T | |
| BOTTOM_T = '\u2534' # β΄ Single line bottom T | |
| CROSS = '\u253C' # βΌ Single line cross | |
| SINGLE_HORIZONTAL = '\u2500' # β Single horizontal line | |
| SINGLE_VERTICAL = '\u2502' # β Single vertical line | |
| # Double line versions | |
| DOUBLE_TOP_RIGHT_L = '\u2557' # β Double line top right corner | |
| DOUBLE_BOTTOM_RIGHT_L = '\u255D' # β Double line bottom right corner | |
| DOUBLE_TOP_LEFT_L = '\u2554' # β Double line top left corner | |
| DOUBLE_BOTTOM_LEFT_L = '\u255A' # β Double line bottom left corner | |
| DOUBLE_RIGHT_T = '\u2563' # β£ Double line right T | |
| DOUBLE_LEFT_T = '\u2560' # β Double line left T | |
| DOUBLE_TOP_T = '\u2566' # β¦ Double line top T | |
| DOUBLE_BOTTOM_T = '\u2569' # β© Double line bottom T | |
| DOUBLE_CROSS = '\u256C' # β¬ Double line cross | |
| DOUBLE_HORIZONTAL = '\u2550' # β Double horizontal line | |
| DOUBLE_VERTICAL = '\u2551' # β Double vertical line | |
| SOLID_BLOCK = '\u2588' # β Solid block | |
| TOP_HALF_BLOCK = '\u2580' # β Top half block | |
| BOTTOM_HALF_BLOCK = '\u2584' # β Bottom half block | |
| SHADED_BLOCK = '\u2592' # β Shaded block | |
| def __getattr__(self, name): | |
| try: | |
| return self.Symbol[name].value | |
| except KeyError: | |
| raise AttributeError(f"No such symbol: {name}") | |
| # Make ExtendedSymbols an instance so it can be used directly | |
| ExtendedSymbols = ExtendedSymbols() | |
| def draw_box(msg=None, width=None, height=None, title=None, line_type='single'): | |
| # Use extended symbols correctly with Unicode | |
| line_char = ExtendedSymbols.SINGLE_HORIZONTAL if line_type == 'single' else ExtendedSymbols.DOUBLE_HORIZONTAL | |
| corner_tl = ExtendedSymbols.TOP_LEFT_L if line_type == 'single' else ExtendedSymbols.DOUBLE_TOP_LEFT_L | |
| corner_tr = ExtendedSymbols.TOP_RIGHT_L if line_type == 'single' else ExtendedSymbols.DOUBLE_TOP_RIGHT_L | |
| corner_bl = ExtendedSymbols.BOTTOM_LEFT_L if line_type == 'single' else ExtendedSymbols.DOUBLE_BOTTOM_LEFT_L | |
| corner_br = ExtendedSymbols.BOTTOM_RIGHT_L if line_type == 'single' else ExtendedSymbols.DOUBLE_BOTTOM_RIGHT_L | |
| vertical_line = ExtendedSymbols.SINGLE_VERTICAL if line_type == 'single' else ExtendedSymbols.DOUBLE_VERTICAL | |
| # Determine width based on message length if not specified | |
| if msg and (width is None or height is None): | |
| width = max(len(msg), width if width else 0) + 2 # Add padding | |
| height = 3 # Minimum box height with top, middle, and bottom | |
| # Use default dimensions if none provided | |
| if width is None: | |
| width = 10 # Default width | |
| if height is None: | |
| height = 3 # Default minimum height | |
| # Draw top border | |
| top_border = f"{corner_tl}{line_char * width}{corner_tr}" | |
| if title: | |
| title_str = f" {title} " | |
| title_length = len(title_str) | |
| pre_title_length = (width - title_length) // 2 | |
| post_title_length = width - title_length - pre_title_length | |
| top_border = f"{corner_tl}{line_char * pre_title_length}{title_str}{line_char * post_title_length}{corner_tr}" | |
| # Prepare message line or blank lines | |
| if msg: | |
| message_line = f"{vertical_line} {msg} {vertical_line}" | |
| if len(msg) < width - 2: | |
| msg = msg + ' ' * (width - 2 - len(msg)) | |
| message_line = f"{vertical_line}{msg}{vertical_line}" | |
| else: | |
| message_line = f"{vertical_line}{' ' * (width)}{vertical_line}" | |
| # Draw middle lines | |
| middle_lines = (f"{vertical_line}{' ' * width}{vertical_line}\n") * (height - 2) | |
| middle_lines = middle_lines[:-1] # Remove the last newline for proper formatting | |
| # Draw bottom border | |
| bottom_border = f"{corner_bl}{line_char * width}{corner_br}" | |
| # Combine all parts | |
| box = f"{top_border}\n{message_line}\n{middle_lines}\n{bottom_border}" | |
| print(box) | |
| def format_arrow(root_symbol=None, line_type='single', length=10): | |
| """ | |
| Draw an arrow with a specified root symbol, line type, and length. | |
| """ | |
| symbol_map = { | |
| 'L': { | |
| 'single': ExtendedSymbols.BOTTOM_LEFT_L, | |
| 'double': ExtendedSymbols.DOUBLE_BOTTOM_LEFT_L, | |
| }, | |
| 'T': { | |
| 'single': ExtendedSymbols.LEFT_T, | |
| 'double': ExtendedSymbols.DOUBLE_LEFT_T | |
| }, | |
| '+': { | |
| 'single': ExtendedSymbols.CROSS, | |
| 'double': ExtendedSymbols.DOUBLE_CROSS | |
| } | |
| } | |
| # Default to a single horizontal line if undefined symbol or line type | |
| chosen_symbol = symbol_map.get(root_symbol, {}).get(line_type, '') | |
| line_char = ExtendedSymbols.DOUBLE_HORIZONTAL if line_type == 'double' else ExtendedSymbols.SINGLE_HORIZONTAL | |
| # Construct the arrow string | |
| return chosen_symbol + line_char * length + ">" | |
| def draw_arrow(root_symbol=None, line_type='single', length=10): | |
| format_arrow_str = format_arrow(root_symbol, line_type, length) | |
| print(format_arrow_str) | |