summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2026-06-28 18:17:50 +0200
committerTom Smeding <tom@tomsmeding.com>2026-06-28 18:19:58 +0200
commit06dbdee019256ec52fce87d0bac4ffcda09fa392 (patch)
tree72225f9d68d2319427fe189b0e8dfbf02bc8004e
parent5299662f7dacdb636df009aefdc8a7d52d5faf8e (diff)
Nick colors on client in JS
-rw-r--r--pages/log.js94
-rw-r--r--pages/log.mustache3
-rw-r--r--src/Main.hs1
3 files changed, 97 insertions, 1 deletions
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 @@
<title>{{channel}} ({{network}}) - tirclogv</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/style.css">
+ <script src="/log.js"></script>
<link rel="icon" type="image/png" href="/favicon.png">
</head>
<body>
@@ -56,7 +57,7 @@
{{#events}}
<tr{{#classlist}} class="{{&.}}"{{/classlist}}>
<td><a href="/log/{{&alias}}?eid={{&linkid}}#ev-{{&linkid}}" name="ev-{{&linkid}}">{{&datetime}}</a></td>
- <td>{{#nickwrap1}}<span class="nickwrap">{{&.}}</span>{{/nickwrap1}}{{nick}}{{#nickwrap2}}<span class="nickwrap">{{&.}}</span>{{/nickwrap2}}</td>
+ <td>{{#nickwrap1}}<span class="nickwrap">{{&.}}</span>{{/nickwrap1}}<span class="nick">{{nick}}</span>{{#nickwrap2}}<span class="nickwrap">{{&.}}</span>{{/nickwrap2}}</td>
<td>{{message}}</td>
</tr>
{{/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")]