breakLines static method

List<String> breakLines(
  1. String text,
  2. double measureText(
    1. String
    ),
  3. double maxWidth
)

Implementation

static List<String> breakLines(
  String text,
  double Function(String) measureText,
  double maxWidth
) {
  if (text.isEmpty) {
    return [];
  }

  final List<String> lines = [];
  final opportunities = findBreakOpportunities(text);

  int startIndex = 0;
  int lastGoodBreak = 0;

  for (int i = 0; i < text.length; i++) {
    final currentText = text.substring(startIndex, i + 1);
    final width = measureText(currentText);

    final breakOpportunity = _getBreakOpportunityAt(opportunities, i);

    if (breakOpportunity != null &&
        breakOpportunity.index <= BreakOpportunity.emergency.index) {
      lastGoodBreak = i;
    }

    if (width > maxWidth) {
      if (lastGoodBreak > startIndex) {
        final endIndex = text[lastGoodBreak] == ' ' ? lastGoodBreak : lastGoodBreak + 1;
        lines.add(text.substring(startIndex, endIndex));
        startIndex = lastGoodBreak + 1;
        i = startIndex - 1;
      } else {
        lines.add(text.substring(startIndex, i));
        startIndex = i;
        i = startIndex - 1;
      }

      lastGoodBreak = startIndex;
      continue;
    }

    if (breakOpportunity == BreakOpportunity.mandatory) {
      lines.add(text.substring(startIndex, i + 1));
      startIndex = i + 1;
      lastGoodBreak = startIndex;
    }
  }

  if (startIndex < text.length) {
    lines.add(text.substring(startIndex));
  }

  return lines;
}