#!/usr/bin/env lua local pretty = require"pl.pretty" local dir = require"pl.dir" local gumbo = require"gumbo" local function parse (stamp) local year, month, day, hour, min, sec = stamp:match"(%d+)-(%d?%d)-(%d?%d)T(%d?%d):(%d?%d):(%d?%d)" return { year = tonumber(year), month = tonumber(month), day = tonumber(day), hour = tonumber(hour), min = tonumber(min), sec = tonumber(sec), } end local function describe (date) -- strftime(3) still does not support printing day of month without leading zero or space. return string.format("%d %s", date.day, os.date("%B", os.time(date))) end local pages = dir.getfiles(".", "*.html") local takeaways = { ["published-on"] = "published", ["last-modified-on"] = "modified", } local excludes = { ["index.html"] = true, ["graveyard_of_the_drawings.html"] = true, ["plop.html"] = true, } local posts = {} for _, filename in pairs(pages) do local document = gumbo.parseFile(filename) local metas = document:getElementsByTagName"meta" local properties = {title=document.title, filename=filename:sub(3), published=""} for _, meta in ipairs(metas) do local take = nil for _, attribute in ipairs(meta.attributes) do if attribute.name == "name" then take = takeaways[attribute.value] end if take and attribute.name == "content" then properties[take] = attribute.value end end end if properties.filename:match"^[^_]" and not excludes[properties.filename] then table.insert(posts, properties) end end table.sort(posts, function (lhs, rhs) return lhs.published > rhs.published end) print[[]] local year = nil for _, page in pairs(posts) do local date = parse(page.published) if date and year ~= date.year then year = date.year print(string.format("
%d", year)) end print(string.format([[
%s%s]], describe(date), page.filename, page.title)) end print"
"