about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/main.zig17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/main.zig b/src/main.zig
index 346dd02..785a182 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -98,9 +98,26 @@ fn ref(allocator: std.mem.Allocator, w: std.io.AnyWriter, refname: []const u8) a
     // XXX: track ref count?
 }
 
+fn ref_link(allocator: std.mem.Allocator, w: std.io.AnyWriter, refname: []const u8) anyerror!void {
+    const basename = try std.mem.replaceOwned(u8, allocator, refname, " ", "_");
+    defer allocator.free(basename);
+    const refpathSite = try joinIn(allocator, &.{SITE_PATH}, &.{ basename, ".html" });
+    defer allocator.free(refpathSite);
+
+    try w.print("/{s}", .{refpathSite});
+}
+
+fn ref_name(_: std.mem.Allocator, w: std.io.AnyWriter, refname: []const u8) anyerror!void {
+    try w.print("{s}", .{refname});
+}
+
 fn template(allocator: std.mem.Allocator, w: std.io.AnyWriter, refname: []const u8) anyerror!void {
     if (std.mem.startsWith(u8, refname, "/")) {
         return try portal(allocator, w, refname[1..], false);
+    } else if (std.mem.startsWith(u8, refname, "@")) {
+        return try ref_link(allocator, w, refname[1..]);
+    } else if (std.mem.startsWith(u8, refname, "+")) {
+        return try ref_name(allocator, w, refname[1..]);
     } else {
         return try ref(allocator, w, refname);
     }