renumberNumberedList function

TextLineCommandResult renumberNumberedList(
  1. List<String> lines, {
  2. required TextPosition cursor,
  3. TextPosition? selectionBase,
  4. TextPosition? selectionExtent,
  5. 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),
  );
}