about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2026-09-23 22:07:12 +0200
committerRobert Günzler <r@gnzler.io>2026-10-02 10:39:47 +0200
commit7585af4ec6d41cff40a872d055bcb871a5057a85 (patch)
tree3c1e0bac884727c9733a851f0d27d611d2f763ab
parent7c319d18955146e8d44413440b679d2779b4c4d9 (diff)
downloadsite-7585af4ec6d41cff40a872d055bcb871a5057a85.tar.gz
track refs
Signed-off-by: Robert Günzler <r@gnzler.io>
-rw-r--r--src/main.zig15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/main.zig b/src/main.zig
index 1deddf3..6529f8d 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -316,6 +316,8 @@ const Builder = struct {
     parts: std.ArrayList([]const u8) = .empty,
     // track component digests which should affect digest check
     dgsts: std.ArrayList(Digest) = .empty,
+    // track references
+    refs: std.ArrayList([]const u8) = .empty,
 
     pub const Options = struct {
         // TODO: this is a bit of a hack no?
@@ -342,6 +344,8 @@ const Builder = struct {
         self.dgsts.deinit(gpa);
         for (self.parts.items) |p| gpa.free(p);
         self.parts.deinit(gpa);
+        for (self.refs.items) |p| gpa.free(p);
+        self.refs.deinit(gpa);
         gpa.destroy(self);
     }
 
@@ -422,7 +426,7 @@ const Builder = struct {
 
                         // do templating
                         const ref_name = line[(offset + start + DELIM_START.len)..end];
-                        try self.template(io, gpa, ref_name, w);
+                        try self.template(io, gpa, ref_name, w, self.source.fd.handle == source.fd.handle);
 
                         // advance offset
                         offset += end + DELIM_END.len;
@@ -441,7 +445,7 @@ const Builder = struct {
         try self.dgsts.append(gpa, try source.digest());
     }
 
-    fn template(self: *Builder, io: Io, gpa: Allocator, ref_name: []const u8, w: *Io.Writer) anyerror!void {
+    fn template(self: *Builder, io: Io, gpa: Allocator, ref_name: []const u8, w: *Io.Writer, track_refs: bool) anyerror!void {
         log.debug("templating ref={s}", .{ref_name});
 
         // special case for when we're injecting the source into the baseof
@@ -468,7 +472,7 @@ const Builder = struct {
             '/' => try self.templatePortal(io, gpa, ref_name[1..], w),
             '$' => return try self.templateLink(gpa, ref_name[1..], w),
             '+' => return try self.templateName(gpa, ref_name[1..], w),
-            else => try self.templateRef(io, gpa, ref_name, w),
+            else => try self.templateRef(io, gpa, ref_name, w, track_refs),
         }
     }
 
@@ -486,7 +490,7 @@ const Builder = struct {
         try w.writeByte('\n');
     }
 
-    fn templateRef(self: *Builder, io: Io, gpa: Allocator, ref_str: []const u8, w: *Io.Writer) !void {
+    fn templateRef(self: *Builder, io: Io, gpa: Allocator, ref_str: []const u8, w: *Io.Writer, track_refs: bool) !void {
         const fragment = std.mem.indexOf(u8, ref_str, "#");
         const ref = if (fragment) |i| ref_str[0..i] else ref_str;
 
@@ -525,6 +529,9 @@ const Builder = struct {
             if (fragment) |i| ref_str[i..] else "",
             ref_name,
         });
+
+        // TODO: $ and + refs should be handled too?
+        if (track_refs) try self.refs.append(gpa, try gpa.dupe(u8, ref));
     }
 
     fn templateLink(self: *Builder, gpa: Allocator, ref_name: []const u8, w: *std.Io.Writer) !void {