Spaces:
Running
Running
File size: 5,799 Bytes
95fdc69 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
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)
|