diff --git a/src/template/lib.zig b/src/template/lib.zig index 68ee360..ec9f130 100644 --- a/src/template/lib.zig +++ b/src/template/lib.zig @@ -128,6 +128,7 @@ const TemplateType = enum { root, for_block, if_block, + if_else_block, }; const TemplateParseResult = struct { @@ -166,6 +167,12 @@ fn parseTemplate( .if_header => |header| { if (i != tokens.len - 1 and tokens[i + 1] == .whitespace and cb.strip_after) i += 1; const subtemplate = parseTemplate(tokens, i + 1, .if_block); + i = subtemplate.new_idx; + const else_subtemplate: ?TemplateParseResult = if (subtemplate.closing_block.?.block == .@"else") + parseTemplate(tokens, i + 1, .if_else_block) + else + null; + if (else_subtemplate) |sub| i = sub.new_idx; items = items ++ [_]TemplateItem{.{ .statement = .{ .@"if" = .{ @@ -174,7 +181,6 @@ fn parseTemplate( }, }, }}; - i = subtemplate.new_idx; }, .for_header => |header| { if (i != tokens.len - 1 and tokens[i + 1] == .whitespace and cb.strip_after) i += 1; @@ -193,10 +199,14 @@ fn parseTemplate( break cb else @compileError("Unexpected /for tag"), - .end_if => if (template_type == .if_block) + .end_if => if (template_type == .if_block or template_type == .if_else_block) break cb else @compileError("Unexpected /if tag"), + .@"else" => if (template_type == .if_block) + break cb + else + @compileError("Unexpected #else tag"), } if (i != tokens.len - 1 and tokens[i] == .control_block) { @@ -323,6 +333,7 @@ fn parseControlBlock(comptime tokens: ControlTokenIter) ParseResult(ControlToken iter = result.new_iter; break .{ .if_header = result.item }; }, + .@"else" => break .{ .@"else" = {} }, //else => @compileError("TODO"), } @@ -524,6 +535,7 @@ const ControlBlock = struct { end_for: void, if_header: IfHeader, end_if: void, + @"else": void, }; block: Data, strip_before: bool, @@ -533,6 +545,7 @@ const ControlBlock = struct { const Keyword = enum { @"for", @"if", + @"else", }; const EndKeyword = enum { diff --git a/src/template/test.tmp.html b/src/template/test.tmp.html index 772be18..56e41a5 100644 --- a/src/template/test.tmp.html +++ b/src/template/test.tmp.html @@ -14,7 +14,8 @@ {$b}: {= /for =} {= /for} - {#if .qux}qux!{#elif .quxx}quxx!{/if=} + {#if .qux}qux!{#else}!qux!{/if=} + {#if .quxx}quxx!{#else}!quxx!{/if}