33import argparse
44import os
55import sys
6+ from typing import Callable
67
78sys .path .insert (0 , '' )
89
910from demicode .ui .terminal import Terminal
11+ from demicode .ui .termio import TermIO
1012
1113
1214CSI = '\x1b ['
2224MARKERS2 = '△△△△▲△△△△▲'
2325MARKERS3 = ' 5 1 1 2 2 3 3 4 4 5'
2426MARKERS4 = ' 0 5 0 5 0 5 0 5 0'
25-
27+ CHAREND = '┣━━꩟'
2628
2729def mkbar () -> str :
2830 width , _ = os .get_terminal_size ()
@@ -44,7 +46,14 @@ def mkprefix(spaces: int) -> str:
4446 return f'\u2E3B \u2A0C { " " * spaces } \U0001F9D1 \u200D \U0001F4BB '
4547
4648
47- def print_payload (bar1 : str , label1 : str , label2 : str , payload : str , bar2 : str , tens : int ) -> None :
49+ def print_payload (
50+ bar1 : str ,
51+ label1 : str ,
52+ label2 : str ,
53+ payload : str | Callable [[], None ],
54+ bar2 : str ,
55+ tens : int ,
56+ ) -> None :
4857 print ('\n ' )
4958 print (bar1 )
5059 print ('\n ' )
@@ -54,7 +63,10 @@ def print_payload(bar1: str, label1: str, label2: str, payload: str, bar2: str,
5463 if label2 != '' :
5564 print (f'{ INDENT } { LEGEND } { label2 .center (width )} { RESET } ' )
5665 print (f'{ INDENT } { FAINT } { MARKERS1 * tens } { RESET } ' )
57- print (f'{ INDENT } { payload } ' )
66+ if isinstance (payload , str ):
67+ print (f'{ INDENT } { payload } ' )
68+ else :
69+ payload ()
5870 print (f'{ INDENT } { FAINT } { MARKERS2 * tens } { RESET } ' )
5971 print (f'{ INDENT } { FAINT } { MARKERS3 [0 : width ]} { RESET } ' )
6072 print (f'{ INDENT } { FAINT } { MARKERS4 [0 : width ]} { RESET } ' )
@@ -63,11 +75,44 @@ def print_payload(bar1: str, label1: str, label2: str, payload: str, bar2: str,
6375 print (bar2 )
6476 print ('\n ' )
6577
78+
79+ def show_rainbow (set_column : bool = False ) -> None :
80+ termio = TermIO ()
81+
82+ # Write rainbow flag emoji
83+ termio .write (INDENT )
84+ termio .write ('\U0001F3F3 \uFE0F \u200D \U0001F308 ' )
85+ if not set_column :
86+ termio .writeln (CHAREND )
87+ return
88+
89+ # Determine cursor position
90+ try :
91+ with termio .cbreak_mode ():
92+ position = termio .request_cursor_position ()
93+ except TimeoutError :
94+ position = None
95+
96+ # Move cursor to next column
97+ if position is not None :
98+ column , _ = position
99+ if set_column :
100+ termio .cursor_at_column (column )
101+ termio .write (f'{ CHAREND } width={ column - len (INDENT ) - 1 } ' )
102+ termio .writeln ()
103+
104+
66105def main () -> None :
67106 parser = argparse .ArgumentParser ()
68107 parser .add_argument (
69108 'payload' ,
70- choices = ['dash-integral' , 'spaced-dash-integral' , 'arab-ligature' , 'hello' ],
109+ choices = [
110+ 'dash-integral' ,
111+ 'spaced-dash-integral' ,
112+ 'arab-ligature' ,
113+ 'hello' ,
114+ 'rainbow' ,
115+ ],
71116 )
72117 options = parser .parse_args ()
73118
@@ -88,6 +133,10 @@ def main() -> None:
88133 payload1 = 'Hello سلام नमस्ते שלום'
89134 payload2 = 'こんにちは Привет 你好'
90135 tens = 3
136+ elif options .payload == 'rainbow' :
137+ payload1 = lambda : show_rainbow (set_column = False )
138+ payload2 = lambda : show_rainbow (set_column = True )
139+ tens = 2
91140 else :
92141 raise ValueError (f'invalid payload "{ options .payload } "' )
93142
0 commit comments