99 lines
2.2 KiB
Lua
99 lines
2.2 KiB
Lua
local fun = require 'fun'
|
|
local json = require 'cjson'
|
|
local restia = require 'restia'
|
|
local scaffold = require 'scaffold'
|
|
local shapeshift = require 'shapeshift'
|
|
|
|
-- Project-specific stuff
|
|
local rss = require 'feed.rss'
|
|
local atom = require 'feed.atom'
|
|
local paramparser = require 'paramparser'
|
|
local params = paramparser(...)
|
|
package.loaded.params = params
|
|
local pages = require 'pages'
|
|
local templates = require 'templates'
|
|
local posts = require 'posts'
|
|
|
|
local output_tree = {}
|
|
|
|
for name, content in pairs(scaffold.readdir("static")) do
|
|
scaffold.deep(output_tree, name, content)
|
|
end
|
|
|
|
local function is_image(name)
|
|
if name:downcase():match("^.jpg$") then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
local function render(name, data)
|
|
return templates.main(templates[name], data)
|
|
end
|
|
|
|
local function page(name, data)
|
|
return templates.main(pages[name], data)
|
|
end
|
|
|
|
-- Render Posts
|
|
for _, post in ipairs(posts) do
|
|
local body = tostring(render("post", post))
|
|
|
|
scaffold.deep(output_tree, post.path, body)
|
|
end
|
|
|
|
scaffold.deep(output_tree, "feeds/all.rss.xml", rss(posts))
|
|
scaffold.deep(output_tree, "feeds/all.atom.xml", atom(posts))
|
|
|
|
if params.delete then
|
|
restia.utils.delete(params.output)
|
|
end
|
|
|
|
do -- Copy blog images
|
|
local function iter_files(tree, callback)
|
|
if getmetatable(tree) == scaffold.lazy then
|
|
callback(tree)
|
|
else
|
|
for _, node in pairs(tree) do
|
|
iter_files(node, callback)
|
|
end
|
|
end
|
|
end
|
|
|
|
iter_files(scaffold.readdir("posts", {files = "lazy"}), function(file)
|
|
local name = file.path:match("[^/]+$")
|
|
if name:find(".jpg$") or name:find(".svg$") then
|
|
local path = "/images/" .. name
|
|
scaffold.deep(output_tree, path, file)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function transform(tab)
|
|
return function(data)
|
|
local success, result = shapeshift.table(tab, "keep")(data)
|
|
return result
|
|
end
|
|
end
|
|
|
|
local function drop() return true, nil end
|
|
|
|
-- Generate Post Metadata
|
|
output_tree["posts.json"] = json.encode(
|
|
fun
|
|
.iter(posts)
|
|
:map(transform {
|
|
body = drop;
|
|
head = shapeshift.table({ file = drop }, 'keep');
|
|
})
|
|
:totable()
|
|
)
|
|
|
|
output_tree["index.html"] = tostring(page("index", output_tree["posts.json"]))
|
|
|
|
if params.cname then
|
|
output_tree.CNAME = params.cname
|
|
end
|
|
|
|
scaffold.builddir(params.output, output_tree)
|