diff --git a/fill3/fill3/__init__.py b/fill3/fill3/__init__.py index d5b02de..e408229 100755 --- a/fill3/fill3/__init__.py +++ b/fill3/fill3/__init__.py @@ -6,6 +6,7 @@ import asyncio import contextlib import itertools import os +import re import signal import sys @@ -494,25 +495,12 @@ async def update_screen(screen_widget): APPEARANCE_CHANGED_EVENT.clear() -def digest_terminal_input(input_str): - cursor = 0 - result = [] - for index, char in enumerate(input_str): - if cursor != index: - if char == terminal.ESC: - result.append(input_str[cursor:index]) - cursor = index - elif ord(char) < 32: - result.extend([input_str[cursor:index], char]) - cursor = index + 1 - if cursor != index + 1: - result.append(input_str[cursor:index+1]) - return result +_INPUT_REGEX = re.compile("\x1b[^\x00-\x1f]+|[\x00-\x1f]|[^\x00-\x1f]+") @handle_exception def on_terminal_input(screen_widget): - for part in digest_terminal_input(sys.stdin.read()): + for part in _INPUT_REGEX.findall(sys.stdin.read()): if part.startswith(terminal.MOUSE): screen_widget.on_mouse_input(part[3:]) else: diff --git a/fill3/tests/fill3_test.py b/fill3/tests/fill3_test.py index 9d77a87..d67f2e2 100755 --- a/fill3/tests/fill3_test.py +++ b/fill3/tests/fill3_test.py @@ -140,16 +140,16 @@ class WidgetTests(unittest.TestCase): "B A") -class DigestTerminalInputTestCase(unittest.TestCase): +class TerminalInputTestCase(unittest.TestCase): - def test_digest_terminal_input(self): - self.assertRaises(UnboundLocalError, fill3.digest_terminal_input, "") - self.assertEqual(fill3.digest_terminal_input("a"), ["a"]) - self.assertEqual(fill3.digest_terminal_input("ab"), ["ab"]) - self.assertEqual(fill3.digest_terminal_input("a\nb"), ["a", "\n", "b"]) - self.assertEqual(fill3.digest_terminal_input("a\tb"), ["a", "\t", "b"]) - self.assertEqual(fill3.digest_terminal_input(terminal.UP * 2), [terminal.UP] * 2) - self.assertEqual(fill3.digest_terminal_input(terminal.CTRL_C * 2), [terminal.CTRL_C] * 2) + def test_input_regex(self): + self.assertEqual(fill3._INPUT_REGEX.findall(""), []) + self.assertEqual(fill3._INPUT_REGEX.findall("a"), ["a"]) + self.assertEqual(fill3._INPUT_REGEX.findall("ab"), ["ab"]) + self.assertEqual(fill3._INPUT_REGEX.findall("a\nb"), ["a", "\n", "b"]) + self.assertEqual(fill3._INPUT_REGEX.findall("a\tb"), ["a", "\t", "b"]) + self.assertEqual(fill3._INPUT_REGEX.findall(terminal.UP * 2), [terminal.UP] * 2) + self.assertEqual(fill3._INPUT_REGEX.findall(terminal.CTRL_C * 2), [terminal.CTRL_C] * 2) if __name__ == "__main__":