From 27b00a8788aec21df582dcae38a976edb90bb818 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Thu, 5 Aug 2021 03:05:31 -0700 Subject: [PATCH] add single and multi string replacements --- src/astgen.zig | 12 ++++++++++++ src/lib.zig | 14 ++++++++++++++ src/main.zig | 10 +++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/astgen.zig b/src/astgen.zig index 501d0c595c9460d49dd0e70629cf9ecc434ea6d7..8192945ffc49f75cd9a7edb1ec49dc5c44d54c64 100644 --- a/src/astgen.zig +++ b/src/astgen.zig @@ -8,6 +8,7 @@ pub const Value = union(enum) { element: Element, attr: Attr, string: []const u8, + replacement: []const []const u8, }; pub const Element = struct { @@ -103,9 +104,20 @@ const Parser = struct { if (self.tokens[self.index] == .string) { return Value{ .string = self.eat(.string) }; } + if (self.tryEatSymbol("{")) { + return Value{ .replacement = self.doReplacement() }; + } return Value{ .element = self.doElement() }; } + pub fn doReplacement(comptime self: *Parser) []const []const u8 { + var ret: []const []const u8 = &.{}; + while (!self.tryEatSymbol("}")) { + ret = ret ++ &[_][]const u8{self.eat(.word)}; + } + return ret; + } + fn eat(comptime self: *Parser, comptime typ: std.meta.Tag(Token)) []const u8 { defer self.index += 1; return @field(self.tokens[self.index], @tagName(typ)); diff --git a/src/lib.zig b/src/lib.zig index b4cb006111594b0483f572c0dacb98eb72f2d8e2..71df6a402dea5da55a514478994ec19e975ff88d 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -64,6 +64,20 @@ pub fn compile(writer: anytype, comptime value: astgen.Value, data: anytype, ind .string => |v| { try writer.writeAll(v[1 .. v.len - 1]); }, + .replacement => |v| { + const x = @field(data, v[0]); + if (v.len == 1) { + const TO = @TypeOf(x); + + if (comptime std.meta.trait.isZigString(TO)) { + try writer.print("{s}", .{x}); + return; + } + @compileError("pek: compile: unsupported type: " ++ @typeName(TO)); + } else { + try compile(writer, astgen.Value{ .replacement = v[1..] }, x, indent, flag1); + } + }, else => unreachable, } } diff --git a/src/main.zig b/src/main.zig index f91f776d5e547097eeb1cd6073d32e834374ce78..b6f75c68c410c7109495d24593c0ff404a87baf7 100644 --- a/src/main.zig +++ b/src/main.zig @@ -12,6 +12,8 @@ const example_document = \\ h1("Pek Example") \\ hr \\ p("This is an example HTML document written in "a[href="https://github.com/nektro/zig-pek"]("Pek")".") + \\ p("Pek is written by "{author}".") + \\ p("Her favorite plant is the "{favorite flower}) \\ ) \\) ; @@ -21,6 +23,12 @@ pub fn main() !void { std.debug.print("\n", .{}); const doc = comptime pek.parse(example_document); - try pek.compile(std.io.getStdErr().writer(), doc, .{}, 0, false); + const data = .{ + .author = "Meghan D", + .favorite = .{ + .flower = "Sunflower", + }, + }; + try pek.compile(std.io.getStdErr().writer(), doc, data, 0, false); std.debug.print("\n", .{}); } -- 2.54.0