From a3b5e884b12fdaa341010ef41bb9382fa0cd89f8 Mon Sep 17 00:00:00 2001 From: Michael Chaten Date: Sat, 13 Sep 2025 08:38:24 -0700 Subject: Update codebase to Zig 0.15.1. Removes compression support --- src/DisplayWidth.zig | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'src/DisplayWidth.zig') diff --git a/src/DisplayWidth.zig b/src/DisplayWidth.zig index 3da2d24..82b2649 100644 --- a/src/DisplayWidth.zig +++ b/src/DisplayWidth.zig @@ -39,11 +39,9 @@ pub fn setupWithGraphemes(dw: *DisplayWidth, allocator: Allocator, graphemes: Gr // Sets up the DisplayWidthData, leaving the GraphemeData undefined. pub fn setup(dw: *DisplayWidth, allocator: Allocator) Allocator.Error!void { - const decompressor = compress.flate.inflate.decompressor; const in_bytes = @embedFile("dwp"); var in_fbs = std.io.fixedBufferStream(in_bytes); - var in_decomp = decompressor(.raw, in_fbs.reader()); - var reader = in_decomp.reader(); + var reader = in_fbs.reader(); const endian = builtin.cpu.arch.endian(); @@ -400,7 +398,7 @@ pub fn wrap( columns: usize, threshold: usize, ) ![]u8 { - var result = ArrayList(u8).init(allocator); + var result = std.array_list.Managed(u8).init(allocator); defer result.deinit(); var line_iter = mem.tokenizeAny(u8, str, "\r\n"); @@ -460,8 +458,6 @@ test "allocation test" { const std = @import("std"); const builtin = @import("builtin"); const options = @import("options"); -const ArrayList = std.ArrayList; -const compress = std.compress; const mem = std.mem; const Allocator = mem.Allocator; const simd = std.simd; -- cgit v1.2.3 From 041afd58de8525dc0b6f6a9e2b493031dbf4bbee Mon Sep 17 00:00:00 2001 From: Sam Atman Date: Tue, 23 Dec 2025 10:22:06 -0500 Subject: Fix #74: Check for characters before popping in wrap --- src/DisplayWidth.zig | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/DisplayWidth.zig') diff --git a/src/DisplayWidth.zig b/src/DisplayWidth.zig index 82b2649..d15dbae 100644 --- a/src/DisplayWidth.zig +++ b/src/DisplayWidth.zig @@ -420,8 +420,10 @@ pub fn wrap( } // Remove trailing space and newline. - _ = result.pop(); - _ = result.pop(); + if (result.items[result.items.len - 1] == '\n') + _ = result.pop(); + if (result.items[result.items.len - 1] == ' ') + _ = result.pop(); return try result.toOwnedSlice(); } @@ -438,6 +440,18 @@ test "wrap" { try testing.expectEqualStrings(want, got); } +test "zg/74" { + var debug_alloc = std.heap.DebugAllocator(.{}).init; + const allocator = debug_alloc.allocator(); + defer _ = debug_alloc.deinit(); + const dw = try DisplayWidth.init(allocator); + defer dw.deinit(allocator); + const wrapped = try dw.wrap(allocator, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pellentesque pulvinar felis, sit amet commodo ligula feugiat sed. Sed quis malesuada elit, nec eleifend lectus. Sed tincidunt finibus aliquet. Praesent consectetur nibh libero, tempus imperdiet lorem congue eget.", 16, 1); + defer allocator.free(wrapped); + const expected_wrap = "Lorem ipsum dolor \nsit amet, consectetur \nadipiscing elit. \nNullam pellentesque \npulvinar felis, \nsit amet commodo \nligula feugiat \nsed. Sed quis malesuada \nelit, nec eleifend \nlectus. Sed tincidunt \nfinibus aliquet. \nPraesent consectetur \nnibh libero, tempus \nimperdiet lorem \ncongue eget."; + try std.testing.expectEqualStrings(expected_wrap, wrapped); +} + fn testAllocation(allocator: Allocator) !void { { var dw = try DisplayWidth.init(allocator); -- cgit v1.2.3 From 9f725580a2b6c93825edeff27f06951f57bcc237 Mon Sep 17 00:00:00 2001 From: Sam Atman Date: Tue, 23 Dec 2025 11:04:01 -0500 Subject: Use width 2 when skin tone modifier detected Fix: #82 --- src/DisplayWidth.zig | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/DisplayWidth.zig') diff --git a/src/DisplayWidth.zig b/src/DisplayWidth.zig index d15dbae..9919a55 100644 --- a/src/DisplayWidth.zig +++ b/src/DisplayWidth.zig @@ -126,6 +126,8 @@ pub fn strWidth(dw: DisplayWidth, str: []const u8) usize { // emoji text sequence. if (ncp.code == 0xFE0E) w = 1; if (ncp.code == 0xFE0F) w = 2; + // Skin tones + if (0x1F3FB <= ncp.code and ncp.code <= 0x1F3FF) w = 2; } // Only adding width of first non-zero-width code point. @@ -201,6 +203,9 @@ test "strWidth" { try testing.expectEqual(@as(usize, 9), dw.strWidth("Ẓ̌á̲l͔̝̞̄̑͌g̖̘̘̔̔͢͞͝o̪̔T̢̙̫̈̍͞e̬͈͕͌̏͑x̺̍ṭ̓̓ͅ")); try testing.expectEqual(@as(usize, 17), dw.strWidth("슬라바 우크라이나")); try testing.expectEqual(@as(usize, 1), dw.strWidth("\u{378}")); + + // https://codeberg.org/atman/zg/issues/82 + try testing.expectEqual(@as(usize, 12), dw.strWidth("✍️✍🏻✍🏼✍🏽✍🏾✍🏿")); } /// centers `str` in a new string of width `total_width` (in display cells) using `pad` as padding. -- cgit v1.2.3