From da8677357ffccb3e365b4e1e79b770257043b9a4 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 6 Feb 2026 14:40:28 +0100 Subject: [PATCH] feat: preserve paragraphs when reflowing --- src/buffer/reflow.zig | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/buffer/reflow.zig b/src/buffer/reflow.zig index 55c1480..797d6ab 100644 --- a/src/buffer/reflow.zig +++ b/src/buffer/reflow.zig @@ -35,6 +35,12 @@ pub fn reflow(allocator: std.mem.Allocator, text: []const u8, width: usize) erro continue :blk .words; }, .words => { + if (word.len == 1 and word[0] == '\n') { + try writer.writeByte('\n'); + try writer.writeByte('\n'); + line_len = 0; + continue; + } if (line_len > prefix.len) { if (line_len + word.len + 1 >= width) { try writer.writeByte('\n'); @@ -56,8 +62,15 @@ pub fn reflow(allocator: std.mem.Allocator, text: []const u8, width: usize) erro fn split_words(allocator: std.mem.Allocator, text: []const u8, prefix: usize) error{OutOfMemory}![]const []const u8 { var words: std.ArrayList([]const u8) = .empty; var lines = std.mem.splitScalar(u8, text, '\n'); + var blank = false; while (lines.next()) |line| { - if (line.len <= prefix) continue; + if (line.len <= prefix) { + if (!blank) + (try words.addOne(allocator)).* = "\n"; + blank = true; + continue; + } + blank = false; var it = std.mem.splitAny(u8, line[prefix..], " \t"); while (it.next()) |word| if (word.len > 0) { (try words.addOne(allocator)).* = word;