diff --git a/CHANGELOG.md b/CHANGELOG.md index 724c300..3703841 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- `splitLines` string utility function + ### Changed - Moved `isValidSwissIbanNumber` and `isValidSwissSocialInsuranceNumber` to swissStandards diff --git a/src/lib/string.spec.ts b/src/lib/string.spec.ts index 94fc71e..f9bb4ce 100644 --- a/src/lib/string.spec.ts +++ b/src/lib/string.spec.ts @@ -1,4 +1,4 @@ -import { isNullOrEmpty, isNullOrWhitespace, capitalize, uncapitalize, truncate } from "./string"; +import { isNullOrEmpty, isNullOrWhitespace, capitalize, uncapitalize, truncate, splitLines } from "./string"; describe("string tests", () => { test.each([ @@ -120,4 +120,41 @@ describe("string tests", () => { ])("truncate without suffix parameter", (value, maxLength, expected) => { expect(truncate(value, maxLength)).toBe(expected); }); + + test.each([ + ["", false, false, []], + [null as unknown as string, false, false, []], + [undefined as unknown as string, false, false, []], + [" aaaa \n\nbbbb \n \ncccc", false, false, [" aaaa ", "", "bbbb ", " ", "cccc"]], + [" aaaa \r\rbbbb \r \rcccc", false, false, [" aaaa ", "", "bbbb ", " ", "cccc"]], + [" aaaa \r\rbbbb \n \r\ncccc", false, false, [" aaaa ", "", "bbbb ", " ", "cccc"]], + [" aaaa \r\n\r\nbbbb \r\n \r\ncccc", false, false, [" aaaa ", "", "bbbb ", " ", "cccc"]], + + [" aaaa \n\nbbbb \n \ncccc", true, false, [" aaaa ", "bbbb ", " ", "cccc"]], + [" aaaa \r\rbbbb \r \rcccc", true, false, [" aaaa ", "bbbb ", " ", "cccc"]], + [" aaaa \r\rbbbb \n \r\ncccc", true, false, [" aaaa ", "bbbb ", " ", "cccc"]], + [" aaaa \r\n\r\nbbbb \r\n \r\ncccc", true, false, [" aaaa ", "bbbb ", " ", "cccc"]], + + [" aaaa \n\nbbbb \n \ncccc", false, true, ["aaaa", "", "bbbb", "", "cccc"]], + [" aaaa \r\rbbbb \r \rcccc", false, true, ["aaaa", "", "bbbb", "", "cccc"]], + [" aaaa \r\rbbbb \n \r\ncccc", false, true, ["aaaa", "", "bbbb", "", "cccc"]], + [" aaaa \r\n\r\nbbbb \r\n \r\ncccc", false, true, ["aaaa", "", "bbbb", "", "cccc"]], + + [" aaaa \n\nbbbb \n \ncccc", true, true, ["aaaa", "bbbb", "cccc"]], + [" aaaa \r\rbbbb \r \rcccc", true, true, ["aaaa", "bbbb", "cccc"]], + [" aaaa \r\rbbbb \n \r\ncccc", true, true, ["aaaa", "bbbb", "cccc"]], + ])("splitLines with parameter removeEmptyEntries and trimEntries", (str, removeEmptyEntries, trimEntries, expected) => { + expect(splitLines(str, removeEmptyEntries, trimEntries)).toEqual(expected); + }); + + test.each([ + ["", []], + [null as unknown as string, []], + [undefined as unknown as string, []], + [" aaaa \n\nbbbb \n \ncccc", [" aaaa ", "", "bbbb ", " ", "cccc"]], + [" aaaa \r\rbbbb \r \rcccc", [" aaaa ", "", "bbbb ", " ", "cccc"]], + [" aaaa \r\n\nbbbb \r\n \r\ncccc", [" aaaa ", "", "bbbb ", " ", "cccc"]], + ])("splitLines with just the string as a parameter", (str, expected) => { + expect(splitLines(str)).toEqual(expected); + }); }); diff --git a/src/lib/string.ts b/src/lib/string.ts index c0666b3..3b9e07e 100644 --- a/src/lib/string.ts +++ b/src/lib/string.ts @@ -64,3 +64,28 @@ export function truncate(value: string | undefined, maxLength: number, suffix = return `${value.slice(0, maxLength)}${suffix}`; } + +/** + * Splits the string at line breaks + * @param str the string to split + * @param removeEmptyEntries the option to remove empty entries + * @param trimEntries the option to trim the entries + * @returns the individual lines as an array + */ +export function splitLines(str: string, removeEmptyEntries: boolean = false, trimEntries: boolean = false): string[] { + if (isNullOrEmpty(str)) { + return []; + } + + let splitted = str.split(/\r\n|\r|\n/); + + if (trimEntries) { + splitted = splitted.map((x) => x.trim()); + } + + if (removeEmptyEntries) { + splitted = splitted.filter((line) => line.length > 0); + } + + return splitted; +}