add(node2buffer): convert raw and code blocks with leading line numbers
This commit is contained in:
@@ -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 ```<language>
|
||||
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(.{
|
||||
|
||||
Reference in New Issue
Block a user