fix: make reflow wrap *before* width limit, not after it

This commit is contained in:
CJ van den Berg 2026-02-01 19:48:03 +01:00
parent 01cbdf8545
commit 4803daec3e
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -8,25 +8,35 @@ pub fn reflow(allocator: std.mem.Allocator, text: []const u8, width: usize) erro
var first = true; var first = true;
var line_len: usize = 0; var line_len: usize = 0;
for (words) |word| { for (words) |word| {
if (line_len == 0) { const state: enum {
if (first) { begin,
try writer.writeAll(prefix.first); words,
first = false; } = if (line_len == 0) .begin else .words;
} else { blk: switch (state) {
try writer.writeAll(prefix.continuation); .begin => {
var pad = prefix.first.len - prefix.continuation.len; if (first) {
while (pad > 0) : (pad -= 1) try writer.writeAll(prefix.first);
first = false;
} else {
try writer.writeAll(prefix.continuation);
var pad = prefix.first.len - prefix.continuation.len;
while (pad > 0) : (pad -= 1)
try writer.writeByte(' ');
}
line_len += prefix.len;
continue :blk .words;
},
.words => {
if (line_len + word.len + 1 >= width) {
try writer.writeByte('\n');
line_len = 0;
continue :blk .begin;
}
if (line_len > prefix.len)
try writer.writeByte(' '); try writer.writeByte(' ');
} try writer.writeAll(word);
line_len += prefix.len; line_len += word.len;
} },
if (line_len > prefix.len)
try writer.writeByte(' ');
try writer.writeAll(word);
line_len += word.len;
if (line_len >= width) {
try writer.writeByte('\n');
line_len = 0;
} }
} }