[fix](trx-frontend-http): highlight ft8 grid tokens

Co-authored-by: Codex <codex@openai.com>
Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
2026-02-09 22:06:39 +01:00
parent 44a4c0df24
commit 2b6df0e738
@@ -32,19 +32,20 @@ function renderFt8Message(message) {
const parts = message.split(/(\\s+)/); const parts = message.split(/(\\s+)/);
return parts.map((part) => { return parts.map((part) => {
const token = part.trim(); const token = part.trim();
if (!token) return part; if (!token) return escapeHtml(part);
const grid = token.toUpperCase(); const stripped = token.replace(/[^A-Za-z0-9]/g, "");
const grid = stripped.toUpperCase();
if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) { if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) {
return part.replace(token, `<span class="ft8-locator">[${grid}]</span>`); return part.replace(token, `<span class="ft8-locator">[${grid}]</span>`);
} }
return part; return escapeHtml(part);
}).join(""); }).join("");
} }
function extractFirstGrid(message) { function extractFirstGrid(message) {
const parts = message.split(/\\s+/); const parts = message.split(/\\s+/);
for (const part of parts) { for (const part of parts) {
const grid = part.toUpperCase(); const grid = part.replace(/[^A-Za-z0-9]/g, "").toUpperCase();
if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) { if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) {
return grid; return grid;
} }
@@ -52,6 +53,14 @@ function extractFirstGrid(message) {
return null; return null;
} }
function escapeHtml(input) {
return input
.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll("\"", "&quot;");
}
document.getElementById("ft8-decode-toggle-btn").addEventListener("click", async () => { document.getElementById("ft8-decode-toggle-btn").addEventListener("click", async () => {
try { await postPath("/toggle_ft8_decode"); } catch (e) { console.error("FT8 toggle failed", e); } try { await postPath("/toggle_ft8_decode"); } catch (e) { console.error("FT8 toggle failed", e); }
}); });