graphemesInRange method

List<String> graphemesInRange({
  1. required int startOffset,
  2. required int endOffset,
})

Implementation

List<String> graphemesInRange({
  required int startOffset,
  required int endOffset,
}) {
  final normalizedStart = startOffset.clamp(0, length);
  final normalizedEnd = endOffset.clamp(normalizedStart, length);
  if (normalizedStart == normalizedEnd) {
    return const <String>[];
  }

  final result = <String>[];
  var remaining = normalizedEnd - normalizedStart;
  final start = positionForOffset(normalizedStart);
  var line = start.line;
  var column = start.column;

  while (remaining > 0 && line < _storage.lineCount) {
    final lineLength = this.lineLength(line);
    final takeCount = (lineLength - column).clamp(0, remaining);
    if (takeCount > 0) {
      result.addAll(
        _storage.graphemesInLineRange(
          line,
          startColumn: column,
          endColumn: column + takeCount,
        ),
      );
      remaining -= takeCount;
      column += takeCount;
    }

    if (remaining > 0 &&
        column == lineLength &&
        line < _storage.lineCount - 1) {
      result.add('\n');
      remaining -= 1;
      line += 1;
      column = 0;
    }
  }

  return result;
}