feature. See also
. The project being documented here (as the example) is the Zig library itself.
main.render_docs
fn render_docs(
out: *ArrayList(u8),
decl_index: Decl.Index,
first_doc_comment: Ast.TokenIndex,
short: bool,
) Oom!void
File
Code
fn render_docs(
out: *ArrayList(u8),
decl_index: Decl.Index,
first_doc_comment: Ast.TokenIndex,
short: bool,
) Oom!void {
const decl = decl_index.get();
const ast = decl.file.get_ast();
var parser = try markdown.Parser.init(gpa);
defer parser.deinit();
var it = first_doc_comment;
while (true) : (it += 1) switch (ast.tokenTag(it)) {
.doc_comment, .container_doc_comment => {
const line = ast.tokenSlice(it)[3..];
if (short and line.len == 0) break;
try parser.feedLine(line);
},
else => break,
};
var parsed_doc = try parser.endInput();
defer parsed_doc.deinit(gpa);
const g = struct {
var link_buffer: ArrayList(u8) = .empty;
};
const Renderer = markdown.Renderer(Decl.Index);
const renderer: Renderer = .{
.context = decl_index,
.renderFn = struct {
fn render(
r: Renderer,
doc: markdown.Document,
node: markdown.Document.Node.Index,
writer: *Writer,
) Writer.Error!void {
const data = doc.nodes.items(.data)[@backingInt(node)];
switch (doc.nodes.items(.tag)[@backingInt(node)]) {
.code_span => {
try writer.writeAll("<code>");
const content = doc.string(data.text.content);
if (resolve_decl_path(r.context, content)) |resolved_decl_index| {
g.link_buffer.clearRetainingCapacity();
resolveDeclLink(resolved_decl_index, &g.link_buffer) catch return error.WriteFailed;
try writer.writeAll("<a href=\"#");
_ = missing_feature_url_escape;
try writer.writeAll(g.link_buffer.items);
try writer.print("\">{f}</a>", .{markdown.fmtHtml(content)});
} else {
try writer.print("{f}", .{markdown.fmtHtml(content)});
}
try writer.writeAll("</code>");
},
else => try Renderer.renderDefault(r, doc, node, writer),
}
}
}.render,
};
var allocating = Writer.Allocating.fromArrayList(gpa, out);
defer out.* = allocating.toArrayList();
renderer.render(parsed_doc, &allocating.writer) catch |err| switch (err) {
error.WriteFailed => return error.OutOfMemory,
};
}