diff options
| author | Robert Günzler <r@gnzler.io> | 2026-09-23 22:07:12 +0200 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2026-10-02 10:39:47 +0200 |
| commit | 7585af4ec6d41cff40a872d055bcb871a5057a85 (patch) | |
| tree | 3c1e0bac884727c9733a851f0d27d611d2f763ab | |
| parent | 7c319d18955146e8d44413440b679d2779b4c4d9 (diff) | |
| download | site-7585af4ec6d41cff40a872d055bcb871a5057a85.tar.gz | |
track refs
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '')
| -rw-r--r-- | src/main.zig | 15 |
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 { |