From 1ca9f23e4775f6386942bfda53af7c13f9c367e7 Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:36:05 +0100 Subject: [PATCH 01/10] Create line break operation --- src/core/operations/LineBreak.mjs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/core/operations/LineBreak.mjs diff --git a/src/core/operations/LineBreak.mjs b/src/core/operations/LineBreak.mjs new file mode 100644 index 00000000..d740ae33 --- /dev/null +++ b/src/core/operations/LineBreak.mjs @@ -0,0 +1,15 @@ +/** + * @author ThomasNotTom + * @copyright Crown Copyright 2016 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; + + +/** + * Line Break operation + */ +class LineBreak extends Operation {} + +export default LineBreak; From 3cd45c5f68d7b1ed987ee4941e10dcc6710a8f33 Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:36:22 +0100 Subject: [PATCH 02/10] Create constructor --- src/core/operations/LineBreak.mjs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/core/operations/LineBreak.mjs b/src/core/operations/LineBreak.mjs index d740ae33..0825150e 100644 --- a/src/core/operations/LineBreak.mjs +++ b/src/core/operations/LineBreak.mjs @@ -10,6 +10,32 @@ import Operation from "../Operation.mjs"; /** * Line Break operation */ -class LineBreak extends Operation {} +class LineBreak extends Operation { + + /** + * LineBreak constructor + */ + constructor() { + super(); + + this.name = "Line Break"; + this.module = "Default"; + this.description = "Breaks the input text every n characters."; + this.inputType = "ArrayBuffer"; + this.outputType = "string"; + this.args = [ + { + "name": "Line break width", + "type": "number", + "value": 16, + "min": 1 + }, { + "name": "Remove leading whitespace", + "type": "boolean", + "value": false + } + ]; + } +} export default LineBreak; From 81e2b5f9ac1b0b6fcfbcaaa278b3ceb500ec1add Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:36:36 +0100 Subject: [PATCH 03/10] Create run implementation --- src/core/operations/LineBreak.mjs | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/core/operations/LineBreak.mjs b/src/core/operations/LineBreak.mjs index 0825150e..d2dd8cfe 100644 --- a/src/core/operations/LineBreak.mjs +++ b/src/core/operations/LineBreak.mjs @@ -5,6 +5,7 @@ */ import Operation from "../Operation.mjs"; +import Utils from "../Utils.mjs"; /** @@ -36,6 +37,43 @@ class LineBreak extends Operation { } ]; } + + /** + * @param {ArrayBuffer} input + * @param {Object[]} args + * @returns {string} + */ + run(input, args) { + const lines = []; + const lineWidth = args[0]; + const removeLeading = args[1]; + const msg = Utils.arrayBufferToStr(input, false); + let i = 0; + + while (i < msg.length) { + let slice = msg.slice(i, i + lineWidth); + let leadingWhitespace = 0; + + if (removeLeading) { + const match = slice.match(/^\s*/); + leadingWhitespace = match ? match[0].length : 0; + slice = slice.trimStart(); + } + + slice = msg.slice(i, i + lineWidth + leadingWhitespace); + + if (removeLeading) { + slice = slice.trimStart(); + } + + i += lineWidth + leadingWhitespace; + + if (slice.length === 0) continue; + lines.push(slice); + } + + return lines.join("\n"); + } } export default LineBreak; From 97e3af4c8b1e4070847c5c9cf0b49395396a8ebb Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:43:31 +0100 Subject: [PATCH 04/10] Add line break to utilities catagory --- 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 434c8bb6..925989e5 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -299,6 +299,7 @@ "From Case Insensitive Regex", "Add line numbers", "Remove line numbers", + "Line Break", "Get All Casings", "To Table", "Reverse", From 58ecadf9c4c31d74b339fd299852d89ba0002ad6 Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:50:38 +0100 Subject: [PATCH 05/10] Update copyright --- src/core/operations/LineBreak.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/operations/LineBreak.mjs b/src/core/operations/LineBreak.mjs index d2dd8cfe..b2457556 100644 --- a/src/core/operations/LineBreak.mjs +++ b/src/core/operations/LineBreak.mjs @@ -1,6 +1,6 @@ /** * @author ThomasNotTom - * @copyright Crown Copyright 2016 + * @copyright Crown Copyright 2025 * @license Apache-2.0 */ From c96b942fc2456ca60c26e2937313ab8b1b83eaa9 Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:49:21 +0100 Subject: [PATCH 06/10] Create line break test --- tests/operations/tests/LineBreak.mjs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/operations/tests/LineBreak.mjs diff --git a/tests/operations/tests/LineBreak.mjs b/tests/operations/tests/LineBreak.mjs new file mode 100644 index 00000000..9ebe07d7 --- /dev/null +++ b/tests/operations/tests/LineBreak.mjs @@ -0,0 +1,21 @@ +/** + * @author ThomasNotTom + * @copyright Crown Copyright 2025 + * @license Apache-2.0 + */ +import TestRegister from "../../lib/TestRegister.mjs"; + +TestRegister.addTests([ + { + // Check line remains unbroken + name: "Line Break: No break", + input: "Hello, world!", + expectedOutput: "Hello, world!", + recipeConfig: [ + { + "op": "Line Break", + "args": [32, false] + } + ] + } +]); From e525cfeaf56f68f329907c2efa3278427cc4e51b Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:49:29 +0100 Subject: [PATCH 07/10] Include line break test --- tests/operations/index.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index f147e9e7..a1b4c2e2 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -100,6 +100,7 @@ import "./tests/JWTDecode.mjs"; import "./tests/JWTSign.mjs"; import "./tests/JWTVerify.mjs"; import "./tests/LevenshteinDistance.mjs"; +import "./tests/LineBreak.mjs"; import "./tests/Lorenz.mjs"; import "./tests/LS47.mjs"; import "./tests/LuhnChecksum.mjs"; From b87f1f2e8889f12b0f51c8f6233bbf2b7e1be536 Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Sun, 8 Jun 2025 00:58:13 +0100 Subject: [PATCH 08/10] Create test for checking broken line --- tests/operations/tests/LineBreak.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/operations/tests/LineBreak.mjs b/tests/operations/tests/LineBreak.mjs index 9ebe07d7..c6fc6e10 100644 --- a/tests/operations/tests/LineBreak.mjs +++ b/tests/operations/tests/LineBreak.mjs @@ -17,5 +17,16 @@ TestRegister.addTests([ "args": [32, false] } ] + }, { + // Check line remains unbroken + name: "Line Break: With break", + input: "Hello, world!", + expectedOutput: "Hello,\n world\n!", + recipeConfig: [ + { + "op": "Line Break", + "args": [6, false] + } + ] } ]); From 39cc80f0f0f2c9c360cea1a35e41fa231635613b Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Sun, 8 Jun 2025 00:58:34 +0100 Subject: [PATCH 09/10] Correct comment --- tests/operations/tests/LineBreak.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/operations/tests/LineBreak.mjs b/tests/operations/tests/LineBreak.mjs index c6fc6e10..df4e75e7 100644 --- a/tests/operations/tests/LineBreak.mjs +++ b/tests/operations/tests/LineBreak.mjs @@ -18,7 +18,7 @@ TestRegister.addTests([ } ] }, { - // Check line remains unbroken + // Check line breaks name: "Line Break: With break", input: "Hello, world!", expectedOutput: "Hello,\n world\n!", From f92d7807641403ea8e41f585a61920b5022712b7 Mon Sep 17 00:00:00 2001 From: Thomas <31802793+ThomasNotTom@users.noreply.github.com> Date: Sun, 8 Jun 2025 00:59:17 +0100 Subject: [PATCH 10/10] Create test for breaking line and removing of whitespace --- tests/operations/tests/LineBreak.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/operations/tests/LineBreak.mjs b/tests/operations/tests/LineBreak.mjs index df4e75e7..8e56a5d6 100644 --- a/tests/operations/tests/LineBreak.mjs +++ b/tests/operations/tests/LineBreak.mjs @@ -28,5 +28,16 @@ TestRegister.addTests([ "args": [6, false] } ] + }, { + // Check line breaks and leading whitespace is removed. + name: "Line Break: With break and no leading whitespace", + input: "Hello, world!", + expectedOutput: "Hello,\nworld!", + recipeConfig: [ + { + "op": "Line Break", + "args": [6, true] + } + ] } ]);