splitCamelCase property

List<String> get splitCamelCase

Split camel case.

All result parts will be lowercased. It will split when changing from lowercase to uppercase, and before from uppercase to lowercase. For example:

  1. From 'ABCAndAnotherABC' to ['abc', 'and', 'another', 'abc'].
  2. From 'abc123abc' to ['abc123', 'abc'].

Implementation

List<String> get splitCamelCase {
  if (isEmpty) return [];
  final handler = <String>[];
  var char = this[0];
  late String before;
  final buffer = StringBuffer(char);
  for (var i = 1; i < length; i++) {
    before = char;
    char = this[i];
    final current = buffer.toString();

    // From lowercase or digit to uppercase, or from digit to alphabet.
    if (current.isNotEmpty &&
        (((before._lower || before._digit) && char._upper) ||
            (before._digit && (char._upper || char._lower)))) {
      handler.add(current);
      buffer
        ..clear()
        ..write(char);
    }
    // Before uppercase to lowercase.
    else if (current.length > 1 && before._upper && char._lower) {
      handler.add(current.substring(0, current.length - 1));
      buffer
        ..clear()
        ..write(before)
        ..write(char);
    }
    // Otherwise, just pass.
    else {
      buffer.write(char);
    }
  }

  if (buffer.isNotEmpty) handler.add(buffer.toString());
  return handler.map((part) => part.toLowerCase()).toList();
}