From 002f4f4310ab636484da1232bfe8d6a83fcd72b1 Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Sat, 19 Oct 2024 16:12:31 +0200 Subject: [PATCH] add(node2buffer): convert raw and code blocks with leading line numbers --- src/widget/node2buffer.zig | 65 +++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/src/widget/node2buffer.zig b/src/widget/node2buffer.zig index d16c739..391c223 100644 --- a/src/widget/node2buffer.zig +++ b/src/widget/node2buffer.zig @@ -3,6 +3,8 @@ const std = @import("std"); const vaxis = @import("vaxis"); const zmd = @import("zmd"); +const digits = "0123456789"; + pub fn toBuffer( node: *zmd.Node, allocator: std.mem.Allocator, @@ -43,6 +45,7 @@ pub fn toBuffer( }, .link => { style.fg = .{ .index = 3 }; + style.ul_style = .single; }, else => {}, } @@ -128,7 +131,6 @@ pub fn toBuffer( } }, .link => { - style.ul_style = .single; const uri = input[node.token.start + 1 + node.title.?.len + 2 .. node.token.start + 1 + node.title.?.len + 2 + node.href.?.len]; for (content, 0..) |_, i| { try array.append(.{ @@ -138,6 +140,67 @@ pub fn toBuffer( }); } }, + .block_close, .code_close => { + // generate a `block` i.e. + // 01 | ... + // 02 | ... + // 03 | ... + // ... + // 10 | ... + var rows: usize = 0; + var c: usize = 0; + // TODO: would be cool to not have to re-iterate over the contents + for (content, 0..) |char, i| { + if (char == '\n') { + // NOTE: start after the ``` + if (c == 0) { + c = i + 1; + } + rows += 1; + } + } + rows = rows -| 1; + const pad = vaxis.widgets.LineNumbers.numDigits(rows); + for (1..rows + 1) |r| { + try array.append(.{ + .char = .{ .grapheme = " " }, + .style = .{ .dim = true }, + }); + try array.append(.{ + .char = .{ .grapheme = " " }, + .style = .{ .dim = true }, + }); + for (1..pad + 1) |i| { + const digit = vaxis.widgets.LineNumbers.extractDigit(r, pad - i); + try array.append(.{ + .char = .{ .grapheme = digits[digit .. digit + 1] }, + .style = .{ .dim = true }, + }); + } + try array.append(.{ + .char = .{ .grapheme = " " }, + .style = .{ .dim = true }, + }); + try array.append(.{ + .char = .{ .grapheme = "│" }, + .style = .{ .dim = true }, + }); + try array.append(.{ + .char = .{ .grapheme = " " }, + .style = .{ .dim = true }, + }); + for (c..content.len) |c_i| { + try array.append(.{ + .char = .{ .grapheme = content[c_i .. c_i + 1] }, + .style = style, + }); + if (content[c_i] == '\n') { + c = c_i + 1; + break; + } + } + } + }, else => { for (content, 0..) |_, i| { try array.append(.{