renumberNumberedList function
TextLineCommandResult
renumberNumberedList(
- List<
String> lines, { - required TextPosition cursor,
- TextPosition? selectionBase,
- TextPosition? selectionExtent,
- int startAt = 1,
Implementation
TextLineCommandResult renumberNumberedList(
List<String> lines, {
required TextPosition cursor,
TextPosition? selectionBase,
TextPosition? selectionExtent,
int startAt = 1,
}) {
final lineTexts = lines.isEmpty ? <String>[''] : List<String>.from(lines);
final clampedCursor = _clampPositionToLines(cursor, lineTexts);
final selection = selectionBase != null && selectionExtent != null
? TextSelection(base: selectionBase, extent: selectionExtent)
: null;
final hasSelection = selection != null && !selection.isCollapsed;
final startLine = hasSelection ? selection.start.line : clampedCursor.line;
final endLine = hasSelection ? selection.end.line : clampedCursor.line;
final initialNumber = startAt < 1 ? 1 : startAt;
var hasNumberedLine = false;
var adjustedBase = selectionBase;
var adjustedExtent = selectionExtent;
var nextCursor = clampedCursor;
var nextNumber = initialNumber;
for (var lineIndex = startLine; lineIndex <= endLine; lineIndex++) {
final line = lineTexts[lineIndex];
final leadingWhitespace = line.length - line.trimLeft().length;
final indent = line.substring(0, leadingWhitespace);
final body = line.substring(leadingWhitespace);
final numberedPrefixLength = _leadingNumberedPrefixLength(body);
if (numberedPrefixLength == null) {
continue;
}
hasNumberedLine = true;
final nextPrefix = '${nextNumber++}. ';
lineTexts[lineIndex] =
'$indent$nextPrefix${body.substring(numberedPrefixLength)}';
final delta = nextPrefix.length - numberedPrefixLength;
if (delta == 0) {
continue;
}
if (lineIndex == nextCursor.line) {
nextCursor = TextPosition(
line: nextCursor.line,
column: _adjustLinePrefixColumnDelta(
column: nextCursor.column,
leadingWhitespace: leadingWhitespace,
delta: delta,
),
);
}
adjustedBase = _adjustLinePrefixPositionDelta(
adjustedBase,
line: lineIndex,
leadingWhitespace: leadingWhitespace,
delta: delta,
);
adjustedExtent = _adjustLinePrefixPositionDelta(
adjustedExtent,
line: lineIndex,
leadingWhitespace: leadingWhitespace,
delta: delta,
);
}
if (!hasNumberedLine || _listStringEquals(lineTexts, lines)) {
return _unchangedLineResult(
lineTexts,
cursor: clampedCursor,
selectionBase: selectionBase,
selectionExtent: selectionExtent,
);
}
if (hasSelection && adjustedBase != null && adjustedExtent != null) {
final clampedBase = _clampPositionToLines(adjustedBase, lineTexts);
final clampedExtent = _clampPositionToLines(adjustedExtent, lineTexts);
return TextLineCommandResult(
lines: lineTexts,
cursor: clampedExtent,
selectionBase: clampedBase,
selectionExtent: clampedExtent,
);
}
return TextLineCommandResult(
lines: lineTexts,
cursor: _clampPositionToLines(nextCursor, lineTexts),
);
}