splitCapitalizedUnicode method

  1. @useResult
List<String> splitCapitalizedUnicode({
  1. bool splitNumbers = false,
  2. bool splitBySpace = false,
  3. int minLength = 1,
})

Returns a list of segments split at capitalized letters (Unicode-aware).

When splitNumbers is true, also splits before digits. When splitBySpace is true, further splits each segment by whitespace. Adjacent segments shorter than minLength are merged together.

Implementation

@useResult
List<String> splitCapitalizedUnicode({
  bool splitNumbers = false,
  bool splitBySpace = false,
  int minLength = 1,
}) {
  if (isEmpty) {
    return <String>[];
  }

  final RegExp capitalizationPattern = splitNumbers
      ? _splitCapitalizedUnicodeWithNumbersRegex
      : _splitCapitalizedUnicodeRegex;
  List<String> intermediateSplit = split(capitalizationPattern);

  if (minLength > 1 && intermediateSplit.length > 1) {
    final List<String> mergedResult = <String>[];
    String currentBuffer = intermediateSplit[0];
    for (int i = 1; i < intermediateSplit.length; i++) {
      final String nextPart = intermediateSplit[i];
      if (currentBuffer.length < minLength || nextPart.length < minLength) {
        currentBuffer = '$currentBuffer$nextPart';
      } else {
        mergedResult.add(currentBuffer);
        currentBuffer = nextPart;
      }
    }
    mergedResult.add(currentBuffer);
    intermediateSplit = mergedResult;
  }

  if (!splitBySpace) {
    return intermediateSplit;
  }

  return intermediateSplit
      .expand((String part) => part.split(_consecutiveSpacesRegex))
      .where((String s) => s.isNotEmpty)
      .toList();
}