refactor(display): extract shared rendering logic into renderer.py

- Add renderer.py with parse_ansi(), get_default_font_path(), render_to_pil()
- Update KittyDisplay and SixelDisplay to use shared renderer
- Enhance parse_ansi to handle full ANSI color codes (4-bit, 256-color)
- Update tests to use shared renderer functions
This commit is contained in:
2026-03-16 00:43:23 -07:00
parent f5de2c62e0
commit 0f2d8bf5c2
5 changed files with 316 additions and 384 deletions

View File

@@ -69,40 +69,45 @@ class TestSixelAnsiParsing:
def test_parse_empty_string(self):
"""handles empty string."""
from engine.display.backends.sixel import _parse_ansi
from engine.display.renderer import parse_ansi
result = _parse_ansi("")
result = parse_ansi("")
assert len(result) > 0
def test_parse_plain_text(self):
"""parses plain text without ANSI codes."""
from engine.display.backends.sixel import _parse_ansi
from engine.display.renderer import parse_ansi
result = _parse_ansi("hello world")
result = parse_ansi("hello world")
assert len(result) == 1
text, fg, bg, bold = result[0]
assert text == "hello world"
def test_parse_with_color_codes(self):
"""parses ANSI color codes."""
from engine.display.backends.sixel import _parse_ansi
from engine.display.renderer import parse_ansi
result = _parse_ansi("\033[31mred\033[0m")
assert len(result) == 2
result = parse_ansi("\033[31mred\033[0m")
assert len(result) == 1
assert result[0][0] == "red"
assert result[0][1] == (205, 49, 49)
def test_parse_with_bold(self):
"""parses bold codes."""
from engine.display.backends.sixel import _parse_ansi
from engine.display.renderer import parse_ansi
result = _parse_ansi("\033[1mbold\033[0m")
assert len(result) == 2
result = parse_ansi("\033[1mbold\033[0m")
assert len(result) == 1
assert result[0][0] == "bold"
assert result[0][3] is True
def test_parse_256_color(self):
"""parses 256 color codes."""
from engine.display.backends.sixel import _parse_ansi
from engine.display.renderer import parse_ansi
result = _parse_ansi("\033[38;5;196mred\033[0m")
assert len(result) == 2
result = parse_ansi("\033[38;5;196mred\033[0m")
assert len(result) == 1
assert result[0][0] == "red"
class TestSixelEncoding: