getBiDiSegmentsInRange method

List<BiDiSegment> getBiDiSegmentsInRange(
  1. int start,
  2. int end
)

Get BiDi segments within a character range

Implementation

List<BiDiSegment> getBiDiSegmentsInRange(int start, int end) {
  if (start >= end || _root == null) return [];

  final text = substring(start, end);
  final segments = <BiDiSegment>[];

  if (text.isEmpty) return segments;

  TextDirection? currentDir;
  int segmentStart = 0;

  for (int i = 0; i < text.length; i++) {
    final codeUnit = text.codeUnitAt(i);
    TextDirection charDir;

    if (BiDi.isRtlChar(codeUnit)) {
      charDir = TextDirection.rtl;
    } else if (BiDi.isLtrChar(codeUnit)) {
      charDir = TextDirection.ltr;
    } else {
      continue;
    }

    if (currentDir == null) {
      currentDir = charDir;
      segmentStart = i;
    } else if (charDir != currentDir) {
      segments.add(BiDiSegment(start + segmentStart, start + i, currentDir));
      currentDir = charDir;
      segmentStart = i;
    }
  }

  if (currentDir != null) {
    segments.add(
      BiDiSegment(start + segmentStart, start + text.length, currentDir),
    );
  }

  return segments;
}