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)