apply method

  1. @override
Delta? apply(
  1. Delta document,
  2. int index,
  3. String text
)
override

Applies heuristic rule to an insert operation on a document and returns resulting Delta.

Implementation

@override
Delta? apply(Delta document, int index, String text) {
  if (!text.contains('\n') || text.length == 1) {
    // Only interested in text containing at least one line-break and at least
    // one more character.
    return null;
  }

  final iter = DeltaIterator(document);
  iter.skip(index);

  // Look for next line-break.
  Map<String, dynamic>? lineStyle;
  while (iter.hasNext) {
    final op = iter.next();
    final lf = op!.data.indexOf('\n');
    if (lf >= 0) {
      lineStyle = op.attributes;
      break;
    }
  }

  Map<String, dynamic>? resetStyle;
  Map<String, dynamic>? blockStyle;
  if (lineStyle != null) {
    if (lineStyle.containsKey(NotusAttribute.heading.key)) {
      resetStyle = NotusAttribute.heading.unset.toJson();
    }

    if (lineStyle.containsKey(NotusAttribute.block.key)) {
      blockStyle = <String, dynamic>{
        NotusAttribute.block.key: lineStyle[NotusAttribute.block.key]
      };
    }
  }

  final lines = text.split('\n');
  final result = Delta()..retain(index);
  for (var i = 0; i < lines.length; i++) {
    final line = lines[i];
    if (line.isNotEmpty) {
      result.insert(line);
    }
    if (i == 0) {
      result.insert('\n', lineStyle);
    } else if (i == lines.length - 1) {
      if (resetStyle != null) result.retain(1, resetStyle);
    } else {
      result.insert('\n', blockStyle);
    }
  }

  return result;
}