handlers/render.lua

changeset 46
86950ef7dbcb
parent 42
260f867d46c0
--- 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

mercurial