1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#!/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[[<table class="index">]]
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("<tr><td><b>%d</b><td><td>", year))
end
date = describe(date)
if date == previous then
date = ""
else
previous = date
end
print(string.format([[<tr><td>%s<td class="sep">•<td><a href="%s">%s</a>]], date, page.filename, page.title))
end
print"</table>"
|