Something went wrong. Try again.
Zig Markdown
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297const std = @import("std");const Writer = std.Io.Writer;const allocator = std.testing.allocator;const zmd = @import("../root.zig");const Node = @import("../Parser.zig").Node;const expectEqualStrings = std.testing.expectEqualStrings;
test "parse markdown and translate to HTML" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h1>Header</h1> \\<h2>Sub-header</h2> \\<h3>Sub-sub-header</h3> \\<p>some text in <b>bold</b> and <i>italic</i></p> \\<p>a paragraph</p> \\<p>a link: <a href="https://ziglang.org/">my link</a></p> \\<p>an image: <img src="https://www.jetzig.dev/jetzig.png" title="jetzig logo"></p> \\<pre style="font-family: Monospace;" class="language-zig"> \\<code> \\if (1 < 10) { \\ std.debug.print("1 is < 10 !"); \\} \\</code> \\</pre> \\<p>some more text with a <span style="font-family: Monospace;">code</span> fragment</p> \\</main> \\</body> \\</html> \\ ;
const md = \\# Header \\## Sub-header \\### Sub-sub-header \\ \\some text in **bold** and _italic_ \\ \\a paragraph \\ \\a link: [my link](https://ziglang.org/) \\ \\an image:  \\ \\```zig \\if (1 < 10) { \\ std.debug.print("1 is < 10 !"); \\} \\``` \\some more text with a `code` fragment \\ ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse content without trailing linebreak before eof" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h1>Header</h1> \\</main> \\</body> \\</html> \\ ;
const md = \\# Header ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse paragraph leading with a token" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h1>Header</h1> \\<p><b>bold</b> text at the start of a paragraph</p> \\</main> \\</body> \\</html> \\ ;
const md = \\# Header \\ \\**bold** text at the start of a paragraph ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse indented list" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ul> \\ <li>foo</li> \\ <li>bar</li> \\ <li>baz</li> \\</ul> \\</main> \\</body> \\</html> \\ ;
const md = \\ * foo \\ * bar \\ * baz ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse underscores in code element" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ul> \\ <li><span style="font-family: Monospace;">foo_bar</span></li> \\ <li><span style="font-family: Monospace;">baz_qux</span></li> \\ <li><span style="font-family: Monospace;">quux_corge</span></li> \\</ul> \\</main> \\</body> \\</html> \\ ;
const md = \\* `foo_bar` \\* `baz_qux` \\* `quux_corge` ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse parentheses in paragraph" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>some text (with parentheses) in a paragraph</p> \\</main> \\</body> \\</html> \\ ;
const md = \\some text (with parentheses) in a paragraph ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse underscore in link" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>a <i>link</i> to <a href="https://en.wikipedia.org/wiki/Here_document">here_doc</a> with <i>italics</i> and <b>bold</b></p> \\</main> \\</body> \\</html> \\ ;
const md = \\a _link_ to [here_doc](https://en.wikipedia.org/wiki/Here_document) with _italics_ and **bold** ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse underscores in block" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<pre style="font-family: Monospace;" class="language-zig"> \\<code> \\if (foo_bar_baz) return true; \\</code> \\</pre> \\</main> \\</body> \\</html> \\ ;
const md = \\```zig \\if (foo_bar_baz) return true; \\``` ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "parse repeated whitespace" { // Used to be really slow const parsed = try zmd.parseAlloc(allocator, " " ** 40_000, .{}); allocator.free(parsed);}
fn newH1(writer: *Writer, node: Node) Writer.Error![]const u8 { _ = node; try writer.writeAll("<h0>"); return \\</h0> \\ ;}
fn newRoot(writer: *Writer, node: Node) Writer.Error![]const u8 { _ = writer; _ = node; return "";}
test "custom handler func" { const html = \\<h0>Hello</h0> \\ ;
const md = "# Hello";
const parsed = try zmd.parseAlloc(allocator, md, .{ .h1 = newH1, .root = newRoot, }); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}