srctree

Gregory Mullen parent 307422c8 179b18dc
refactor Template 1st pass to remove Template.ctx

src/context.zig added: 142, removed: 149, total 0
@@ -50,8 +50,37 @@ pub fn init(a: Allocator, cfg: ?Config, req: Request, res: Response, req_data: R
};
}
 
const HTML = @import("html.zig");
 
/// TODO Remove thes /// caller owns of the returned slice, freeing the data before the final use is undefined
pub fn addElements(ctx: *Context, a: Allocator, name: []const u8, els: []const HTML.Element) !void {
return ctx.addElementsFmt(a, "{}", name, els);
}
 
/// caller owns of the returned slice, freeing the data before the final use is undefined
pub fn addElementsFmt(
ctx: *Context,
a: Allocator,
comptime fmt: []const u8,
name: []const u8,
els: []const HTML.Element,
) !void {
const list = try a.alloc([]u8, els.len);
defer a.free(list);
for (list, els) |*l, e| {
l.* = try std.fmt.allocPrint(a, fmt, .{e});
}
defer {
for (list) |l| a.free(l);
}
const value = try std.mem.join(a, "", list);
 
// TODO FIXME plz
try ctx.template_ctx.put(name, .{ .slice = value });
}
 
pub fn putContext(ctx: *Context, name: []const u8, val: Template.Context.Data) !void {
ctx.template_ctx.putNext(name, val) catch |err| switch (err) {
ctx.template_ctx.put(name, val) catch |err| switch (err) {
error.OutOfMemory => return err,
};
}
@@ -68,9 +97,9 @@ pub fn sendTemplate(ctx: *Context, t: *Template.Template) Error!void {
else => unreachable,
};
const loggedin = if (ctx.request.auth.valid()) "<a href=\"#\">Logged In</a>" else "Public";
try t.addVar("Header.auth", loggedin);
try ctx.putContext("Header.auth", .{ .slice = loggedin });
if (ctx.request.auth.user(ctx.alloc)) |usr| {
try t.addVar("Current_username", usr.username);
try ctx.putContext("Current_username", .{ .slice = usr.username });
} else |_| {}
//
const page = try t.buildFor(ctx.alloc, ctx.template_ctx);
 
src/endpoints/admin.zig added: 142, removed: 149, total 0
@@ -56,7 +56,7 @@ fn default(ctx: *Context) Error!void {
 
var tmpl = Template.find("admin.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Form", form) catch unreachable;
_ = ctx.addElements(ctx.alloc, "Form", form) catch unreachable;
try ctx.sendTemplate(&tmpl);
}
 
@@ -77,7 +77,7 @@ fn cloneUpstream(ctx: *Context) Error!void {
 
var tmpl = Template.find("admin.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Form", form) catch unreachable;
_ = ctx.addElements(ctx.alloc, "Form", form) catch unreachable;
try ctx.sendTemplate(&tmpl);
}
 
@@ -118,7 +118,7 @@ fn postCloneUpstream(ctx: *Context) Error!void {
 
var tmpl = Template.find("admin.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Form", form) catch unreachable;
_ = ctx.addElements(ctx.alloc, "Form", form) catch unreachable;
try ctx.sendTemplate(&tmpl);
}
 
@@ -162,7 +162,7 @@ fn postNewRepo(ctx: *Context) Error!void {
 
var tmpl = Template.find("admin.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Form", form) catch unreachable;
_ = ctx.addElements(ctx.alloc, "Form", form) catch unreachable;
try ctx.sendTemplate(&tmpl);
}
 
@@ -185,7 +185,7 @@ fn newRepo(ctx: *Context) Error!void {
 
var tmpl = Template.find("admin.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Form", form) catch unreachable;
_ = ctx.addElements(ctx.alloc, "Form", form) catch unreachable;
try ctx.sendTemplate(&tmpl);
}
 
 
src/endpoints/commit-flex.zig added: 142, removed: 149, total 0
@@ -24,16 +24,16 @@ const Scribe = struct {
 
pub fn toContext(self: Commit, a: Allocator) !Template.Context {
var jctx = Template.Context.init(a);
try jctx.put("Name", self.name);
try jctx.put("Repo", self.repo);
try jctx.put("Title", self.title);
try jctx.put("Date", try std.fmt.allocPrint(
try jctx.putSlice("Name", self.name);
try jctx.putSlice("Repo", self.repo);
try jctx.putSlice("Title", self.title);
try jctx.putSlice("Date", try std.fmt.allocPrint(
a,
"<span>{Y-m-d}</span><span>{day}</span><span>{time}</span>",
.{ self.date, self.date, self.date },
));
try jctx.put("ShaLong", self.sha);
try jctx.put("Sha", self.sha[0..8]);
try jctx.putSlice("ShaLong", self.sha);
try jctx.putSlice("Sha", self.sha[0..8]);
return jctx;
}
};
@@ -342,7 +342,7 @@ pub fn commitFlex(ctx: *Context) Error!void {
 
try ctx.putContext("TotalHits", .{ .slice = try std.fmt.allocPrint(ctx.alloc, "{}", .{tcount}) });
try ctx.putContext("CheckedRepos", .{ .slice = try std.fmt.allocPrint(ctx.alloc, "{}", .{repo_count}) });
_ = tmpl.addElements(ctx.alloc, "Flexes", flex) catch return Error.Unknown;
_ = ctx.addElements(ctx.alloc, "Flexes", flex) catch return Error.Unknown;
 
std.sort.pdq(Scribe.Commit, scribe_list.items, {}, journalSorted);
 
@@ -374,9 +374,9 @@ pub fn commitFlex(ctx: *Context) Error!void {
}
 
var today_grp = Template.Context.init(ctx.alloc);
try today_grp.put("Group", "Today");
try today_grp.putSlice("Group", "Today");
if (todays.items.len > 1) {
try today_grp.put("Lead", try std.fmt.allocPrint(
try today_grp.putSlice("Lead", try std.fmt.allocPrint(
ctx.alloc,
"{} commits today",
.{todays.items.len},
@@ -386,9 +386,9 @@ pub fn commitFlex(ctx: *Context) Error!void {
try today_grp.putBlock("Rows", todays.items);
try groups.append(today_grp);
var yesterday_grp = Template.Context.init(ctx.alloc);
try yesterday_grp.put("Group", "Yesterday");
try yesterday_grp.putSlice("Group", "Yesterday");
if (yesterdays.items.len > 1) {
try yesterday_grp.put("Lead", try std.fmt.allocPrint(
try yesterday_grp.putSlice("Lead", try std.fmt.allocPrint(
ctx.alloc,
"{} commits yesterday",
.{yesterdays.items.len},
@@ -397,16 +397,16 @@ pub fn commitFlex(ctx: *Context) Error!void {
try yesterday_grp.putBlock("Rows", yesterdays.items);
try groups.append(yesterday_grp);
var last_weeks_grp = Template.Context.init(ctx.alloc);
try last_weeks_grp.put("Group", "Last Week");
try last_weeks_grp.putSlice("Group", "Last Week");
try last_weeks_grp.putBlock("Rows", last_weeks.items);
try groups.append(last_weeks_grp);
var last_months_grp = Template.Context.init(ctx.alloc);
try last_months_grp.put("Group", "Last Month");
try last_months_grp.putSlice("Group", "Last Month");
try last_months_grp.putBlock("Rows", last_months.items);
try groups.append(last_months_grp);
 
// TODO sort by date
try tmpl.ctx.?.putBlock("Months", groups.items);
try ctx.putContext("Months", .{ .block = groups.items });
}
 
return ctx.sendTemplate(&tmpl) catch unreachable;
 
src/endpoints/network.zig added: 142, removed: 149, total 0
@@ -45,6 +45,6 @@ fn default(ctx: *Context) Error!void {
 
var tmpl = Template.find("network.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Netlist", data) catch unreachable;
_ = ctx.addElements(ctx.alloc, "Netlist", data) catch unreachable;
try ctx.sendTemplate(&tmpl);
}
 
src/endpoints/repos.zig added: 142, removed: 149, total 0
@@ -236,7 +236,7 @@ fn list(ctx: *Context) Error!void {
const data = dom.done();
var tmpl = Template.find("repos.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "Repos", data) catch return Error.Unknown;
_ = ctx.addElements(ctx.alloc, "Repos", data) catch return Error.Unknown;
 
try ctx.sendTemplate(&tmpl);
} else |err| {
@@ -256,7 +256,7 @@ fn newRepo(ctx: *Context) Error!void {
var tmpl = Template.find("repo.html");
tmpl.init(ctx.alloc);
 
tmpl.addVar("Files", "<h3>New Repo!</h3><p>Todo, add content here</p>") catch return error.Unknown;
ctx.putContext("Files", .{ .slice = "<h3>New Repo!</h3><p>Todo, add content here</p>" }) catch return error.Unknown;
ctx.response.status = .ok;
 
try ctx.sendTemplate(&tmpl);
@@ -439,7 +439,7 @@ fn blame(ctx: *Context) Error!void {
 
const tctx = try wrapLineNumbersBlame(ctx.alloc, parsed.lines, parsed.map);
for (tctx) |*c| {
try c.put("Repo_name", rd.name);
try c.putSlice("Repo_name", rd.name);
}
 
var tmpl = Template.find("blame.html");
@@ -447,7 +447,6 @@ fn blame(ctx: *Context) Error!void {
 
try ctx.putContext("Blame_lines", .{ .block = tctx[0..] });
 
//tmpl.addVar("Filename", blame_file) catch return error.Unknown;
ctx.response.status = .ok;
 
try ctx.sendTemplate(&tmpl);
@@ -580,13 +579,13 @@ fn blob(ctx: *Context, repo: *Git.Repo, pfiles: Git.Tree) Error!void {
"{pretty}",
.{HTML.div(data, &HTML.Attr.class("code-block"))},
);
tmpl.addVar("Blob", filestr) catch return error.Unknown;
tmpl.addVar("Filename", blb.name) catch return error.Unknown;
ctx.putContext("Blob", .{ .slice = filestr }) catch return error.Unknown;
ctx.putContext("Filename", .{ .slice = blb.name }) catch return error.Unknown;
ctx.uri.reset();
_ = ctx.uri.next();
tmpl.addVar("Repo", ctx.uri.next() orelse "unknown") catch return error.Unknown;
ctx.putContext("Repo", .{ .slice = ctx.uri.next() orelse "unknown" }) catch return error.Unknown;
_ = ctx.uri.next();
tmpl.addVar("Uri_filename", ctx.uri.rest()) catch return error.Unknown;
ctx.putContext("Uri_filename", .{ .slice = ctx.uri.rest() }) catch return error.Unknown;
 
ctx.response.status = .ok;
 
@@ -685,7 +684,7 @@ fn tree(ctx: *Context, repo: *Git.Repo, files: *Git.Tree) Error!void {
.branch => |b| b.name,
else => "unknown",
} else "unknown";
tmpl.addVar("Branch.default", head) catch return error.Unknown;
ctx.putContext("Branch.default", .{ .slice = head }) catch return error.Unknown;
 
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
ctx.uri.reset();
@@ -749,7 +748,7 @@ fn tree(ctx: *Context, repo: *Git.Repo, files: *Git.Tree) Error!void {
 
dom = dom.close();
const data = dom.done();
_ = tmpl.addElements(ctx.alloc, "Repo", data) catch return error.Unknown;
_ = ctx.addElements(ctx.alloc, "Repo", data) catch return error.Unknown;
 
for (files.objects) |obj| {
if (isReadme(obj.name)) {
@@ -757,7 +756,7 @@ fn tree(ctx: *Context, repo: *Git.Repo, files: *Git.Tree) Error!void {
var reader = resolve.reader();
const readme_txt = reader.readAllAlloc(ctx.alloc, 0xffffff) catch unreachable;
const readme = htmlReadme(ctx.alloc, readme_txt) catch unreachable;
_ = tmpl.addElementsFmt(ctx.alloc, "{pretty}", "Readme", readme) catch return error.Unknown;
_ = ctx.addElementsFmt(ctx.alloc, "{pretty}", "Readme", readme) catch return error.Unknown;
break;
}
}
 
src/endpoints/repos/commits.zig added: 142, removed: 149, total 0
@@ -326,16 +326,16 @@ pub fn htmlCommit(a: Allocator, c: Git.Commit, repo: []const u8, comptime top: b
fn commitContext(a: Allocator, c: Git.Commit, repo: []const u8, comptime _: bool) !Template.Context {
var ctx = Template.Context.init(a);
 
try ctx.put("Sha", c.sha[0..8]);
try ctx.put("Uri", try std.fmt.allocPrint(a, "/repo/{s}/commit/{s}", .{ repo, c.sha[0..8] }));
try ctx.putSlice("Sha", c.sha[0..8]);
try ctx.putSlice("Uri", try std.fmt.allocPrint(a, "/repo/{s}/commit/{s}", .{ repo, c.sha[0..8] }));
// TODO handle error.NotImplemented
try ctx.put("Msg_title", Bleach.sanitizeAlloc(a, c.title, .{}) catch unreachable);
try ctx.put("Msg", Bleach.sanitizeAlloc(a, c.body, .{}) catch unreachable);
try ctx.putSlice("Msg_title", Bleach.sanitizeAlloc(a, c.title, .{}) catch unreachable);
try ctx.putSlice("Msg", Bleach.sanitizeAlloc(a, c.body, .{}) catch unreachable);
//if (top) "top" else "foot", null, null));
const parent = c.parent[0] orelse "00000000";
try ctx.put("Author", c.author.name);
try ctx.put("Parent", parent[0..8]);
try ctx.put("Parent_uri", try std.fmt.allocPrint(a, "/repo/{s}/commit/{s}", .{ repo, parent[0..8] }));
try ctx.putSlice("Author", c.author.name);
try ctx.putSlice("Parent", parent[0..8]);
try ctx.putSlice("Parent_uri", try std.fmt.allocPrint(a, "/repo/{s}/commit/{s}", .{ repo, parent[0..8] }));
return ctx;
}
 
@@ -445,9 +445,9 @@ fn sendCommits(ctx: *Context, list: []Template.Context, before_txt: []const u8)
var tmpl = Template.find("commit-list.html");
tmpl.init(ctx.alloc);
 
try tmpl.ctx.?.putBlock("Commits", list);
try ctx.putContext("Commits", .{ .block = list });
 
_ = tmpl.addElements(ctx.alloc, "After", &[_]HTML.E{
_ = ctx.addElements(ctx.alloc, "After", &[_]HTML.E{
try HTML.linkBtnAlloc(ctx.alloc, "More", before_txt),
}) catch return error.Unknown;
 
 
src/endpoints/repos/diffs.zig added: 142, removed: 149, total 0
@@ -112,7 +112,6 @@ fn newPost(ctx: *Context) Error!void {
 
var tmpl = Template.find("diff-new.html");
tmpl.init(ctx.alloc);
try tmpl.addVar("diff", "new data attempting");
try ctx.sendTemplate(&tmpl);
}
 
@@ -169,7 +168,7 @@ fn view(ctx: *Context) Error!void {
dom = dom.close();
dom = dom.close();
 
_ = try tmpl.addElements(ctx.alloc, "Patch_header", dom.done());
_ = try ctx.addElements(ctx.alloc, "Patch_header", dom.done());
 
// meme saved to protect history
//for ([_]Comment{ .{
@@ -193,7 +192,7 @@ fn view(ctx: *Context) Error!void {
@panic("oops");
}
 
try tmpl.ctx.?.put("Delta_id", delta_id);
try ctx.putContext("Delta_id", .{ .slice = delta_id });
 
const filename = try std.fmt.allocPrint(ctx.alloc, "data/patch/{s}.{x}.patch", .{ rd.name, delta.index });
const file: ?std.fs.File = std.fs.cwd().openFile(filename, .{}) catch null;
@@ -201,7 +200,7 @@ fn view(ctx: *Context) Error!void {
const fdata = f.readToEndAlloc(ctx.alloc, 0xFFFFF) catch return error.Unknown;
var patch = Patch.Patch.init(fdata);
const patch_html = try Commits.patchHtml(ctx.alloc, &patch);
_ = try tmpl.addElementsFmt(ctx.alloc, "{pretty}", "Patch", patch_html);
_ = try ctx.addElementsFmt(ctx.alloc, "{pretty}", "Patch", patch_html);
f.close();
} else try tmpl.addString("Patch", "Patch not found");
 
@@ -228,7 +227,7 @@ fn list(ctx: *Context) Error!void {
builder.build(ctx.alloc, delta_ctx) catch unreachable;
_ = d.loadThread(ctx.alloc) catch unreachable;
if (d.getComments(ctx.alloc)) |cmts| {
try delta_ctx.put(
try delta_ctx.putSlice(
"Comments_icon",
try std.fmt.allocPrint(ctx.alloc, "<span class=\"icon\">\xee\xa0\x9c {}</span>", .{cmts.len}),
);
@@ -238,6 +237,6 @@ fn list(ctx: *Context) Error!void {
}
var tmpl = Template.find("deltalist.html");
tmpl.init(ctx.alloc);
try tmpl.ctx.?.putBlock("List", tmpl_ctx[0..end]);
try ctx.putContext("List", .{ .block = tmpl_ctx[0..end] });
try ctx.sendTemplate(&tmpl);
}
 
src/endpoints/repos/issues.zig added: 142, removed: 149, total 0
@@ -111,17 +111,17 @@ fn view(ctx: *Context) Error!void {
tmpl.init(ctx.alloc);
 
var delta = (Delta.open(ctx.alloc, rd.name, index) catch return error.Unrouteable) orelse return error.Unrouteable;
try tmpl.ctx.?.put("Repo", rd.name);
try ctx.putContext("Repo", .{ .slice = rd.name });
//dom.push(HTML.text(delta.repo));
 
try tmpl.ctx.?.put(
try ctx.putContext(
"Title",
Bleach.sanitizeAlloc(ctx.alloc, delta.title, .{}) catch unreachable,
.{ .slice = Bleach.sanitizeAlloc(ctx.alloc, delta.title, .{}) catch unreachable },
);
 
try tmpl.ctx.?.put(
try ctx.putContext(
"Desc",
Bleach.sanitizeAlloc(ctx.alloc, delta.message, .{}) catch unreachable,
.{ .slice = Bleach.sanitizeAlloc(ctx.alloc, delta.message, .{}) catch unreachable },
);
 
_ = delta.loadThread(ctx.alloc) catch unreachable;
@@ -134,16 +134,16 @@ fn view(ctx: *Context) Error!void {
builder.build(ctx.alloc, cctx) catch unreachable;
try cctx.put(
"Date",
try std.fmt.allocPrint(ctx.alloc, "{}", .{Humanize.unix(comment.updated)}),
.{ .slice = try std.fmt.allocPrint(ctx.alloc, "{}", .{Humanize.unix(comment.updated)}) },
);
}
try tmpl.ctx.?.putBlock("Comments", comments);
try ctx.putContext("Comments", .{ .block = comments });
} else |err| {
std.debug.print("Unable to load comments for thread {} {}\n", .{ index, err });
@panic("oops");
}
 
try tmpl.ctx.?.put("Delta_id", delta_id);
try ctx.putContext("Delta_id", .{ .slice = delta_id });
 
try ctx.sendTemplate(&tmpl);
}
@@ -168,7 +168,7 @@ fn list(ctx: *Context) Error!void {
builder.build(ctx.alloc, delta_ctx) catch unreachable;
_ = d.loadThread(ctx.alloc) catch unreachable;
if (d.getComments(ctx.alloc)) |cmts| {
try delta_ctx.put(
try delta_ctx.putSlice(
"Comments_icon",
try std.fmt.allocPrint(ctx.alloc, "<span class=\"icon\">\xee\xa0\x9c {}</span>", .{cmts.len}),
);
@@ -178,11 +178,11 @@ fn list(ctx: *Context) Error!void {
}
var tmpl = Template.find("deltalist.html");
tmpl.init(ctx.alloc);
try tmpl.ctx.?.putBlock("List", tmpl_ctx[0..end]);
try ctx.putContext("List", .{ .block = tmpl_ctx[0..end] });
 
var default_search_buf: [0xFF]u8 = undefined;
const def_search = try std.fmt.bufPrint(&default_search_buf, "is:issue repo:{s} ", .{rd.name});
try tmpl.ctx.?.put("Search", def_search);
try ctx.putContext("Search", .{ .slice = def_search });
 
try ctx.sendTemplate(&tmpl);
}
 
src/endpoints/users.zig added: 142, removed: 149, total 0
@@ -27,7 +27,7 @@ pub fn diffs(ctx: *Context) Error!void {
 
var tmpl = Template.find("deltalist.html");
tmpl.init(ctx.alloc);
_ = tmpl.addElements(ctx.alloc, "todos", data) catch unreachable;
_ = ctx.addElements(ctx.alloc, "todos", data) catch unreachable;
ctx.sendTemplate(&tmpl) catch unreachable;
}
 
 
src/template.zig added: 142, removed: 149, total 0
@@ -113,11 +113,11 @@ pub const Context = struct {
self.ctx.deinit();
}
 
pub fn putNext(self: *Context, name: []const u8, value: Data) !void {
pub fn put(self: *Context, name: []const u8, value: Data) !void {
try self.ctx.put(name, value);
}
 
pub fn getNext(self: Context, name: []const u8) ?Data {
pub fn get(self: Context, name: []const u8) ?Data {
return self.ctx.get(name);
}
 
@@ -125,7 +125,7 @@ pub const Context = struct {
if (comptime build_mode == .Debug)
if (!std.ascii.isUpper(name[0]))
std.debug.print("Warning Template can't resolve {s}\n", .{name});
try self.putNext(name, .{ .slice = value });
try self.ctx.put(name, .{ .slice = value });
}
 
pub fn getSlice(self: Context, name: []const u8) ?[]const u8 {
@@ -136,22 +136,14 @@ pub const Context = struct {
};
}
 
pub fn put(self: *Context, name: []const u8, value: []const u8) !void {
try self.putSlice(name, value);
}
 
pub fn get(self: Context, name: []const u8) ?[]const u8 {
return self.getSlice(name);
}
 
/// Memory of block is managed by the caller. Calling raze will not free the
/// memory from within.
pub fn putBlock(self: *Context, name: []const u8, block: []Context) !void {
try self.putNext(name, .{ .block = block });
try self.ctx.put(name, .{ .block = block });
}
 
pub fn getBlock(self: Context, name: []const u8) !?[]const Context {
return switch (self.getNext(name) orelse return null) {
return switch (self.ctx.get(name) orelse return null) {
// I'm sure this hack will live forever, I'm abusing With to be
// an IF here, without actually implementing IF... sorry!
//std.debug.print("Error: get [{s}] required Block, found slice\n", .{name});
@@ -159,6 +151,18 @@ pub const Context = struct {
.block => |b| b,
};
}
 
pub fn putReader(self: *Context, name: []const u8, value: []const u8) !void {
try self.putSlice(name, value);
}
 
pub fn getReader(self: Context, name: []const u8) ?std.io.AnyReader {
switch (self.ctx.get(name) orelse return null) {
.slice, .block => return error.NotAReader,
.reader => |r| return r,
}
comptime unreachable;
}
};
 
pub const Template = struct {
@@ -188,57 +192,15 @@ pub const Template = struct {
self.ctx.raze();
}
 
/// caller owns of the returned slice, freeing the data before the final use is undefined
pub fn addElements(self: *Template, a: Allocator, name: []const u8, els: []const HTML.Element) !void {
return self.addElementsFmt(a, "{}", name, els);
}
 
/// caller owns of the returned slice, freeing the data before the final use is undefined
pub fn addElementsFmt(
self: *Template,
a: Allocator,
comptime fmt: []const u8,
name: []const u8,
els: []const HTML.Element,
) !void {
const list = try a.alloc([]u8, els.len);
defer a.free(list);
for (list, els) |*l, e| {
l.* = try std.fmt.allocPrint(a, fmt, .{e});
}
defer {
for (list) |l| a.free(l);
}
const value = try std.mem.join(a, "", list);
 
try self.ctx.?.put(name, value);
}
 
/// Deprecated, use addString
pub fn addVar(self: *Template, name: []const u8, value: []const u8) !void {
return self.addString(name, value);
}
 
pub fn addString(self: *Template, name: []const u8, value: []const u8) !void {
try self.ctx.?.put(name, value);
}
 
pub fn build(self: *Template, ext_a: ?Allocator) ![]u8 {
const a = ext_a orelse self.alloc orelse unreachable; // return error.AllocatorInvalid;
return std.fmt.allocPrint(a, "{}", .{self});
try self.ctx.?.putSlice(name, value);
}
 
pub fn buildFor(self: *Template, a: Allocator, ctx: Context) ![]u8 {
var template = self.*;
if (template.ctx) |_| {
var itr = ctx.ctx.iterator();
while (itr.next()) |n| {
try template.ctx.?.putNext(n.key_ptr.*, n.value_ptr.*);
}
} else {
template.ctx = ctx;
}
return try template.build(a);
var template: Template = self.*;
template.alloc = a;
template.ctx = ctx;
return std.fmt.allocPrint(a, "{}", .{template});
}
 
fn templateSearch() bool {
@@ -380,7 +342,11 @@ pub const Template = struct {
.noun => |noun| {
const var_name = noun.vari;
if (ctx.get(var_name)) |v_blob| {
try out.writeAll(v_blob);
switch (v_blob) {
.slice => |s_blob| try out.writeAll(s_blob),
.block => |_| unreachable,
.reader => |_| unreachable,
}
blob = blob[end..];
} else {
if (DEBUG) std.debug.print("[missing var {s}]\n", .{var_name});
@@ -637,7 +603,7 @@ test "directive something" {
};
 
var ctx = Context.init(a);
try ctx.put("Something", "Some Text Here");
try ctx.putSlice("Something", "Some Text Here");
defer ctx.raze();
const page = try t.buildFor(a, ctx);
defer a.free(page);
@@ -741,7 +707,7 @@ test "directive For" {
var blocks: [1]Context = [1]Context{
Context.init(a),
};
try blocks[0].put("Name", "not that");
try blocks[0].putSlice("Name", "not that");
// We have to raze because it will be over written
defer blocks[0].raze();
try ctx.putBlock("Loop", &blocks);
@@ -757,8 +723,8 @@ test "directive For" {
};
// what... 2 is many
 
try many_blocks[0].put("Name", "first");
try many_blocks[1].put("Name", "second");
try many_blocks[0].putSlice("Name", "first");
try many_blocks[1].putSlice("Name", "second");
 
try ctx.putBlock("Loop", &many_blocks);
 
@@ -814,7 +780,7 @@ test "directive For & For" {
Context.init(a),
};
 
try outer[0].put("Name", "Alice");
try outer[0].putSlice("Name", "Alice");
//defer outer[0].raze();
 
var arena = std.heap.ArenaAllocator.init(a);
@@ -827,20 +793,20 @@ test "directive For & For" {
try outer[0].putBlock("Numbers", &alice_inner);
for (0..3) |i| {
alice_inner[i] = Context.init(a);
try alice_inner[i].put(
try alice_inner[i].putSlice(
lput,
try std.fmt.allocPrint(aa, "A{}", .{i}),
);
}
 
try outer[1].put("Name", "Bob");
try outer[1].putSlice("Name", "Bob");
//defer outer[1].raze();
 
var bob_inner: [3]Context = undefined;
try outer[1].putBlock("Numbers", &bob_inner);
for (0..3) |i| {
bob_inner[i] = Context.init(a);
try bob_inner[i].put(
try bob_inner[i].putSlice(
lput,
try std.fmt.allocPrint(aa, "B{}", .{i}),
);
@@ -885,7 +851,7 @@ test "directive With" {
var thing = [1]Context{
Context.init(a),
};
try thing[0].put("Thing", "THING");
try thing[0].putSlice("Thing", "THING");
try ctx.putBlock("Thing", &thing);
 
const expected_thing: []const u8 =
 
src/types/comment.zig added: 142, removed: 149, total 0
@@ -185,8 +185,8 @@ pub fn builder(self: Comment) Template.Context.Builder(Comment) {
}
 
pub fn contextBuilder(self: Comment, a: Allocator, ctx: *Template.Context) !void {
try ctx.put("Author", try Bleach.sanitizeAlloc(a, self.author, .{}));
try ctx.put("Message", try Bleach.sanitizeAlloc(a, self.message, .{}));
try ctx.putSlice("Author", try Bleach.sanitizeAlloc(a, self.author, .{}));
try ctx.putSlice("Message", try Bleach.sanitizeAlloc(a, self.message, .{}));
try ctx.putSlice("Date", try allocPrint(a, "{}", .{Humanize.unix(self.updated)}));
}
 
 
src/types/delta.zig added: 142, removed: 149, total 0
@@ -183,11 +183,11 @@ pub fn builder(self: Delta) Template.Context.Builder(Delta) {
}
 
pub fn contextBuilder(self: Delta, a: Allocator, ctx: *Template.Context) !void {
try ctx.put("Title", try Bleach.sanitizeAlloc(a, self.title, .{}));
try ctx.put("Desc", try Bleach.sanitizeAlloc(a, self.message, .{}));
try ctx.putSlice("Title", try Bleach.sanitizeAlloc(a, self.title, .{}));
try ctx.putSlice("Desc", try Bleach.sanitizeAlloc(a, self.message, .{}));
 
try ctx.put("Index", try std.fmt.allocPrint(a, "0x{x}", .{self.index}));
try ctx.put("Title_uri", try std.fmt.allocPrint(a, "/repo/{s}/{s}/{x}", .{
try ctx.putSlice("Index", try std.fmt.allocPrint(a, "0x{x}", .{self.index}));
try ctx.putSlice("Title_uri", try std.fmt.allocPrint(a, "/repo/{s}/{s}/{x}", .{
self.repo,
if (self.attach == .issue) "issues" else "diffs",
self.index,