diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js
index b045832..b9622ef 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js
+++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js
@@ -29,29 +29,32 @@ function addFt8Message(msg) {
}
function renderFt8Message(message) {
- const parts = message.split(/(\\s+)/);
- return parts.map((part) => {
- if (/^\\s+$/.test(part)) return part;
- const m = part.match(/^([^A-Za-z0-9]*)([A-Za-z0-9]+)([^A-Za-z0-9]*)$/);
- if (!m) return escapeHtml(part);
- const [, lead, core, tail] = m;
- const grid = core.toUpperCase();
- if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) {
- return `${escapeHtml(lead)}[${grid}]${escapeHtml(tail)}`;
- }
- return escapeHtml(part);
- }).join("");
+ const gridRegex = /[A-R]{2}\\d{2}(?:[A-X]{2})?/gi;
+ let out = "";
+ let lastIdx = 0;
+ for (const match of message.matchAll(gridRegex)) {
+ const idx = match.index ?? 0;
+ const grid = match[0].toUpperCase();
+ const prev = idx > 0 ? message[idx - 1] : "";
+ const next = idx + grid.length < message.length ? message[idx + grid.length] : "";
+ if (isAlphaNum(prev) || isAlphaNum(next)) continue;
+ out += escapeHtml(message.slice(lastIdx, idx));
+ out += `[${grid}]`;
+ lastIdx = idx + grid.length;
+ }
+ out += escapeHtml(message.slice(lastIdx));
+ return out;
}
function extractFirstGrid(message) {
- const parts = message.split(/\\s+/);
- for (const part of parts) {
- const m = part.match(/[A-Za-z0-9]+/);
- if (!m) continue;
- const grid = m[0].toUpperCase();
- if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) {
- return grid;
- }
+ const gridRegex = /[A-R]{2}\\d{2}(?:[A-X]{2})?/gi;
+ for (const match of message.matchAll(gridRegex)) {
+ const idx = match.index ?? 0;
+ const grid = match[0].toUpperCase();
+ const prev = idx > 0 ? message[idx - 1] : "";
+ const next = idx + grid.length < message.length ? message[idx + grid.length] : "";
+ if (isAlphaNum(prev) || isAlphaNum(next)) continue;
+ return grid;
}
return null;
}
@@ -64,6 +67,10 @@ function escapeHtml(input) {
.replaceAll("\"", """);
}
+function isAlphaNum(ch) {
+ return /[A-Za-z0-9]/.test(ch);
+}
+
document.getElementById("ft8-decode-toggle-btn").addEventListener("click", async () => {
try { await postPath("/toggle_ft8_decode"); } catch (e) { console.error("FT8 toggle failed", e); }
});