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 2ef37f7..b045832 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
@@ -31,12 +31,13 @@ function addFt8Message(msg) {
function renderFt8Message(message) {
const parts = message.split(/(\\s+)/);
return parts.map((part) => {
- const token = part.trim();
- if (!token) return escapeHtml(part);
- const stripped = token.replace(/[^A-Za-z0-9]/g, "");
- const grid = stripped.toUpperCase();
+ 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 part.replace(token, `[${grid}]`);
+ return `${escapeHtml(lead)}[${grid}]${escapeHtml(tail)}`;
}
return escapeHtml(part);
}).join("");
@@ -45,7 +46,9 @@ function renderFt8Message(message) {
function extractFirstGrid(message) {
const parts = message.split(/\\s+/);
for (const part of parts) {
- const grid = part.replace(/[^A-Za-z0-9]/g, "").toUpperCase();
+ 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;
}