#!/usr/bin/env lua local config = require"pl.config" local dir = require"pl.dir" local gumbo = require"gumbo" local tablex = require"pl.tablex" 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 config = config.read(arg[1] or "huh.conf") or {} config.excludes = tablex.makeset(config.excludes or {}) local function matches (str) if config.pattern then return str:match(config.pattern) end return str end local pages = dir.getfiles(".", "*.html") local takeaways = { ["published-on"] = "published", ["last-modified-on"] = "modified", } 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 matches(properties.filename) and not config.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 local previous = nil for _, page in pairs(posts) do local date = parse(page.published) if date and year ~= date.year then year = date.year previous = nil print(string.format("
%d", year)) end date = describe(date) if date == previous then date = "" else previous = date end print(string.format([[
%s%s]], date, page.filename, page.title)) end print"
"