Skip to content

Commit fa099b0

Browse files
committed
capture latest visualizations
1 parent 1986a7d commit fa099b0

3 files changed

Lines changed: 66 additions & 6 deletions

File tree

demicode/ui/termio.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ def __init__(
5858
input: None | TextIO = None,
5959
output: None | TextIO = None,
6060
) -> None:
61-
self._input = input or sys.__stdin__
62-
self._output = output or sys.__stderr__
61+
self._input = cast(TextIO, input or sys.__stdin__)
62+
self._output = cast(TextIO, output or sys.__stderr__)
6363
self._width, self._height = self.query_size()
6464

6565
# TODO: Consider querying terminal attributes via termios.tcgetattr()

script/show.py

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import argparse
44
import os
55
import sys
6+
from typing import Callable
67

78
sys.path.insert(0, '')
89

910
from demicode.ui.terminal import Terminal
11+
from demicode.ui.termio import TermIO
1012

1113

1214
CSI = '\x1b['
@@ -22,7 +24,7 @@
2224
MARKERS2 = '△△△△▲△△△△▲'
2325
MARKERS3 = ' 5 1 1 2 2 3 3 4 4 5'
2426
MARKERS4 = ' 0 5 0 5 0 5 0 5 0'
25-
27+
CHAREND = '┣━━꩟'
2628

2729
def 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+
66105
def 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

test.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/env bash
2+
3+
# Note: This script also works with zsh, which does not support read's -p
4+
# (prompt) option. Also, see
5+
# https://unix.stackexchange.com/questions/88296/get-vertical-cursor-position/183121
6+
7+
rainbow_flag="\xf0\x9f\x8f\xb3\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x8c\x88"
8+
echo -en "${rainbow_flag}\x1b[6n"
9+
IFS=';' read -sdR row col; echo -en "\x1b[$((col+1))G▌▍▎▏\n"
10+
printf '━%0.s' $(seq 1 $col)
11+
echo "▶︎ ${col}"

0 commit comments

Comments
 (0)