replaceTexts method

void replaceTexts(
  1. List<Node> nodes,
  2. Selection selection,
  3. List<String> texts
)

Implementation

void replaceTexts(
  List<Node> nodes,
  Selection selection,
  List<String> texts,
) {
  if (nodes.isEmpty || texts.isEmpty) {
    return;
  }

  if (nodes.length == texts.length) {
    final length = nodes.length;

    if (length == 1) {
      replaceText(
        nodes.first,
        selection.startIndex,
        selection.endIndex - selection.startIndex,
        texts.first,
      );
      return;
    }

    for (var i = 0; i < nodes.length; i++) {
      final node = nodes[i];
      final delta = node.delta;
      if (delta == null) {
        continue;
      }
      if (i == 0) {
        replaceText(
          node,
          selection.startIndex,
          delta.length - selection.startIndex,
          texts.first,
        );
      } else if (i == length - 1) {
        replaceText(
          node,
          0,
          selection.endIndex,
          texts.last,
        );
      } else {
        replaceText(
          node,
          0,
          delta.toPlainText().length,
          texts[i],
        );
      }
    }
    return;
  }

  if (nodes.length > texts.length) {
    final length = nodes.length;
    for (var i = 0; i < nodes.length; i++) {
      final node = nodes[i];
      final delta = node.delta;
      if (delta == null) {
        continue;
      }
      if (i == 0) {
        replaceText(
          node,
          selection.startIndex,
          delta.length - selection.startIndex,
          texts.first,
        );
      } else if (i == length - 1 && texts.length >= 2) {
        replaceText(
          node,
          0,
          selection.endIndex,
          texts.last,
        );
      } else if (i < texts.length - 1) {
        replaceText(
          node,
          0,
          delta.length,
          texts[i],
        );
      } else {
        deleteNode(node);
        if (i == nodes.length - 1) {
          final delta = nodes.last.delta;
          if (delta == null) {
            continue;
          }
          final newDelta = Delta()
            ..insert(texts[0])
            ..addAll(
              delta.slice(selection.end.offset),
            );
          replaceText(
            node,
            selection.start.offset,
            texts[0].length,
            newDelta.toPlainText(),
          );
        }
      }
    }
    afterSelection = null;
    return;
  }

  if (nodes.length < texts.length) {
    final length = texts.length;
    var path = nodes.first.path;

    for (var i = 0; i < texts.length; i++) {
      final text = texts[i];
      if (i == 0) {
        final node = nodes.first;
        final delta = node.delta;
        if (delta == null) {
          continue;
        }
        replaceText(
          nodes.first,
          selection.startIndex,
          delta.length - selection.startIndex,
          text,
        );
        path = path.next;
      } else if (i == length - 1 && nodes.length >= 2) {
        replaceText(
          nodes.last,
          0,
          selection.endIndex,
          text,
        );
        path = path.next;
      } else {
        if (i < nodes.length - 1) {
          final node = nodes[i];
          final delta = node.delta;
          if (delta == null) {
            continue;
          }
          replaceText(
            node,
            0,
            delta.length,
            text,
          );
          path = path.next;
        } else {
          if (i == texts.length - 1) {
            final delta = nodes.last.delta;
            if (delta == null) {
              continue;
            }
            final mewDelta = Delta()
              ..insert(text)
              ..addAll(
                delta.slice(selection.end.offset),
              );
            insertNode(
              path,
              Node(
                type: 'paragraph',
                attributes: {'delta': mewDelta.toJson()},
              ),
            );
          } else {
            insertNode(
              path,
              Node(
                type: 'paragraph',
                attributes: {'delta': (Delta()..insert(text)).toJson()},
              ),
            );
          }
        }
      }
    }
    afterSelection = null;
    return;
  }
}