Newer
Older
navi-1 / clients / terminal / tui / renderers / diff.py
@Eugene Sukhodolskiy Eugene Sukhodolskiy 2 days ago 1 KB Navi Code TUI: complete Phase 4
"""Renderer for unified diff messages."""

from __future__ import annotations

from rich.console import RenderableType
from rich.panel import Panel
from rich.text import Text

from clients.terminal.tui.themes import get_active_theme

from .base import ContentRenderer


class DiffRenderer(ContentRenderer):
    """Render a unified diff with added/removed line highlighting."""

    def accepts(self, msg: dict) -> bool:
        return msg.get("type") == "diff"

    def render(self, msg: dict) -> RenderableType:
        theme = get_active_theme()
        content = msg.get("content", "")
        old_label = msg.get("old_label", "---")
        new_label = msg.get("new_label", "+++")

        lines = content.splitlines()
        highlighted = Text()
        for idx, line in enumerate(lines):
            if idx:
                highlighted.append("\n")
            if line.startswith("+") and not line.startswith("+++"):
                highlighted.append(line, style=theme.success.hex)
            elif line.startswith("-") and not line.startswith("---"):
                highlighted.append(line, style=theme.error.hex)
            elif line.startswith("@@"):
                highlighted.append(line, style=theme.text_dim.hex)
            else:
                highlighted.append(line, style=theme.text.hex)

        return Panel(
            highlighted,
            title=f"diff: {old_label} → {new_label}",
            title_align="left",
            border_style=theme.border.hex,
        )