feature. See also
. The project being documented here (as the example) is the Zig library itself.
Parser.closeLastBlock
fn closeLastBlock(p: *Parser) !void
File
Code
fn closeLastBlock(p: *Parser) !void {
const b = p.pending_blocks.pop().?;
const node = switch (b.tag) {
.list => list: {
assert(b.string_start == p.scratch_string.items.len);
// stored at the list item level to make it possible to render each
// node without any context from its parents.
const list_items = p.scratch_extra.items[b.extra_start..];
const node_datas = p.nodes.items(.data);
if (!b.data.list.tight) {
for (list_items) |list_item| {
node_datas[list_item].list_item.tight = false;
}
}
const children = try p.addExtraChildren(@ptrCast(list_items));
break :list try p.addNode(.{
.tag = .list,
.data = .{ .list = .{
.start = switch (b.data.list.marker) {
.number_dot, .number_paren => @fromBackingInt(@intCast(b.data.list.start)),
.@"-", .@"*", .@"+" => .unordered,
},
.children = children,
} },
});
},
.list_item => list_item: {
assert(b.string_start == p.scratch_string.items.len);
const children = try p.addExtraChildren(@ptrCast(p.scratch_extra.items[b.extra_start..]));
break :list_item try p.addNode(.{
.tag = .list_item,
.data = .{ .list_item = .{
.tight = true,
.children = children,
} },
});
},
.table => table: {
assert(b.string_start == p.scratch_string.items.len);
const children = try p.addExtraChildren(@ptrCast(p.scratch_extra.items[b.extra_start..]));
break :table try p.addNode(.{
.tag = .table,
.data = .{ .container = .{
.children = children,
} },
});
},
.table_row => table_row: {
assert(b.string_start == p.scratch_string.items.len);
const children = try p.addExtraChildren(@ptrCast(p.scratch_extra.items[b.extra_start..]));
break :table_row try p.addNode(.{
.tag = .table_row,
.data = .{ .container = .{
.children = children,
} },
});
},
.heading => heading: {
const children = try p.parseInlines(p.scratch_string.items[b.string_start..]);
break :heading try p.addNode(.{
.tag = .heading,
.data = .{ .heading = .{
.level = b.data.heading.level,
.children = children,
} },
});
},
.code_block => code_block: {
const content = try p.addString(p.scratch_string.items[b.string_start..]);
break :code_block try p.addNode(.{
.tag = .code_block,
.data = .{ .code_block = .{
.tag = b.data.code_block.tag,
.content = content,
} },
});
},
.blockquote => blockquote: {
assert(b.string_start == p.scratch_string.items.len);
const children = try p.addExtraChildren(@ptrCast(p.scratch_extra.items[b.extra_start..]));
break :blockquote try p.addNode(.{
.tag = .blockquote,
.data = .{ .container = .{
.children = children,
} },
});
},
.paragraph => paragraph: {
const children = try p.parseInlines(p.scratch_string.items[b.string_start..]);
break :paragraph try p.addNode(.{
.tag = .paragraph,
.data = .{ .container = .{
.children = children,
} },
});
},
.thematic_break => try p.addNode(.{
.tag = .thematic_break,
.data = .{ .none = {} },
}),
};
p.scratch_string.items.len = b.string_start;
p.scratch_extra.items.len = b.extra_start;
try p.addScratchExtraNode(node);
}