transformSelectionOrLine function
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,
);
}