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)