diff --git a/README.md b/README.md index cbf5547..8bcf256 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,20 @@ objects: final String capitalized = text.capitalize; // "Hello" ``` +- `capitalizeWords`: Capitalizes the first letter of each word in a given `String` + + ```dart + String text = "hello world"; + String capitalizedWords = text.capitalizeWords; // "Hello World" + ``` + +- `spacePascalCase`: Adds spaces between words in a PascalCase `String` + + ```dart + String text = "ArcaneHelperUtils"; + String spaced = text.spacePascalCase; // "Arcane Helper Utils" + ``` + Additionally, the `CommonString` class provides a quick shortcut to common strings, such as punctuation marks that are otherwise cumbersome to find or type. diff --git a/example/lib/main.dart b/example/lib/main.dart index f36427c..552d940 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -3,7 +3,7 @@ import "package:arcane_helper_utils/arcane_helper_utils.dart"; void main() { - // DateTime + // * DateTime final DateTime dateTime = DateTime(2019, 1, 1, 13, 45); print(dateTime.toIso8601String()); // 2019-01-01T13:45:00.0 print(dateTime.startOfHour.toIso8601String()); // 2019-01-01T13:00:00.0 @@ -19,31 +19,59 @@ void main() { print("Yesterday: $yesterday"); print("Tomorrow: $tomorrow"); - // Strings + // * Strings const String? nullString = null; const String emptyString = " "; const String nonEmptyString = "Hello World!"; + // Nullability print("${nullString.isNullOrEmpty}"); // true print("${emptyString.isNullOrEmpty}"); // true print("${nonEmptyString.isNullOrEmpty}"); // false + // Split a string by x characters const String text = "DartLang"; final List result = text.splitByLength(3); print("$result"); // ["Dar", "tLa", "ng"] + // Capitalize a string const String lowercase = "hello"; final String capitalized = lowercase.capitalize; print(capitalized); // "Hello" - final list = [1, 2, 2, 3, 4, 4]; - final uniqueList = list.unique(); - print(uniqueList); // Output: [1, 2, 3, 4] - final people = [ - Person(id: 1, name: "Alice"), - Person(id: 2, name: "Bob"), - Person(id: 1, name: "Alice Duplicate"), + // Capitalize words in a string + const String lowercaseWords = "hello world"; + final String capitalizedWords = lowercaseWords.capitalizeWords; + print(capitalizedWords); // "Hello World" + + // Space out PascalCase words + const String pascalCase = "ArcaneHelperUtils"; + final String spacedOut = pascalCase.spacePascalCase; + print(spacedOut); // "Arcane Helper Utils"; + + // * Lists + final List people = [ + const Person(id: 1, name: "Alice"), + const Person(id: 2, name: "Bob"), + const Person(id: 1, name: "Alice Duplicate"), ]; - final uniquePeople = people.unique((person) => person.id); + + // Process the list into a new list item. Original list is preserved. + final List uniquePeople = people.unique((person) => person.id, false); + print( + people.map((p) => p.name), + // Output: ['Alice', 'Bob', 'Alice Duplicate'] + ); print(uniquePeople.map((p) => p.name)); // Output: ['Alice', 'Bob'] + + // Process the existing list, in place + people.unique((person) => person.id); + print(people.map((p) => p.name)); // Output: ['Alice', 'Bob'] +} + +class Person { + final int id; + final String name; + + const Person({required this.id, required this.name}); } diff --git a/lib/src/extensions/string.dart b/lib/src/extensions/string.dart index 8fb5e28..555203a 100644 --- a/lib/src/extensions/string.dart +++ b/lib/src/extensions/string.dart @@ -91,4 +91,46 @@ extension TextManipulation on String { if (isEmpty) return ""; return "${this[0].toUpperCase()}${substring(1)}"; } + + /// Capitalizes the first letter of each word in the string. + /// + /// This method returns a new string where the first character of each word + /// is converted to uppercase, while the rest of the string remains unchanged. + /// + /// Example: + /// ```dart + /// String text = "hello world"; + /// String capitalizedWords = text.capitalizeWords; // "Hello World" + /// ``` + String get capitalizeWords { + final strings = split(" "); + return strings.map((s) => s.capitalize).join(" "); + } + + /// Adds spaces between words in a PascalCase string. + /// + /// This method returns a new string where the capitalized words in a + /// PascalCase string are separated by spaces. The rest of the string remains + /// unchanged, aside from whitespace at the beginning and the end of the + /// string being stripped. + /// + /// Example: + /// ```dart + /// String text = "ArcaneHelperUtils"; + /// String spaced = text.spacePascalCase; // "Arcane Helper Utils" + /// ``` + String get spacePascalCase { + final List strings = split( + "", + ); + String output = ""; + for (final String char in strings) { + if (RegExp(r"[A-ZÄÖÅ]").hasMatch(char)) { + output += " $char"; + } else { + output += char; + } + } + return output.trim(); + } }