Zen言語の標準ライブラリ紹介〜Markdown〜

はじめに

けっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。 まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。

リクエストあれば、優先する、かも?

MarkdownをパースしてHTML出力します。

std.markdown

適当なMarkdownを用意して、parse関数を呼び出します。

const std = @import("std");
const heap = std.heap;
const fs = std.fs;
const io = std.io;
const markdown = std.markdown;

pub fn main() anyerror!void {
    const in =
\\ # Subject
\\
\\- one
\\- two
\\
\\```zen
\\ pub fn main() void {
\\    
\\}
\\```
;

    var alloc_bytes: [1024 * 4]u8 = undefined;
    var out_bytes: [1024]u8 = undefined;
    var stdout = try fs.getStdOut();
    var fba = heap.FixedBufferAllocator{ .buffer = &alloc_bytes };

    try markdown.parse(&fba, in, &stdout, markdown.renderHtml(fs.File.WriteError));
}

parse関数は次のようなAPIになっています。

pub fn parse(allocator: heap.Allocator, text: []const u8, callback_ctx: var, callback: var) !void

callbackは次の関数シグネチャを満たす関数ポインタであることが期待されています。

fn func(out_stream: *vtable io.OutStream(E), res: Result) E!void

callback_ctxは自然と、io.OutStream(E)を満たすことが求められます。

markdown.renderHtml(fs.File.WriteError)はそのような関数ポインタを返す関数になっています。

実行結果を見てみましょう。

$ zen build run
<h1>Subject</h1>
<ul>
<li><p>one</p>
</li>
<li><p>two</p>
</li>
</ul>
<pre><code class="language-zen"> pub fn main() void {
    
}
</code></pre>

ちゃんとHTMLが出力されていますね!