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();
}