from static method

List<CappedWord> from(
  1. String input, [
  2. Pattern? splitter
])

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;
}