wordWrap method
Wraps this string at columnWidth, breaking at word boundaries when possible.
Uses grapheme length for column count. columnWidth must be positive.
Returns a list of lines (no trailing newline in each).
Throws ArgumentError if columnWidth is not positive.
Example:
'hello world'.wordWrap(5); // ['hello', 'world']
'hi'.wordWrap(10); // ['hi']
Implementation
@useResult
List<String> wordWrap(int columnWidth) {
if (columnWidth < 1) {
throw ArgumentError(_kErrColumnWidthPositive, _kParamColumnWidth);
}
if (isEmpty) return <String>[];
final Characters chars = characters;
final int estimatedLines = (chars.length / columnWidth).ceil() + 1;
final List<String> lines = List<String>.filled(estimatedLines, '');
int lineIndex = 0;
int i = 0;
while (i < chars.length) {
int lineEnd = i + columnWidth;
if (lineEnd > chars.length) lineEnd = chars.length;
final String segment = chars.getRange(i, lineEnd).string;
int lineGraphemeCount = segment.characters.length;
if (lineEnd < chars.length) {
final int lastSpace = segment.lastIndexOf(_kSpace);
if (lastSpace >= 0) {
lineGraphemeCount = segment.replaceRange(lastSpace, segment.length, '').characters.length;
}
}
final String lineContent = lineGraphemeCount <= 0
? ''
: chars.getRange(i, i + lineGraphemeCount).string;
lines[lineIndex++] = lineContent;
i += lineContent.characters.length;
if (i < chars.length && chars.elementAt(i) == _kSpace) i++;
}
return lines.sublist(0, lineIndex);
}