aboutsummaryrefslogtreecommitdiff
path: root/falseknees-atom.lua
diff options
context:
space:
mode:
Diffstat (limited to 'falseknees-atom.lua')
-rwxr-xr-xfalseknees-atom.lua120
1 files changed, 120 insertions, 0 deletions
diff --git a/falseknees-atom.lua b/falseknees-atom.lua
new file mode 100755
index 0000000..584617c
--- /dev/null
+++ b/falseknees-atom.lua
@@ -0,0 +1,120 @@
+#!/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, "<", "&lt;")
+ text = string.gsub(text, ">", "&gt;")
+ text = string.gsub(text, '"', "&quot;")
+ text = string.gsub(text, "'", "&apos;")
+ 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, '<meta%s+http%-equiv="refresh"%s+content="%d+;%s*URL=([^"]+)"%s*/?>')
+ return unesc_html(url)
+end
+
+local pagesrc = must_get_page("https://falseknees.com/archive.html")
+
+local maxdate
+local entries = {}
+
+local PATTERN = '<a href="([^"]+)">(%w+) (%d+)%w+, (%d+)%s*%-%s*([^<>]-)</a>'
+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([[<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>False Knees</title>
+ <link href="http://example.org/" />
+ <id>%s</id>
+ <author><name>Joshua Barkman</name></author>
+ <updated>%s</updated>]], xmlesc(FEED_ID), xmlesc(maxdate)))
+
+for _, entry in ipairs(entries) do
+ print(string.format([[
+ <entry>
+ <title>%s</title>
+ <link rel="alternate" type="text/html" href="%s" />
+ <id>%s</id>
+ <updated>%s</updated>
+ </entry>
+ ]], xmlesc(entry.title), xmlesc(entry.url), xmlesc(FEED_ID .. "#" .. entry.url), xmlesc(entry.date)))
+end
+
+print("</feed>")