summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtcvt.py173
1 files changed, 125 insertions, 48 deletions
diff --git a/tcvt.py b/tcvt.py
index 90a70f7..4e9250b 100755
--- a/tcvt.py
+++ b/tcvt.py
@@ -354,6 +354,92 @@ class Terminal:
curses.echo()
curses.endwin()
+ def do_bel(self):
+ curses.beep()
+
+ def do_bold(self):
+ self.screen.attron(curses.A_BOLD)
+
+ def do_cr(self):
+ self.screen.relmove(0, -9999)
+
+ def do_cub(self, n):
+ self.screen.relmove(0, -n)
+
+ def do_cub1(self):
+ self.do_cub(1)
+
+ def do_cud(self, n):
+ self.screen.relmove(n, 0)
+
+ def do_cud1(self):
+ self.do_cud(1)
+
+ def do_cuf(self, n):
+ self.screen.relmove(0, n)
+
+ def do_cuf1(self):
+ self.do_cuf(1)
+
+ def do_cuu(self, n):
+ self.screen.relmove(-n, 0)
+
+ def do_cuu1(self):
+ self.do_cuu(1)
+
+ def do_dch(self, n):
+ for _ in range(n):
+ self.screen.delch()
+
+ def do_dch1(self):
+ self.do_dch(1)
+
+ def do_dl(self, n):
+ for _ in range(n):
+ self.screen.deleteln()
+
+ def do_dl1(self):
+ self.do_dl(1)
+
+ def do_ech(self, n):
+ for _ in range(n):
+ self.screen.addch(ord(b' '))
+
+ def do_ed(self):
+ self.screen.clrtobot()
+
+ def do_el(self):
+ self.screen.clrtoeol()
+
+ def do_el1(self):
+ y, x = self.screen.getyx()
+ self.screen.move(y, 0)
+ for _ in range(x):
+ self.screen.addch(ord(b' '))
+
+ def do_home(self):
+ self.screen.move(0, 0)
+
+ def do_ich(self, n):
+ for _ in range(n):
+ self.screen.insch(ord(b' '))
+
+ def do_il(self, n):
+ for _ in range(n):
+ self.screen.insertln()
+
+ def do_il1(self):
+ self.do_il(1)
+
+ def do_ind(self):
+ y, x = self.screen.getyx()
+ _, xm = self.screen.getmaxyx()
+ x = min(x + 8 - x % 8, xm - 1)
+ self.screen.move(y, x)
+
+ def do_smul(self):
+ self.screen.attron(curses.A_UNDERLINE)
+
def feed_reset(self):
if self.graphics_font:
self.mode = (self.feed_graphics,)
@@ -364,10 +450,15 @@ class Terminal:
self.mode[0](char, *self.mode[1:])
def feed_simple(self, char):
- if char in simple_characters:
+ func = {
+ ord('\a'): self.do_bel,
+ ord('\r'): self.do_cr,
+ ord('\t'): self.do_ind,
+ }.get(char)
+ if func:
+ func()
+ elif char in simple_characters:
self.addch(char)
- elif char == ord(b'\r'):
- self.screen.relmove(0, -9999)
elif char == ord(b'\n'):
y, _ = self.screen.getyx()
ym, _ = self.screen.getmaxyx()
@@ -378,15 +469,8 @@ class Terminal:
self.screen.move(y+1, 0)
elif char == 0x1b:
self.mode = (self.feed_esc,)
- elif char == ord(b'\a'):
- curses.beep()
elif char == ord(b'\b'):
self.screen.relmove(0, -1)
- elif char == ord(b'\t'):
- y, x = self.screen.getyx()
- _, xm = self.screen.getmaxyx()
- x = min(x + 8 - x % 8, xm - 1)
- self.screen.move(y, x)
else:
raise ValueError("feed %r" % char)
@@ -408,18 +492,24 @@ class Terminal:
def feed_esc_opbr(self, char):
self.feed_reset()
- if char == ord(b'H'):
- self.feed_esc_opbr_next(char, bytearray(b"0;0"))
- elif char == ord(b'J'):
- self.screen.clrtobot()
+ func = {
+ ord('A'): self.do_cuu1,
+ ord('B'): self.do_cud1,
+ ord('C'): self.do_cuf1,
+ ord('D'): self.do_cub1,
+ ord('H'): self.do_home,
+ ord('J'): self.do_ed,
+ ord('L'): self.do_il1,
+ ord('M'): self.do_dl1,
+ ord('K'): self.do_el,
+ ord('P'): self.do_dch1,
+ }.get(char)
+ if func:
+ func()
elif char == ord(b'm'):
self.feed_esc_opbr_next(char, bytearray(b'0'))
elif char in bytearray(b'0123456789'):
self.mode = (self.feed_esc_opbr_next, bytearray((char,)))
- elif char == ord(b'K'):
- self.screen.clrtoeol()
- elif char in bytearray(b'ABCDLMP'):
- self.feed_esc_opbr_next(char, bytearray(b'1'))
else:
raise ValueError("feed esc [ %r" % char)
@@ -428,9 +518,9 @@ class Terminal:
self.fg = self.bg = 0
self.screen.attrset(0)
elif code == 1:
- self.screen.attron(curses.A_BOLD)
+ self.do_bold()
elif code == 4:
- self.screen.attron(curses.A_UNDERLINE)
+ self.do_smul()
elif code == 7:
self.screen.attron(curses.A_REVERSE)
elif code == 10:
@@ -456,7 +546,20 @@ class Terminal:
def feed_esc_opbr_next(self, char, prev):
self.feed_reset()
- if char in bytearray(b'0123456789;'):
+ func = {
+ ord('A'): self.do_cuu,
+ ord('B'): self.do_cud,
+ ord('C'): self.do_cuf,
+ ord('D'): self.do_cub,
+ ord('L'): self.do_il,
+ ord('M'): self.do_dl,
+ ord('P'): self.do_dch,
+ ord('X'): self.do_ech,
+ ord('@'): self.do_ich,
+ }.get(char)
+ if func and prev.isdigit():
+ func(int(prev))
+ elif char in bytearray(b'0123456789;'):
self.mode = (self.feed_esc_opbr_next, prev + bytearray((char,)))
elif char == ord(b'm'):
parts = prev.split(b';')
@@ -470,43 +573,17 @@ class Terminal:
elif prev == bytearray(b'2') and char == ord(b'J'):
self.screen.move(0, 0)
self.screen.clrtobot()
- elif char == ord(b'C') and prev.isdigit():
- self.screen.relmove(0, int(prev))
- elif char == ord(b'P') and prev.isdigit():
- for _ in range(int(prev)):
- self.screen.delch()
- elif char == ord(b'@') and prev.isdigit():
- for _ in range(int(prev)):
- self.screen.insch(ord(b' '))
- elif char == ord(b'A') and prev.isdigit():
- self.screen.relmove(-int(prev), 0)
- elif char == ord(b'M') and prev.isdigit():
- for _ in range(int(prev)):
- self.screen.deleteln()
- elif char == ord(b'L') and prev.isdigit():
- for _ in range(int(prev)):
- self.screen.insertln()
- elif char == ord(b'D') and prev.isdigit():
- self.screen.relmove(0, -int(prev))
elif char == ord(b'd') and prev.isdigit():
_, x = self.screen.getyx()
self.screen.move(int(prev) - 1, x)
- elif char == ord(b'B') and prev.isdigit():
- self.screen.relmove(int(prev), 0)
elif char == ord(b'b') and prev.isdigit():
for _ in range(int(prev)):
self.screen.addch(self.lastchar)
elif char == ord(b'G') and prev.isdigit():
y, _ = self.screen.getyx()
self.screen.move(y, int(prev) - 1)
- elif char == ord(b'X') and prev.isdigit():
- for _ in range(int(prev)):
- self.screen.addch(ord(b' '))
elif char == ord(b'K') and prev == b'1':
- y, x = self.screen.getyx()
- self.screen.move(y, 0)
- for _ in range(x):
- self.screen.addch(ord(b' '))
+ self.do_el1()
else:
raise ValueError("feed esc [ %r %r" % (prev, char))