From 081f5743be61164ebf475191f5f0c0ac683358a5 Mon Sep 17 00:00:00 2001 From: delthas Date: Sun, 2 Oct 2022 16:18:33 +0200 Subject: [PATCH] Fix stripping hex color formatting Hex colors can be set with the same formats as the regular colors: , , or ,. Previously we only supporteed . This patch enables stripping colors for all valid color formats. Co-authored-by: Simon Ser --- lib/ansi.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/ansi.js b/lib/ansi.js index 108af27..86cbbb7 100644 --- a/lib/ansi.js +++ b/lib/ansi.js @@ -10,10 +10,26 @@ const COLOR_HEX = "\x04"; const REVERSE_COLOR = "\x16"; const RESET = "\x0F"; +const HEX_COLOR_LENGTH = 6; + function isDigit(ch) { return ch >= "0" && ch <= "9"; } +function isHexColor(text) { + if (text.length < HEX_COLOR_LENGTH) { + return false; + } + for (let i = 0; i < HEX_COLOR_LENGTH; i++) { + let ch = text[i].toUpperCase(); + let ok = (ch >= "0" && ch <= "9") || (ch >= "A" && ch <= "F"); + if (!ok) { + return false; + } + } + return true; +} + export function strip(text) { let out = ""; for (let i = 0; i < text.length; i++) { @@ -43,7 +59,13 @@ export function strip(text) { } break; case COLOR_HEX: - i += 6; + if (!isHexColor(text.slice(i + 1))) { + break; + } + i += HEX_COLOR_LENGTH; + if (text[i + 1] == "," && isHexColor(text.slice(i + 2))) { + i += 1 + HEX_COLOR_LENGTH; + } break; default: out += ch;