transformSelectionOrLine function

TextCommandResult transformSelectionOrLine(
  1. List<String> graphemes, {
  2. required int cursorOffset,
  3. required int lineStartOffset,
  4. required int lineEndOffset,
  5. int? selectionBaseOffset,
  6. int? selectionExtentOffset,
  7. required String transform(
    1. String text
    ),
})

Implementation

TextCommandResult transformSelectionOrLine(
  List<String> graphemes, {
  required int cursorOffset,
  required int lineStartOffset,
  required int lineEndOffset,
  int? selectionBaseOffset,
  int? selectionExtentOffset,
  required String Function(String text) transform,
}) {
  final selection = normalizedSelectionRange(
    selectionBaseOffset,
    selectionExtentOffset,
  );
  final hasSelection = selection != null && selection.start != selection.end;
  final start = hasSelection
      ? selection.start
      : lineStartOffset.clamp(0, graphemes.length);
  final end = hasSelection
      ? selection.end
      : lineEndOffset.clamp(start, graphemes.length);

  if (start == end) {
    return _unchangedResult(
      graphemes,
      cursorOffset: cursorOffset,
      selectionBaseOffset: selectionBaseOffset,
      selectionExtentOffset: selectionExtentOffset,
    );
  }

  final original = graphemes.sublist(start, end).join();
  final transformed = transform(original);
  if (transformed == original) {
    return _unchangedResult(
      graphemes,
      cursorOffset: cursorOffset,
      selectionBaseOffset: selectionBaseOffset,
      selectionExtentOffset: selectionExtentOffset,
    );
  }

  final replacement = transformed.characters.toList(growable: false);
  final result = edit_ops.replaceRange(
    graphemes,
    start: start,
    end: end,
    replacement: replacement,
  );
  final nextExtent = start + replacement.length;

  if (hasSelection) {
    return TextCommandResult(
      graphemes: result.graphemes,
      cursorOffset: nextExtent,
      selectionBaseOffset: start,
      selectionExtentOffset: nextExtent,
    );
  }

  final relativeCursor = (cursorOffset - start).clamp(0, replacement.length);
  return TextCommandResult(
    graphemes: result.graphemes,
    cursorOffset: start + relativeCursor,
  );
}