aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2020-10-11 16:54:15 +0200
committerPřemysl Eric Janouch <p@janouch.name>2020-10-11 16:54:15 +0200
commit7ce161502115412f8d88bf4b77738a022ae61479 (patch)
tree782c52ad6162a033374f5dd98aff0bd1ac954098
parent270d9017e9dec35ed82b7f4bc6fb40b814e8b339 (diff)
downloadxK-7ce161502115412f8d88bf4b77738a022ae61479.tar.gz
xK-7ce161502115412f8d88bf4b77738a022ae61479.tar.xz
xK-7ce161502115412f8d88bf4b77738a022ae61479.zip
prime.lua: skip colour sequences, add config
Colour sequence skipping is somewhat involved, we might want to add a helper generator to the "degesch" Lua library, in the form of {substring, is_formatting}. formatter_parse_mirc() isn't useful, a pure Lua implementation would be more appropriate (where do we put that?)
-rw-r--r--plugins/degesch/prime.lua50
1 files changed, 34 insertions, 16 deletions
diff --git a/plugins/degesch/prime.lua b/plugins/degesch/prime.lua
index bffc0e1..420124f 100644
--- a/plugins/degesch/prime.lua
+++ b/plugins/degesch/prime.lua
@@ -15,36 +15,54 @@
-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--
+local smallest, highlight = 0, "\x1f"
+degesch.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 is_prime = function (n)
- if tonumber (n) < 2 then return false end
- for i = 2, n ^ (1 / 2) do if (n % i) == 0 then return false end end
- return true
+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 (run)
- -- Let's not cripple formatting, colours especially
- -- TODO: we can just employ the same approach as in do_text and skip over
- if run:find ('%c') then return run end
-
- return run:gsub ("%f[%w_]%d+%f[^%w_]", function (number)
- if is_prime (number) then return "\x1f" .. number .. "\x1f" end
- return number
- 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_text = function (text)
+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))
+ 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
degesch.hook_irc (function (hook, server, line)
local start, message = line:match ("^(.- PRIVMSG .- :)(.*)$")
- return message and start .. do_text (message) or line
+ return message and start .. do_message (message) or line
end)