login

<     >

2022-12-19 09:37:11 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

template: add % include

diff --git a/src/template.lua b/src/template.lua
index 70d0f58..a28c087 100644
--- a/src/template.lua
+++ b/src/template.lua
@@ -24,16 +24,17 @@ local function find_matching_end(lines, start, last)
     for line_num = start+1, last do
         local line = lines[line_num]
         if line:sub(1, 1) == "%" then
-            if line:match("%%%s+end") then
+            local keyword = line:match("%%%s*(%w+).*")
+            if keyword == "end" then
                 level = level - 1
                 if level == 0 then
                     return line_num, else_line
                 end
-            elseif line:match("%%%s+else") then
+            elseif keyword == "else" then
                 if level == 1 then
                     else_line = line_num
                 end
-            elseif line:match("%%%s+set") == nil then
+            elseif keyword ~= "set" and keyword ~= "include" then
                 level = level + 1
             end
         end
@@ -53,6 +54,17 @@ local function render_block(lines, first, last, env)
             assert(var and expr)
             env[var] = eval(expr, env)
             line_num = line_num + 1
+        elseif line:match("%%%s*(%w+).*") == "include" then
+            local fname = line:match("%%%s*include%s+(.+)")
+            local str = io.input(fname):read("*a")
+            assert(str:sub(#str) == "\n")
+            local inc_lines = {}
+            for inc_line in str:gmatch("(.-)\r?\n") do
+                inc_line = inc_line:gsub("^%s*%%", "%%")
+                table.insert(inc_lines, inc_line)
+            end
+            result = result .. render_block(inc_lines, 1, #inc_lines, env)
+            line_num = line_num + 1
         elseif line:sub(1, 1) == "%" then   -- block start
             local block_type = line:match("%%%s*(%w+).*")
             local block_end, else_line = find_matching_end(lines, line_num, last)