shouldBreak function
Implementation
int shouldBreak(int start, List<int> mid, int end) {
final all = [start];
all.addAll(mid);
all.addAll([end]);
final previous = all[all.length - 2];
final next = end;
final eModifierIndex = all.lastIndexOf(eModifier);
if (eModifierIndex > 1 &&
all.sublist(1, eModifierIndex).every((c) => c == extend) &&
![extend, eBase, eBaseGaz].contains(start)) {
return break_;
}
var rIIndex = all.lastIndexOf(regionalIndicator);
if (rIIndex > 0 &&
all.sublist(1, rIIndex).every((c) => c == regionalIndicator) &&
![prepend, regionalIndicator].contains(previous)) {
if (all.where((c) => c == regionalIndicator).length % 2 == 1) {
return breakLastRegional;
} else {
return breakPenultimateRegional;
}
}
if (previous == cr && next == lf) {
return notBreak;
} else if (previous == control || previous == cr || previous == lf) {
if (next == eModifier && mid.every((c) => c == extend)) {
return break_;
} else {
return breakStart;
}
} else if (next == control || next == cr || next == lf) {
return breakStart;
} else if (previous == l &&
(next == l || next == v || next == lv || next == lvt)) {
return notBreak;
} else if ((previous == lv || previous == v) && (next == v || next == t)) {
return notBreak;
} else if ((previous == lvt || previous == t) && next == t) {
return notBreak;
} else if (next == extend || next == zwj) {
return notBreak;
} else if (next == spacingMark) {
return notBreak;
} else if (previous == prepend) {
return notBreak;
}
final previousNonExtendIndex =
all.contains(extend) ? all.lastIndexOf(extend) - 1 : all.length - 2;
if (previousNonExtendIndex != -1 &&
[eBase, eBaseGaz].contains(all[previousNonExtendIndex]) &&
all.length > previousNonExtendIndex + 1 &&
sliceFromEnd(all, previousNonExtendIndex + 1).every((c) => c == extend) &&
next == eModifier) {
return notBreak;
}
if (previous == zwj && [glueAfterZwj, eBaseGaz].contains(next)) {
return notBreak;
}
if (mid.contains(regionalIndicator)) {
return break_;
}
if (previous == regionalIndicator && next == regionalIndicator) {
return notBreak;
}
return breakStart;
}