#!/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()