int nextBreak()

in lib/src/grapheme_clusters/breaks.dart [334:381]


int nextBreak(String text, int start, int end, int index) {
  assert(0 <= start);
  assert(start <= index);
  assert(index <= end);
  assert(end <= text.length);
  if (index == start || index == end) return index;
  var indexBefore = index - 1;
  var prevChar = text.codeUnitAt(indexBefore);
  var prevCategory = categoryControl;
  if (prevChar & 0xF800 != 0xD800) {
    prevCategory = low(prevChar);
  } else if (prevChar & 0xFC00 == 0xD800) {
    var nextChar = text.codeUnitAt(index);
    if (nextChar & 0xFC00 == 0xDC00) {
      index += 1;
      if (index == end) return end;
      prevCategory = high(prevChar, nextChar);
    }
  } else if (indexBefore > start) {
    var secondCharIndex = indexBefore - 1;
    var secondChar = text.codeUnitAt(secondCharIndex);
    if (secondChar & 0xFC00 == 0xD800) {
      indexBefore = secondCharIndex;
      prevCategory = high(secondChar, prevChar);
    }
  }
  // The only boundaries which depend on more information than
  // the previous character are the [^RI] (RI RI)* RI x RI and
  // Pic Ext* ZWJ x Pic breaks. In all other cases, all the necessary
  // information is in the last seen category.
  var state = stateOther;
  if (prevCategory == categoryRegionalIndicator) {
    var prevState = lookAheadRegional(text, start, indexBefore);
    if (prevState != stateRegionalOdd) {
      state = stateRegionalSingle;
    }
  } else if (prevCategory == categoryZWJ || prevCategory == categoryExtend) {
    var prevPic = lookAheadPictorgraphicExtend(text, start, indexBefore);
    if (prevPic >= 0) {
      state = prevCategory == categoryZWJ
          ? statePictographicZWJ
          : statePictographic;
    }
  } else {
    state = move(stateSoTNoBreak, prevCategory);
  }
  return Breaks(text, index, text.length, state).nextBreak();
}