From 0bda70bac32345e69fe4505cd07a74d66d0a9757 Mon Sep 17 00:00:00 2001 From: Louis-Ladd Date: Sun, 7 Dec 2025 16:35:48 -0700 Subject: [PATCH 1/6] Add RemoveANSIEscapeCodes operation --- src/core/operations/RemoveANSIEscapeCodes.mjs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/core/operations/RemoveANSIEscapeCodes.mjs diff --git a/src/core/operations/RemoveANSIEscapeCodes.mjs b/src/core/operations/RemoveANSIEscapeCodes.mjs new file mode 100644 index 0000000000..cfeae4b86b --- /dev/null +++ b/src/core/operations/RemoveANSIEscapeCodes.mjs @@ -0,0 +1,41 @@ +/** + * @author Louis-Ladd [lewisharshman1@gmail.com] + * @copyright Crown Copyright 2025 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import OperationError from "../errors/OperationError.mjs"; + +/** + * Remove ANSI Escape Codes operation + */ +class RemoveANSIEscapeCodes extends Operation { + + /** + * RemoveANSIEscapeCodes constructor + */ + constructor() { + super(); + + this.name = "Remove ANSI Escape Codes"; + this.module = "Default"; + this.description = "Removes ANSI Escape Codes."; + this.infoURL = "https://en.wikipedia.org/wiki/ANSI_escape_code"; + this.inputType = "string"; + this.outputType = "string"; + this.args = []; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run(input, args) { + throw new OperationError("Test"); + } + +} + +export default RemoveANSIEscapeCodes; From dbce8020f136cc00fe72b9c39461e30f66b7c036 Mon Sep 17 00:00:00 2001 From: Louis-Ladd Date: Sun, 7 Dec 2025 22:32:45 -0700 Subject: [PATCH 2/6] implement naive regex for stripping ANSI escape codes --- src/core/operations/RemoveANSIEscapeCodes.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/operations/RemoveANSIEscapeCodes.mjs b/src/core/operations/RemoveANSIEscapeCodes.mjs index cfeae4b86b..dbaeb706fe 100644 --- a/src/core/operations/RemoveANSIEscapeCodes.mjs +++ b/src/core/operations/RemoveANSIEscapeCodes.mjs @@ -5,7 +5,6 @@ */ import Operation from "../Operation.mjs"; -import OperationError from "../errors/OperationError.mjs"; /** * Remove ANSI Escape Codes operation @@ -33,7 +32,8 @@ class RemoveANSIEscapeCodes extends Operation { * @returns {string} */ run(input, args) { - throw new OperationError("Test"); + const ansiRegex = /(?:\x1B|\\x1b|\\033|\\u001b)\[[0-?]*[ -/]*[@-~]/g; + return input.replace(ansiRegex, ""); } } From 7f13081bfb7cb2b4ea5caedabbf01ffebbb49b5e Mon Sep 17 00:00:00 2001 From: Louis-Ladd Date: Sun, 7 Dec 2025 22:35:49 -0700 Subject: [PATCH 3/6] Add Remove ANSI Escape Codes to categories --- src/core/config/Categories.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index 434c8bb619..1671c0133e 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -291,6 +291,7 @@ "Diff", "Remove whitespace", "Remove null bytes", + "Remove ANSI Escape Codes", "To Upper case", "To Lower case", "Swap case", From d1d451a79c3170763658fcf12db978d72c7e6b29 Mon Sep 17 00:00:00 2001 From: Louis-Ladd Date: Sun, 4 Jan 2026 17:33:28 -0700 Subject: [PATCH 4/6] Add Remove ANSI Escape Codes test file --- tests/operations/tests/RemoveANSIEscapeCodes.mjs | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tests/operations/tests/RemoveANSIEscapeCodes.mjs diff --git a/tests/operations/tests/RemoveANSIEscapeCodes.mjs b/tests/operations/tests/RemoveANSIEscapeCodes.mjs new file mode 100644 index 0000000000..0b55dc2a8d --- /dev/null +++ b/tests/operations/tests/RemoveANSIEscapeCodes.mjs @@ -0,0 +1,6 @@ +/** + * @author Louis-Ladd [lewisharshman1@gmail.com] + * @copyright Crown Copyright 2025 + * @license Apache-2.0 + */ + From 53adbca9be971334f2b055acd1ff5cba508bd3f8 Mon Sep 17 00:00:00 2001 From: Louis-Ladd Date: Sun, 4 Jan 2026 17:51:48 -0700 Subject: [PATCH 5/6] Add tests for remove ANSI escape codes operation --- .../tests/RemoveANSIEscapeCodes.mjs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/operations/tests/RemoveANSIEscapeCodes.mjs b/tests/operations/tests/RemoveANSIEscapeCodes.mjs index 0b55dc2a8d..a3abe14a22 100644 --- a/tests/operations/tests/RemoveANSIEscapeCodes.mjs +++ b/tests/operations/tests/RemoveANSIEscapeCodes.mjs @@ -3,4 +3,43 @@ * @copyright Crown Copyright 2025 * @license Apache-2.0 */ +import TestRegister from "../../lib/TestRegister.mjs"; +TestRegister.addTests([ + { + "name": "Remove ANSI Escape Codes: x1b escape code", + "input": "\\x1b[31;1;3;4;9mHello, \\x1b[31;1;3;4;9mWorld!", + "expectedOutput": "Hello, World!", + "recipeConfig": [ + { + "op": "Remove ANSI Escape Codes", + "args": [ + ], + }, + ], + }, + { + "name": "Remove ANSI Escape Codes: 033 escape code", + "input": "\\033[32;1;3;4;9mHello, \\033[32;1;3;4;9mWorld!", + "expectedOutput": "Hello, World!", + "recipeConfig": [ + { + "op": "Remove ANSI Escape Codes", + "args": [ + ], + }, + ], + }, + { + "name": "Remove ANSI Escape Codes: e escape code", + "input": "\\e[32;1;3;4;9mHello, \\e[32;1;3;4;9mWorld!", + "expectedOutput": "Hello, World!", + "recipeConfig": [ + { + "op": "Remove ANSI Escape Codes", + "args": [ + ], + }, + ], + } +]); From fe13f6401d953576d397ddf19df435e333bf7c83 Mon Sep 17 00:00:00 2001 From: Louis-Ladd Date: Sun, 4 Jan 2026 17:58:35 -0700 Subject: [PATCH 6/6] Add \e escape codes to remove ANSI escape codes operation --- src/core/operations/RemoveANSIEscapeCodes.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/operations/RemoveANSIEscapeCodes.mjs b/src/core/operations/RemoveANSIEscapeCodes.mjs index dbaeb706fe..fa413354f8 100644 --- a/src/core/operations/RemoveANSIEscapeCodes.mjs +++ b/src/core/operations/RemoveANSIEscapeCodes.mjs @@ -32,7 +32,7 @@ class RemoveANSIEscapeCodes extends Operation { * @returns {string} */ run(input, args) { - const ansiRegex = /(?:\x1B|\\x1b|\\033|\\u001b)\[[0-?]*[ -/]*[@-~]/g; + const ansiRegex = /(?:\x1B|\\x1b|\\033|\\u001b|\\e)\[[0-?]*[ -/]*[@-~]/g; return input.replace(ansiRegex, ""); }