xK/plugins/xC/prime.lua
Přemysl Eric Janouch 50057d5149
Come up with sillier names for the binaries
I'm not entirely sure, but it looks like some people might not like
jokes about the Holocaust.

On a more serious note, the project has become more serious over
the 7 or so years of its existence.
2021-08-06 16:43:59 +02:00

69 lines
2.4 KiB
Lua

--
-- prime.lua: highlight prime numbers in messages
--
-- Copyright (c) 2020, Přemysl Eric Janouch <p@janouch.name>
--
-- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--
local smallest, highlight = 0, "\x1f"
xC.setup_config {
smallest = {
type = "integer",
default = "0",
comment = "smallest number to scan for primality",
on_change = function (v) smallest = math.max (v, 2) end
},
highlight = {
type = "string",
default = "\"\\x1f\"",
comment = "the attribute to use for highlights",
on_change = function (v) highlight = v end
},
}
-- The prime test is actually very fast, so there is no DoS concern
local do_intercolour = function (text)
return tostring (text:gsub ("%f[%w_]%d+", function (n)
if tonumber (n) < smallest then return nil end
for i = 2, n ^ (1 / 2) do if (n % i) == 0 then return nil end end
return highlight .. n .. highlight
end))
end
local do_interlink = function (text)
local rebuilt, last = {""}, 1
for start in text:gmatch ('()\x03') do
table.insert (rebuilt, do_intercolour (text:sub (last, start - 1)))
local sub = text:sub (start + 1)
last = start + (sub:match ('^%d%d?,%d%d?()') or sub:match ('^%d?%d?()'))
table.insert (rebuilt, text:sub (start, last - 1))
end
return table.concat (rebuilt) .. do_intercolour (text:sub (last))
end
local do_message = function (text)
local rebuilt, last = {""}, 1
for run, link, endpos in text:gmatch ('(.-)(%f[%g]https?://%g+)()') do
last = endpos
table.insert (rebuilt, do_interlink (run) .. link)
end
return table.concat (rebuilt) .. do_interlink (text:sub (last))
end
-- XXX: sadly it won't typically highlight primes in our own messages,
-- unless IRCv3 echo-message is on
xC.hook_irc (function (hook, server, line)
local start, message = line:match ("^(.- PRIVMSG .- :)(.*)$")
return message and start .. do_message (message) or line
end)