From 56cea0dde53544380c8eb48357000b9a272ffbb1 Mon Sep 17 00:00:00 2001 From: Aki Date: Wed, 28 Aug 2024 21:59:30 +0200 Subject: Implemented a very specific generate-index script for the blog --- generate-index.lua | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 generate-index.lua (limited to 'generate-index.lua') diff --git a/generate-index.lua b/generate-index.lua new file mode 100755 index 0000000..65f7e14 --- /dev/null +++ b/generate-index.lua @@ -0,0 +1,77 @@ +#!/usr/bin/env lua +local pretty = require"pl.pretty" +local dir = require"pl.dir" +local gumbo = require"gumbo" +local months = { + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +} + + +local function parse (stamp) + local year, month, day = stamp:match"(%d+)-(%d?%d)-(%d?%d)T?" + year, month, day = tonumber(year), tonumber(month), tonumber(day) + if not year or not month or not day then + return nil + end + return {year=year, month=month, day=day} +end + + +local function describe (date) + return string.format("%d %s", date.day, months[date.month]) +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("
") -- cgit v1.1