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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
local has_digest, digest = pcall(require, "openssl.digest")
local avatar_size = 13
local default_image = "retro"
local base_url = "https://seccdn.libravatar.org/avatar/"
local buffer = ""
local avatar_hash = nil
local function hash_hex(input)
local raw = digest.new("sha256"):final(input)
local hex = ""
for i = 1, #raw do
hex = hex .. string.format("%.2x", string.byte(raw, i))
end
return hex
end
local function trim(text)
local first = text:find("%S")
if first == nil then
return ""
end
local last = #text
while text:find("^%s", last) do
last = last - 1
end
return text:sub(first, last)
end
local function normalize_email(email)
if email == nil then
return nil
end
local open = email:find("<", 1, true)
local close = email:find(">[^>]*$")
if open and close and close > open then
email = email:sub(open + 1, close - 1)
end
email = trim(email):lower()
if email == "" then
return nil
end
return email
end
function filter_open(email, page)
buffer = ""
local address = normalize_email(email)
if address == nil or not has_digest then
avatar_hash = nil
else
avatar_hash = hash_hex(address)
end
end
function filter_write(text)
buffer = buffer .. text
end
local function avatar_url(size)
return base_url .. avatar_hash .. "?s=" .. size .. "&d=" .. default_image
end
function filter_close()
if avatar_hash == nil then
html(buffer)
else
html("<img src='" .. avatar_url(avatar_size) ..
"' srcset='" .. avatar_url(avatar_size * 2) .. " 2x" ..
"' alt='' width='" .. avatar_size ..
"' height='" .. avatar_size ..
"' loading='lazy' decoding='async'> " .. buffer)
end
return 0
end
|