From 06dbdee019256ec52fce87d0bac4ffcda09fa392 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sun, 28 Jun 2026 17:17:50 +0100 Subject: Nick colors on client in JS --- pages/log.js | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ pages/log.mustache | 3 +- src/Main.hs | 1 + 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 pages/log.js diff --git a/pages/log.js b/pages/log.js new file mode 100644 index 0000000..b7fe9e3 --- /dev/null +++ b/pages/log.js @@ -0,0 +1,94 @@ +"use strict"; + +var colorTableLight = [ + // Tomorrow theme (light) (ish) + "#4d4d4c", // Foreground + "#c82829", // Red + "#cb6b01", // Orange (darker) + "#2d981a", // Green(ish) + "#3e999f", // Aqua + "#4271ae", // Blue + "#8959a8", // Purple + // Solarized theme + "#002b36", // Base03 + "#586e75", // Base01 + "#657b83", // Base00 + "#839496", // Base0 + "#b58900", // Yellow + "#cb4b16", // Orange + "#dc322f", // Red + "#d33682", // Magenta + "#6c71c4", // Violet + "#268bd2", // Blue + "#2aa198", // Cyan + "#859900", // Green +]; + +var colorTableDark = [ + // Tomorrow theme (dark) + "#c5c8c6", // Foreground + "#969896", // Comment + "#cc6666", // Red + "#de935f", // Orange + "#f0c674", // Yellow + "#b5bd68", // Green + "#8abeb7", // Aqua + "#81a2be", // Blue + "#b294bb", // Purple + // Solarized theme + "#fdf6e3", // Base3 + "#eee8d5", // Base2 + "#93a1a1", // Base1 + "#839496", // Base0 + "#b58900", // Yellow + "#cb4b16", // Orange + "#dc322f", // Red + "#d33682", // Magenta + "#6c71c4", // Violet + "#268bd2", // Blue + "#2aa198", // Cyan + "#859900", // Green +]; + +// weechat's gui_nick_hash_djb2_32 +function nickhash(nick) { + var h = 0; + for (var i = 0; i < nick.length; i++) + h ^= (h << 5) + (h >> 2) + nick.charCodeAt(i); + return h; +} + +function renderNickColors(dark) { + var table = dark ? colorTableDark : colorTableLight; + var n = table.length; + + var spans = document.querySelectorAll("table#events span.nick"); + for (var i = 0; i < spans.length; i++) { + var el = spans[i]; + var text = el.innerText; + var h = nickhash(el.innerText); + el.setAttribute("style", "color: " + table[h % n]); + } +} + +window.addEventListener("load", function() { + var querystr = "(prefers-color-scheme: dark)"; + if (!("matchMedia" in window)) { + renderNickColors(false); + return; + } + + var queryList = window.matchMedia(querystr); + renderNickColors(queryList.matches); + + // Apparently older Safari doesn't have addEventListener here yet + if ("addEventListener" in queryList) { + queryList.addEventListener("change", function(ql) { + renderNickColors(ql.matches); + }); + } else if ("addListener" in queryList) { + queryList.addListener(function() { + renderNickColors(window.matchMedia(querystr).matches); + }); + } +}); diff --git a/pages/log.mustache b/pages/log.mustache index 23eccc6..10a99cf 100644 --- a/pages/log.mustache +++ b/pages/log.mustache @@ -5,6 +5,7 @@ {{channel}} ({{network}}) - tirclogv + @@ -56,7 +57,7 @@ {{#events}} {{&datetime}} - {{#nickwrap1}}{{&.}}{{/nickwrap1}}{{nick}}{{#nickwrap2}}{{&.}}{{/nickwrap2}} + {{#nickwrap1}}{{&.}}{{/nickwrap1}}{{nick}}{{#nickwrap2}}{{&.}}{{/nickwrap2}} {{message}} {{/events}} diff --git a/src/Main.hs b/src/Main.hs index c7bc648..d3abecc 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -288,6 +288,7 @@ mainServe confpath = do let staticFiles = [("style.css", "text/css") + ,("log.js", "text/javascript") ,("robots.txt", "text/plain") ,("favicon.png", "image/png")] -- cgit v1.3.1