-- cgit email-filter that shows a Libravatar icon next to author names. Use it -- with the email-filter or repo.email-filter setting and the lua: prefix. -- -- email-filter=lua:/path/to/email-libravatar.lua -- -- SUPPORTED LUA -- -- Lua 5.1, 5.2, 5.3, 5.4 and LuaJIT. Lua 5.5 is not supported, because luaossl -- has no 5.5 build. -- -- DEPENDENCY -- -- luaossl OpenSSL binding, provides openssl.digest -- -- -- # Debian and Ubuntu -- sudo apt install luarocks libssl-dev -- sudo luarocks --lua-version 5.1 install luaossl -- -- # Fedora -- sudo dnf install luarocks openssl-devel -- sudo luarocks --lua-version 5.1 install luaossl -- -- # macOS with Homebrew -- brew install luarocks openssl -- luarocks install luaossl OPENSSL_DIR="$(brew --prefix openssl)" -- -- PRIVACY -- -- Every page view sends the visitor's IP address and a hash of each -- committer's email to a third-party service. Leave this filter off if that is -- not acceptable for your instance. -- -- The secure CDN is always used, so the icon loads over https and is never -- blocked as mixed content. Addresses are hashed with MD5. local digest = require("openssl.digest") -- Pixel size of the avatar. local avatar_size = 13 -- Fallback style for an address with no avatar. See the Libravatar docs for -- the choices, for example retro, identicon, monsterid or mm. local default_image = "retro" -- Avatar endpoint. The secure CDN is used so the image loads over https. local base_url = "https://seccdn.libravatar.org/avatar/" -- Text for the image alt attribute. local alt_text = "Libravatar" -- State shared across the open, write and close calls of one invocation. local buffer = "" local avatar = nil local function hash_hex(input) local b = digest.new("md5"):final(input) local x = "" for i = 1, #b do x = x .. string.format("%.2x", string.byte(b, i)) end return x end -- Take the address, strip the angle brackets if present, then trim and -- lowercase as the avatar services expect. Returns nil for a missing or empty -- address. local function normalize_email(email) if email == nil then return nil end local inner = email:match("<(.*)>") if inner ~= nil then email = inner end email = (email:gsub("^%s*(.-)%s*$", "%1")):lower() if email == "" then return nil end return email end function filter_open(email, page) buffer = "" local addr = normalize_email(email) if addr == nil then avatar = nil else avatar = hash_hex(addr) end end function filter_close() if avatar == nil then -- No usable address, render the name without an icon. html(buffer) else html("" .. alt_text .. " " .. buffer) end return 0 end function filter_write(str) buffer = buffer .. str end