from static method
Implementation
static List<CappedWord> from(String input, [Pattern? splitter]) {
splitter ??= defaultSplitter;
final splits = Queue<Match>()..addAll(splitter.allMatches(input));
final runes = input.runes.toList();
final results = <CappedWord>[];
var wordCase = WordCap.none;
String? prefix;
int i = 0, start = 0;
void split([int? splitStart, int? splitEnd]) {
splitStart ??= i;
splitEnd ??= splitStart;
bool segmentIsEmpty = start >= splitStart;
bool splitIsEmpty = splitStart >= splitEnd;
// Only create splits if the resulting segments are not empty.
if (!segmentIsEmpty) {
results.add(CappedWord(input.substring(start, splitStart), wordCase, prefix: prefix));
// Only reset prefix if an actual segment was created.
if (splitIsEmpty) {
prefix = null;
} else {
prefix = input.substring(splitStart, splitEnd);
i = splitEnd;
}
}
start = splitEnd;
}
while (i < runes.length) {
final rune = runes[i];
switch ((wordCase, CharCap.fromRune(rune))) {
case (WordCap.none, var charCase): wordCase = charCase.wordCase;
case (WordCap.upper, CharCap.lower):
split(i-1);
wordCase = WordCap.title;
case (WordCap.title || WordCap.lower, CharCap.upper):
split();
wordCase = WordCap.none;
default:
}
if (splits.isNotEmpty && i >= splits.first.start) {
var splitter = splits.removeFirst();
split(splitter.start, splitter.end);
} else {
i += 1;
}
}
split();
return results;
}