More robust parsing of ascii term codes.

This commit is contained in:
Andrew Hamilton 2020-10-15 12:17:02 +10:00
parent 79dee3f1b9
commit 0cdb5c3a37
2 changed files with 10 additions and 4 deletions

View file

@ -162,6 +162,10 @@ class TermStr(collections.UserString):
codes = part[1:end_index].split(";") codes = part[1:end_index].split(";")
previous_code = None previous_code = None
for index, code in enumerate(codes): for index, code in enumerate(codes):
try:
code_int = int(code)
except ValueError:
code_int = None
if code in ["", "0", "00"]: # Normal if code in ["", "0", "00"]: # Normal
is_bold, is_italic, is_underlined = False, False, False is_bold, is_italic, is_underlined = False, False, False
fg_color, bg_color = None, None fg_color, bg_color = None, None
@ -171,13 +175,13 @@ class TermStr(collections.UserString):
is_italic = True is_italic = True
elif code in ["04", "4"]: # underline elif code in ["04", "4"]: # underline
is_underlined = True is_underlined = True
elif 30 <= int(code) <= 37 : # dim fg color elif code_int and 30 <= code_int <= 37 : # dim fg color
fg_color = int(code[1]) fg_color = int(code[1])
elif 40 <= int(code) <= 47: # dim bg color elif code_int and 40 <= code_int <= 47: # dim bg color
bg_color = int(code[1]) bg_color = int(code[1])
elif 90 <= int(code) <= 97: # high fg color elif code_int and 90 <= code_int <= 97: # high fg color
fg_color = int(code[1]) + 8 fg_color = int(code[1]) + 8
elif 100 <= int(code) <= 107: # high bg color elif code_int and 100 <= code_int <= 107: # high bg color
bg_color = int(code[2]) + 8 bg_color = int(code[2]) + 8
elif code == "5" and previous_code == "38": # simple fg color elif code == "5" and previous_code == "38": # simple fg color
fg_color = int(codes[index+1]) fg_color = int(codes[index+1])

View file

@ -143,6 +143,8 @@ class TermStrTests(unittest.TestCase):
self.assertEqual(TermStr.from_term(eris.terminal.ESC + "(B" + self.assertEqual(TermStr.from_term(eris.terminal.ESC + "(B" +
eris.terminal.ESC + "[mfoo"), eris.terminal.ESC + "[mfoo"),
termstr.TermStr("foo")) termstr.TermStr("foo"))
self.assertEqual(TermStr.from_term(eris.terminal.ESC + "39;49;00mfoo"),
termstr.TermStr("foo"))
if __name__ == "__main__": if __name__ == "__main__":