--- a/handlers/render.lua Fri Jan 24 13:28:19 2025 +0100 +++ b/handlers/render.lua Mon Mar 31 16:19:08 2025 -0500 @@ -1,18 +1,17 @@ - --@module handlers.render -local handlers_render={} +local handlers_render = {} -local ltp=require('ltp.template') -local markdown=require('markdown') -local config=require('config') -local path=require('mypath') -local filecache=require('filecache') -local log=require('log') -local dependency=require('dependency') -local pandoc=require('pandoc') -local markdown_it=require('markdown_it') -local err=require('err') +local ltp = require('ltp.template') +local markdown = require('markdown') +local config = require('config') +local path = require('mypath') +local filecache = require('filecache') +local log = require('log') +local dependency = require('dependency') +local pandoc = require('pandoc') +local markdown_it = require('markdown_it') +local err = require('err') -- -- Phase 1: load & markup @@ -22,82 +21,92 @@ local f = io.open(path.join(env.paths.src, file), 'r') local data = nil local in_meta = false - local linenum=1 + local linenum = 1 local meta = {} - + for l in f:lines() do - if (linenum==1 or in_meta) and string.match(l, config.meta_marker) then + if (linenum == 1 or in_meta) and string.match(l, config.meta_marker) then in_meta = not in_meta elseif in_meta then local key, val = string.match(l, "%s*([^:]*)%s*:%s*(.*)%s*") if key and val then -- very primitive quoting, primarily as a hack to -- not need converting my files that much from Webgen. - local val_unq=string.match(val, '^"(.*)"$') + local val_unq = string.match(val, '^"(.*)"$') meta[key] = val_unq or val else err.file_pos(file, linenum, "meta data syntax error: " .. l) end else if data then - data = data.."\n"..l + data = data .. "\n" .. l else - data=l + data = l end end - linenum = linenum+1 + linenum = linenum + 1 end - - log.log("Load "..file.."\n") - + + log.log("Load " .. file .. "\n") + f:close() local destination if meta.destination then - destination=path.join(path.dirname(file), meta.destination) + destination = path.join(path.dirname(file), meta.destination) else -- If the file has two extensions, then only remove last extension. -- Otherwise replace extension with .html. - destination=path.rmext(file) - base=path.rmext(destination) - if base==destination then + destination = path.rmext(file) + base = path.rmext(destination) + if base == destination then destination = destination .. ".html" end end - local page={ - data=data, - meta=meta, - destination=destination, - file=file, + local deps = nil + if meta.dependencies then + deps = {} + for s in string.gmatch(meta.dependencies, "[^%s,]+") do + table.insert(deps, s) + end + meta.dependencies = nil + end + + local page = { + data = data, + meta = meta, + destination = destination, + dependencies = deps, + file = file, } - - env.pages[file]=page + + env.pages[file] = page end function handlers_render.process_lua(template, env) - env=table.join(env, {env=env}) -- TODO: should use __index + env = table.join(env, { env = env }) -- TODO: should use __index --return ltp.render(nil, 1, template, env, {}, "<%", "%>", {}) - return ltp.render_template(template, "<%", "%>", - ltp.merge_index(env, _G)) + return ltp.render_template(template, "<%", "%>", + ltp.merge_index(env, _G)) end function handlers_render.env_for(file, env, path_prefix) - local newenv=table.copy(env) - - newenv.source_file=file - newenv.base_url=path.to_root(file) - newenv.path_prefix=(path_prefix or "") - newenv.page=env.pages[file] - + local newenv = table.copy(env) + + newenv.source_file = file + newenv.base_url = path.to_root(file) + newenv.path_prefix = (path_prefix or "") + newenv.page = env.pages[file] + return newenv end function handlers_render.render(file, env, path_prefix, renderer) - local data=env.pages[file].data + local data = env.pages[file].data if data then - local newenv=handlers_render.env_for(file, env, path_prefix) - local data2=handlers_render.process_lua(data, newenv) + local newenv = handlers_render.env_for(file, env, path_prefix) + local data2 = handlers_render.process_lua(data, newenv) meta = env.pages[file].meta if renderer == "markdown-it" then return markdown_it.markdown(data2, env) @@ -114,41 +123,37 @@ end function handlers_render.phase2(file, env) - local page=env.pages[file] + local page = env.pages[file] local src = path.join(env.paths.src, file) local dst = path.join(env.paths.dst, page.destination) local tmpl = path.join(env.paths.tmpl, - page.meta.template or "page.template") + page.meta.template or "page.template") renderer = page.meta.renderer or "markdown-it" - local deps = {src} - - local build=page.meta.always_build + local build = page.meta.always_build if not build then - if page.meta.dependencies then - for p, _ in pairs(env.pages) do - if string.match(p, page.meta.dependencies) then - table.insert(deps, path.join(env.paths.src, p)) - end + local deps = { src, tmpl } + if page.dependencies then + for _, v in ipairs(page.dependencies) do + table.insert(deps, v) end end - table.insert(deps, tmpl) - if renderer=="markdown-it" then + if renderer == "markdown-it" then markdown_it.add_deps(deps, env) end - build=dependency.simple_update_check(dst, deps) + build = dependency.simple_update_check(dst, deps) end - + if build then - log.log("Render "..file.."\n") - local content=handlers_render.render(file, env, page.meta, renderer) - local page_template=filecache.get(tmpl) + log.log("Render " .. file .. "\n") + local content = handlers_render.render(file, env, page.meta, renderer) + local page_template = filecache.get(tmpl) - local newenv=table.join({content=content}, handlers_render.env_for(file, env)) - local data2=handlers_render.process_lua(page_template, newenv) - - log.log("Write "..page.destination.."\n") - local f=io.openX(dst, "w") + local newenv = table.join({ content = content }, handlers_render.env_for(file, env)) + local data2 = handlers_render.process_lua(page_template, newenv) + + log.log("Write " .. page.destination .. "\n") + local f = io.openX(dst, "w") f:write(data2) end end