diff options
| author | t <t@tjp.lol> | 2026-07-06 08:34:35 -0600 |
|---|---|---|
| committer | t <t@tjp.lol> | 2026-07-06 13:06:23 -0600 |
| commit | 983e523ca9f8e6a7db56b4aca23a962be95e7051 (patch) | |
| tree | c29a19c40964d58231fbd39ce080fa47f92b295e /src/tui_engine.zig | |
| parent | f759f149377942c4e04802c45162cda1c9bfb2b3 (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.zig | 14 |
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. |
