summaryrefslogtreecommitdiff
path: root/src/tui_engine.zig
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-07-06 08:34:35 -0600
committert <t@tjp.lol>2026-07-06 13:06:23 -0600
commit983e523ca9f8e6a7db56b4aca23a962be95e7051 (patch)
treec29a19c40964d58231fbd39ce080fa47f92b295e /src/tui_engine.zig
parentf759f149377942c4e04802c45162cda1c9bfb2b3 (diff)
rendering & chat fixes for panto cli
- resiliency for tool ids that come back from some openai_chat providers - fixing codepoint width recognition - implement proper rendering for full markdown as seen from ai models
Diffstat (limited to 'src/tui_engine.zig')
-rw-r--r--src/tui_engine.zig14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/tui_engine.zig b/src/tui_engine.zig
index 4924347..a779747 100644
--- a/src/tui_engine.zig
+++ b/src/tui_engine.zig
@@ -80,6 +80,17 @@ pub fn visibleWidth(line: []const u8) usize {
i += skipEscape(line[i..]);
continue;
}
+ if (b == '\t') {
+ const rem = cols % 8;
+ cols += if (rem == 0) 8 else 8 - rem;
+ i += 1;
+ continue;
+ }
+ if (b == '\r') {
+ cols = 0;
+ i += 1;
+ continue;
+ }
// Count one column per UTF-8 codepoint start byte.
const seq_len = std.unicode.utf8ByteSequenceLength(b) catch 1;
cols += 1;
@@ -1010,6 +1021,9 @@ test "visibleWidth strips CSI and counts codepoints" {
try testing.expectEqual(@as(usize, 5), visibleWidth("hello"));
try testing.expectEqual(@as(usize, 5), visibleWidth("\x1b[2mhello\x1b[0m"));
try testing.expectEqual(@as(usize, 0), visibleWidth("\x1b[0m"));
+ try testing.expectEqual(@as(usize, 8), visibleWidth("\t"));
+ try testing.expectEqual(@as(usize, 9), visibleWidth("a\tX"));
+ try testing.expectEqual(@as(usize, 9), visibleWidth("prepainted\r\tX"));
// CURSOR_MARKER (APC string) is zero-width.
try testing.expectEqual(@as(usize, 2), visibleWidth("a" ++ CURSOR_MARKER ++ "b"));
// multibyte UTF-8 counts one column per codepoint.