const std = @import("std"); const Writer = std.Io.Writer; const Config = @This(); root: Tag = .{ .opening = \\ \\ \\ \\ \\ \\ \\
\\ , .closing = \\
\\ \\ \\ , }, block: Tag = .{ .opening = \\
    \\
    \\
    ,
    .closing =
    \\
    \\
    \\
\\ , }, link: Tag = .{ .opening = \\ , .closing = "", }, image: Tag = .{ .opening = \\ , }, h1: Tag = .{ .opening = "

", .closing = "

\n" }, h2: Tag = .{ .opening = "

", .closing = "

\n" }, h3: Tag = .{ .opening = "

", .closing = "

\n" }, h4: Tag = .{ .opening = "

", .closing = "

\n" }, h5: Tag = .{ .opening = "
", .closing = "
\n" }, h6: Tag = .{ .opening = "
", .closing = "
\n" }, bold: Tag = .{ .opening = "", .closing = "" }, italic: Tag = .{ .opening = "", .closing = "" }, unordered_list: Tag = .{ .opening = "\n" }, ordered_list: Tag = .{ .opening = "
    \n", .closing = "
\n" }, list_item: Tag = .{ .opening = "
  • ", .closing = "
  • \n" }, code: Tag = .{ .opening = \\ , .closing = "", }, paragraph: Tag = .{ .opening = "

    ", .closing = "

    \n" }, text: Tag = .{ .opening = "", .closing = "" }, ref: Tag = .handlebars_ref, pub const Tag = struct { opening: []const u8, closing: []const u8, pub const jinja_ref: Tag = .{ .opening = "{%", .closing = "%}" }; pub const handlebars_ref: Tag = .{ .opening = "{{", .closing = "}}" }; }; pub fn write(self: Config, field: Field, writer: *Writer, node: Node) ![]const u8 { const tag: Tag = switch (field) { .root => self.root, .block => self.block, .link => self.link, .image => self.image, .h1 => self.h1, .h2 => self.h2, .h3 => self.h3, .h4 => self.h4, .h5 => self.h5, .h6 => self.h6, .unordered_list => self.unordered_list, .ordered_list => self.ordered_list, .list_item => self.list_item, .bold => self.bold, .italic => self.italic, .code => self.code, .text => self.text, .paragraph => self.paragraph, .ref => self.ref, }; switch (field) { .block => try writeTag(writer, tag.opening, "{[language]s}", node.language orelse ""), .link, .image => try writeTag(writer, tag.opening, "{[href]s}", node.href orelse ""), else => try writer.writeAll(tag.opening), } return tag.closing; } fn writeTag(writer: *Writer, opening: []const u8, placeholder: []const u8, value: []const u8) !void { const index = std.mem.indexOf(u8, opening, placeholder) orelse { try writer.writeAll(opening); return; }; try writer.writeAll(opening[0..index]); try writer.writeAll(value); try writer.writeAll(opening[index + placeholder.len ..]); } pub const Node = struct { language: ?[]const u8 = null, href: ?[]const u8 = null, }; pub const Field = enum { root, block, link, image, h1, h2, h3, h4, h5, h6, unordered_list, ordered_list, list_item, bold, italic, code, text, paragraph, ref, };