+// write {{{
+const TimeStr = std.BoundedArray(u8, 256);
+// fn time_str(_t: i64) TimeStr {
+// var result = TimeStr.init(0) catch unreachable;
+
+// const nthSecond: u64 = @intCast(_t);
+// const nthDay = nthSecond / std.time.s_per_day;
+// const secondInDay = nthSecond - nthDay * std.time.s_per_day;
+// const hourInDay = secondInDay / std.time.s_per_hour;
+// const secondInHour = secondInDay % std.time.s_per_hour;
+// const minuteInHour = secondInHour / 60;
+// const secondInMinute = secondInDay % std.time.s_per_min;
+
+// const nthYear = nthDay / 365; // maybe check
+// const year = 1970 + nthYear;
+// const leapdays = year / 4 - year / 100 + year / 400;
+// const secondInYear = nthSecond - (nthYear * 365 + leapdays) * std.time.s_per_day;
+// const dayInYear = secondInYear / std.time.s_per_day;
+
+// std.fmt.format(result.writer(), "<time>{:0>2}:{:0>2}:{:0>2} {:0>2}.{:0>2}.{:0>4} UTC</time>", .{
+// hourInDay,
+// minuteInHour,
+// secondInMinute,
+// dayInYear,
+// 0,
+// year,
+// }) catch unreachable;
+
+// return result;
+// }
+// http://howardhinnant.github.io/date_algorithms.html
+fn time_str(_t: i64) TimeStr {
+ const t: u64 = @intCast(_t);
+ var result = TimeStr.init(0) catch unreachable;
+
+ const nD = @divFloor(t, std.time.s_per_day);
+ const z: u64 = nD + 719468;
+ const era: u64 = (if (z >= 0) z else z - 146096) / 146097;
+ const doe: u64 = z - era * 146097; // [0, 146096]
+ const yoe: u64 = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; // [0, 399]
+ const Y: u64 = yoe + era * 400;
+ const doy: u64 = doe - (365 * yoe + yoe / 4 - yoe / 100); // [0, 365]
+ const mp: u64 = (5 * doy + 2) / 153; // [0, 11]
+ const D: u64 = doy - (153 * mp + 2) / 5 + 1; // [1, 31]
+ const M: u64 = if (mp < 10) mp + 3 else mp - 9;
+
+ const h: u64 = @divFloor(t - nD * std.time.s_per_day, std.time.s_per_hour);
+ const m: u64 = @divFloor(t - nD * std.time.s_per_day - h * std.time.s_per_hour, std.time.s_per_min);
+ const s: u64 = t - nD * std.time.s_per_day - h * std.time.s_per_hour - m * std.time.s_per_min;
+
+ std.fmt.format(result.writer(), "<time><span>{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2} UTC</span><script>document.currentScript.parentElement.innerHTML=new Date({}).toLocaleString()</script></time>", .{ Y, M, D, h, m, s, t * 1000 }) catch unreachable;
+
+ return result;
+}
+fn write_header(res: *http.Response, logged_in: ?Login) !void {
+ if (logged_in) |login| {
+ try res.write(
+ \\<a href="/">Home</a><br />
+ , .{});
+ try res.write(
+ \\<a href="/user/{s}">Profile</a><br />
+ , .{login.user.name.constSlice()});
+ try res.write(
+ \\<a href="/post">Post</a><br />
+ , .{});
+ try res.write(
+ \\<a href="/edit">Edit</a><br />
+ , .{});
+ try html_form(res, "/logout", .{}, .{
+ \\type="submit" value="Logout"
+ });
+ try html_form(res, "/quit", .{}, .{
+ \\type="submit" value="Quit"
+ });
+ try res.write("<br /><br />", .{});
+ } else {
+ try res.write(
+ \\<a href="/">Home</a><br />
+ \\<form action="/register" method="post">
+ \\<input type="text" name="username" />
+ \\<input type="password" name="password" />
+ \\<input type="submit" value="Register" />
+ \\</form>
+ \\<form action="/login" method="post">
+ \\<input type="text" name="username" />
+ \\<input type="password" name="password" />
+ \\<input type="submit" value="Login" />
+ \\</form>
+ , .{});
+ try html_form(res, "/quit", .{}, .{
+ \\type="submit" value="Quit"
+ });
+ try res.write("<br /><br />", .{});
+ }
+}
+fn write_start(res: *http.Response) !void {
+ try res.write(
+ \\<!doctype html>
+ \\<html>
+ \\<head>
+ \\<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🐣</text></svg>">
+ \\<style>
+ \\ form {
+ \\ display: inline-block;
+ \\ }
+ \\ .toggle > form > input:placeholder-shown {
+ \\ display: none;
+ \\ }
+ \\ .toggle:hover > form > input {
+ \\ display: inline-block;
+ \\ }
+ \\ .toggle > form > input:placeholder-shown + input {
+ \\ display: none;
+ \\ }
+ \\ .toggle:hover > form > input + input {
+ \\ display: inline-block;
+ \\ }
+ \\</style>
+ \\</head>
+ \\<body>
+ , .{});
+}
+fn write_end(res: *http.Response) !void {
+ try res.write("</body></html>", .{});
+}
+fn write_post(res: *http.Response, txn: lmdb.Txn, logged_in: ?Login, post_id: PostId, recurse: enum { No, Once, Yes }) !void {
+ const posts = try Db.posts(txn);
+ const post = posts.get(post_id) catch {
+ res.redirect("/") catch {};
+ return;
+ };
+ const users = try Db.users(txn);
+ const user = try users.get(post.user_id);
+
+ try res.write(
+ \\<div>
+ \\<span><a href="/user/{s}">{s}</a> {s}</span><br />
+ \\<span>{s}</span><br />
+ , .{ user.name.constSlice(), user.display_name.constSlice(), time_str(post.time).constSlice(), post.text.constSlice() });
+
+ if (recurse != .No and post.quote_id != null) {
+ try res.write("<div style=\"border: 1px solid black;\">", .{});
+ try write_post(res, txn, logged_in, post.quote_id.?, .No);
+ try res.write("</div>", .{});
+ }