size: 959 B

const std = @import("std");
const mem = std.mem;
const t = std.testing;

pub fn toHtml(arena: mem.Allocator, text: []const u8) ![]const u8 {
    var child = std.process.Child.init(&.{"cmark"}, arena);
    child.stdin_behavior = .Pipe;
    child.stdout_behavior = .Pipe;
    child.stderr_behavior = .Pipe;

    var stdout: std.ArrayList(u8) = .empty;
    var stderr: std.ArrayList(u8) = .empty;

    try child.spawn();
    errdefer {
        _ = child.kill() catch {};
    }
    try child.stdin.?.writeAll(text);
    child.stdin.?.close();
    child.stdin = null;
    try child.collectOutput(arena, &stdout, &stderr, 64 * 1024);
    _ = try child.wait();

    return stdout.items;
}

test "toHtml" {
    var arena_impl = std.heap.ArenaAllocator.init(t.allocator_instance.allocator());
    defer arena_impl.deinit();
    const arena = arena_impl.allocator();

    try t.expectEqualStrings(
        "<h1>foo</h1>\n",
        try toHtml(arena, "# foo"),
    );
}