fix: make reflow wrap *before* width limit, not after it
This commit is contained in:
parent
01cbdf8545
commit
4803daec3e
1 changed files with 28 additions and 18 deletions
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue