#!/usr/bin/lua local string = require "string" local http = require "socket.http" local function must_get_page(url) local data, status = http.request(url) if status ~= 200 then error("Failed getting '" .. url .. "': Got status " .. status .. "\n") end return data end local function xmlesc(text) text = string.gsub(text, "&", "&") text = string.gsub(text, "<", "<") text = string.gsub(text, ">", ">") text = string.gsub(text, '"', """) text = string.gsub(text, "'", "'") return text end local function unesc_html(s) return string.gsub(s, '&([^;]+);', { amp = "&", lt = "<", gt = ">", quot = '"', apos = "'", }) end local months = { January = 1, February = 2, March = 3, April = 4, May = 5, June = 6, July = 7, August = 8, September = 9, October = 10, November = 11, December = 12, } -- Get the permanent URL of the current comic (index.html) local function resolve_index() local indexsrc = must_get_page("https://falseknees.com/index.html") local url = string.match(indexsrc, '') return unesc_html(url) end local pagesrc = must_get_page("https://falseknees.com/archive.html") local maxdate local entries = {} local PATTERN = '(%w+) (%d+)%w+, (%d+)%s*%-%s*([^<>]-)' for url, monthname, day, year, title in string.gmatch(pagesrc, PATTERN) do url = unesc_html(url) monthname = unesc_html(monthname) day = tonumber(unesc_html(day), 10) year = tonumber(unesc_html(year), 10) title = unesc_html(title) if url == "index.html" then url = resolve_index() end if not url then goto continue end url = "https://falseknees.com/" .. url local month = assert(months[monthname], "unknown month") -- We fon't know the time, lets assume midnight at UTC+0 local date = string.format("%04d-%02d-%02dT00:00:00Z", year, month, day) if not maxdate or date > maxdate then maxdate = date end entries[#entries+1] = { url = url, title = title, date = date } ::continue:: end if not maxdate then error("No entry successfully parsed") end -- A UUID URN with a UUID generated by `uuid -r`. local FEED_ID = "urn:uuid:7e86b012-c226-41b3-945e-bab3341c65e9" print(string.format([[ False Knees %s Joshua Barkman %s]], xmlesc(FEED_ID), xmlesc(maxdate))) for _, entry in ipairs(entries) do print(string.format([[ %s %s %s ]], xmlesc(entry.title), xmlesc(entry.url), xmlesc(FEED_ID .. "#" .. entry.url), xmlesc(entry.date))) end print("")