Something went wrong. Try again.
Zig Markdown
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792const std = @import("std");const allocator = std.testing.allocator;const zmd = @import("../root.zig");const expectEqualStrings = std.testing.expectEqualStrings;
test "h1" { 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 "h2" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h2>Header</h2> \\</main> \\</body> \\</html> \\ ;
const md = \\## Header ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "h3" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h3>Header</h3> \\</main> \\</body> \\</html> \\ ;
const md = \\### Header ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "h4" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h4>Header</h4> \\</main> \\</body> \\</html> \\ ; const md = \\#### Header ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "h5" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h5>Header</h5> \\</main> \\</body> \\</html> \\ ;
const md = \\##### Header ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "h6" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h6>Header</h6> \\</main> \\</body> \\</html> \\ ;
const md = \\###### Header ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "bold (dangling)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><b>bold</b></p> \\</main> \\</body> \\</html> \\ ;
const md = \\**bold** ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "bold (embedded)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>some <b>bold</b> text</p> \\</main> \\</body> \\</html> \\ ;
const md = \\some **bold** text ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "italic (dangling)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><i>italic</i></p> \\</main> \\</body> \\</html> \\ ;
const md = \\_italic_ ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "italic (embedded)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>some <i>italic</i> text</p> \\</main> \\</body> \\</html> \\ ;
const md = \\some _italic_ text ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "italic with asterisks (dangling)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><i>italic</i></p> \\</main> \\</body> \\</html> \\ ;
const md = \\*italic* ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "italic with asterisks (embedded)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>some <i>italic</i> text</p> \\</main> \\</body> \\</html> \\ ;
const md = \\some *italic* text ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "code (dangling)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><span style="font-family: Monospace;">code</span></p> \\</main> \\</body> \\</html> \\ ;
const md = \\`code` ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "code (embedded)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>some <span style="font-family: Monospace;">code</span> text</p> \\</main> \\</body> \\</html> \\ ;
const md = \\some `code` text ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "block" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<pre style="font-family: Monospace;" class="language-zig"> \\<code> \\if (1 < 10) { \\ return "1 is less than 10"; \\} \\</code> \\</pre> \\</main> \\</body> \\</html> \\ ;
const md = \\```zig \\if (1 < 10) { \\ return "1 is less than 10"; \\} \\``` ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "image" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><img src="https://example.com/image.png" title="image title"></p> \\</main> \\</body> \\</html> \\ ;
const md = \\ ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "link" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><a href="https://example.com/">link title</a></p> \\</main> \\</body> \\</html> \\ ;
const md = \\[link title](https://example.com/) ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "dangling brackets (no href)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>index [0] of array</p> \\</main> \\</body> \\</html> \\ ;
const md = \\index [0] of array ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "passthrough ref ({{ ... }})" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p>value is {{ $.user_name[0] < limit }} today</p> \\</main> \\</body> \\</html> \\ ;
const md = \\value is {{ $.user_name[0] < limit }} today ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "link with passthrough refs in title and href" { // A link whose title and href are `{{ ... }}` refs must still parse as a link, with the refs // passed through verbatim for a downstream consumer to resolve. const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><a href="{{$.url}}">{{$.title}}</a></p> \\</main> \\</body> \\</html> \\ ;
const md = \\[{{$.title}}]({{$.url}}) ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "nested image inside link title" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<p><a href="https://example.com/"><img src="https://example.com/i.png" title="alt"></a></p> \\</main> \\</body> \\</html> \\ ;
const md = \\[](https://example.com/) ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "paragraph" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<h1>a title</h1> \\<p>a paragraph</p> \\</main> \\</body> \\</html> \\ ;
const md = \\# a title \\ \\a paragraph ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "unordered list (+)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ul> \\ <li>list item 1</li> \\ <li>list item 2</li> \\ <li>list item 3</li> \\</ul> \\</main> \\</body> \\</html> \\ ;
const md = \\+ list item 1 \\+ list item 2 \\+ list item 3 ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "unordered list (-)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ul> \\ <li>list item 1</li> \\ <li>list item 2</li> \\ <li>list item 3</li> \\</ul> \\</main> \\</body> \\</html> \\ ;
const md = \\- list item 1 \\- list item 2 \\- list item 3 ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "unordered list (*)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ul> \\ <li>list item 1</li> \\ <li>list item 2</li> \\ <li>list item 3</li> \\</ul> \\</main> \\</body> \\</html> \\ ;
const md = \\* list item 1 \\* list item 2 \\* list item 3 ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "ordered list (1., 1., 1.)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ol> \\ <li>list item 1</li> \\ <li>list item 2</li> \\ <li>list item 3</li> \\</ol> \\</main> \\</body> \\</html> \\ ;
const md = \\1. list item 1 \\1. list item 2 \\1. list item 3 ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "ordered list (1., 2., 3.)" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ol> \\ <li>list item 1</li> \\ <li>list item 2</li> \\ <li>list item 3</li> \\</ol> \\</main> \\</body> \\</html> \\ ;
const md = \\1. list item 1 \\2. list item 2 \\3. list item 3 ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "list with embedded elements" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ul> \\ <li>list item with <a href="https://www.example.com/">my link</a></li> \\ <li>list item with <img src="https://www.example.com/image.png" title="my image"></li> \\ <li>list item with <b>bold</b> and <i>italic</i> text</li> \\</ul> \\</main> \\</body> \\</html> \\ ;
const md = \\* list item with [my link](https://www.example.com/) \\* list item with  \\* list item with **bold** and _italic_ text ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}
test "nested mixed ordered and unordered lists" { const html = \\<!DOCTYPE html> \\<html> \\<head> \\ <meta charset="utf8"> \\</head> \\<body> \\<main> \\<ol> \\ <li>first</li> \\ <li>second \\ <ul> \\ <li>bullet a</li> \\ <li>bullet b</li> \\ </ul> \\ </li> \\ <li>third</li> \\</ol> \\</main> \\</body> \\</html> \\ ; const md = \\1. first \\2. second \\ * bullet a \\ * bullet b \\3. third ;
const parsed = try zmd.parseAlloc(allocator, md, .{}); defer allocator.free(parsed); try expectEqualStrings(html, parsed);}