me.fier.blog/generate

197 lines
5.3 KiB
Plaintext
Raw Normal View History

2024-06-10 13:48:25 +00:00
#!/usr/bin/env lua
local basepath = (debug.getinfo(1, "S").source:sub(2):match("(.*[/\\])") or "./"):sub(1,-2)
table.unpack = table.unpack or unpack -- Lua 5.1 compat
function main()
local dataPath = arg[1]
local settingPath = p("data","setting")
local settings = {}
settings.blog_name = readSetting(p(dataPath,settingPath,"blog_name.txt"),removeNewline)
settings.index_path = readSetting(p(dataPath,settingPath,"index_path.txt"),removeNewline)
settings.sub_path = readSetting(p(dataPath,settingPath,"sub_path.txt"),removeNewline)
settings.page_html = readSetting(p(dataPath,settingPath,"page.html"),removeNewline)
settings.page_path = readSetting(p(dataPath,settingPath,"page_path.txt"),removeNewline)
settings.post_html = readSetting(p(dataPath,settingPath,"post.html"),removeNewline)
settings.post_path = readSetting(p(dataPath,settingPath,"post_path.txt"),removeNewline)
settings.posts_per_page = readSetting(p(dataPath,settingPath,"posts_per_page.txt"),tonumber)
print("* Settings:")
for i,s in pairs(settings) do
print("** " ..i.. ":\n" ..tostring(s))
end
print("* Reading post entry list ...")
local file = io.open(p(dataPath,settings.post_path,"entries.txt"),"r")
local posts = {}
for line in file:lines() do
table.insert(posts,line)
end
file:close()
table.sort(posts)
tableReverse(posts)
local postnr = settings.posts_per_page
local post_env = nil
local pagenr = 0
local pagef = nil
local page_env = nil
local page = nil
local maxPage = math.ceil(#posts / settings.posts_per_page)
local function dumpPost()
page = applyEnv(settings.page_html,page_env)
pagef:write(page)
pagef:close()
end
print("* Creating pages ...")
for i,s in ipairs(posts) do
-- PAGE
if postnr == settings.posts_per_page then
postnr = 0
pagenr = pagenr + 1
if pagef ~= nil then
dumpPost()
end
print("** Page: " ..tostring(pagenr).. " ...")
page_env = {}
page_env.BLOG = settings.blog_name
page_env.PAGE = tostring(pagenr)
if pagenr > 1 then
page_env.LINK_PREVIOUS = p(settings.sub_path,settings.page_path,tostring(pagenr - 1).. ".html")
else
page_env.LINK_PREVIOUS = p(settings.sub_path,settings.page_path,tostring(pagenr).. ".html")
end
if pagenr >= maxPage then
page_env.LINK_NEXT = p(settings.sub_path,settings.page_path,tostring(pagenr).. ".html")
else
page_env.LINK_NEXT = p(settings.sub_path,settings.page_path,tostring(pagenr + 1).. ".html")
end
page_env.POSTS = ""
pagef = io.open(p(dataPath,settings.page_path,tostring(pagenr).. ".html"),"w")
end
-- POST
print("*** " ..s.. " ...")
local stamp,title = table.unpack(stringSplit(s,"_",1))
stamp = stringSplit(stamp,"-",1)
stamp.date = {}
stamp.date.year = tonumber(string.sub(stamp[1],1,4))
stamp.date.month = tonumber(string.sub(stamp[1],5,6))
stamp.date.day = tonumber(string.sub(stamp[1],7,8))
stamp[1] = nil
stamp.time = {}
stamp.time.hour = tonumber(string.sub(stamp[2],1,2))
stamp.time.minute = tonumber(string.sub(stamp[2],3,4))
stamp[2] = nil
print("**** Title: " ..title)
print("**** Date: " ..tableJoin({stamp.date.year,stamp.date.month,stamp.date.day},"/"))
print("**** Time: " ..tableJoin({stamp.time.hour,stamp.time.minute},":"))
post_env = {}
post_env.TITLE = title
post_env.DATE_YEAR = tostring(stamp.date.year)
post_env.DATE_MONTH = padNumber(stamp.date.month,2)
post_env.DATE_DAY = padNumber(stamp.date.day,2)
post_env.TIME_HOUR = padNumber(stamp.time.hour,2)
post_env.TIME_MINUTE = padNumber(stamp.time.minute,2)
post_env.LINK_RAW = p(settings.sub_path,settings.post_path,s,"content.html")
post_env.POST = readFile(p(dataPath,settings.post_path,s,"content.html"))
page_env.POSTS = page_env.POSTS .. applyEnv(settings.post_html,post_env) .. "\n"
postnr = postnr + 1
end
if pagef ~= nil then dumpPost() end
end
function padNumber(nr,len)
nr = tostring(nr)
local curLen = string.len(nr)
while curLen < len do
nr = "0" .. nr
curLen = curLen + 1
end
return nr
end
function applyEnv(str,env)
for i,v in pairs(env) do
str = string.gsub(str,"%$%$" ..i.. "%$%$",v)
end
return str
end
function readSetting(path,converter)
local data = readFile(path)
if converter == nil or converter == tostring then
return data
end
return converter(data)
end
function readFile(path)
local file = io.open(path,"r")
local data = file:read("*a")
file:close()
return data
end
function tableReverse(tbl)
local start = 1
local stop = #tbl
while start < stop do
tbl[start], tbl[stop] = tbl[stop], tbl[start]
start = start + 1
stop = stop - 1
end
end
function stringSplit(str, sep, limit)
sep = sep or " "
limit = limit or 0
local splits = 0
local sep_escaped = sep:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]","%%%1")
local parts = {}
for part in str:gmatch("([^" .. sep_escaped .. "]+)") do
if limit > 0 and splits > limit then
parts[splits] = parts[splits] .. sep .. part
else
splits = splits + 1
table.insert(parts, part)
end
end
return parts
end
function tableJoin(tbl, sep)
local length = #tbl
if length == 0 then return "" end
local str = tostring(tbl[1])
local index = 2
while index <= length do
str = str .. sep .. tostring(tbl[index])
index = index + 1
end
return str
end
function pathJoin(...)
return tableJoin({...},"/")
end
p = pathJoin
function removeNewline(str)
str = string.gsub(str,"\n","")
str = string.gsub(str,"\r","")
return str
end
main()