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
|
2024-06-11 07:36:56 +00:00
|
|
|
str = stringReplace(str,"$$" ..i.. "$$",v)
|
2024-06-10 13:48:25 +00:00
|
|
|
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)
|
2024-06-11 07:36:56 +00:00
|
|
|
str = stringReplace(str,"\n","")
|
|
|
|
str = stringReplace(str,"\r","")
|
2024-06-10 13:48:25 +00:00
|
|
|
return str
|
|
|
|
end
|
|
|
|
|
2024-06-11 07:36:56 +00:00
|
|
|
function stringReplace(originalString, pattern, replacement)
|
|
|
|
local result = ""
|
|
|
|
local patternLength = #pattern
|
|
|
|
local startIdx = 1
|
|
|
|
local foundIdx = originalString:find(pattern, startIdx, true)
|
|
|
|
|
|
|
|
while foundIdx do
|
|
|
|
result = result .. originalString:sub(startIdx, foundIdx - 1) .. replacement
|
|
|
|
startIdx = foundIdx + patternLength
|
|
|
|
foundIdx = originalString:find(pattern, startIdx, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
result = result .. originalString:sub(startIdx)
|
|
|
|
|
|
|
|
return result
|
|
|
|
end
|
|
|
|
|
2024-06-10 13:48:25 +00:00
|
|
|
main()
|
|
|
|
|