normalizeDetailed static method

ReferenceInputNormalization normalizeDetailed(
  1. String input
)

Normalizes input and preserves the UTF-16 source span of every output code unit.

Implementation

static ReferenceInputNormalization normalizeDetailed(String input) {
  final output = StringBuffer();
  final mutableSpans = <_MutableInputSpan>[];
  int? pendingRemovedStart;
  var lastEmissionStart = 0;
  var inputOffset = 0;

  while (inputOffset < input.length) {
    final decoded = _decodeCodePoint(input, inputOffset);
    final sourceEnd = inputOffset + decoded.width;

    if (_isRemovedCodePoint(decoded.value)) {
      if (mutableSpans.isEmpty) {
        pendingRemovedStart ??= inputOffset;
      } else {
        for (var i = lastEmissionStart; i < mutableSpans.length; i++) {
          mutableSpans[i].end = sourceEnd;
        }
      }
      inputOffset = sourceEnd;
      continue;
    }

    final normalizedCodePoint = _normalizeCodePoint(decoded.value);
    final sourceStart = pendingRemovedStart ?? inputOffset;
    pendingRemovedStart = null;
    lastEmissionStart = mutableSpans.length;
    output.writeCharCode(normalizedCodePoint);

    final outputWidth = normalizedCodePoint > 0xffff ? 2 : 1;
    for (var i = 0; i < outputWidth; i++) {
      mutableSpans.add(_MutableInputSpan(sourceStart, sourceEnd));
    }
    inputOffset = sourceEnd;
  }

  return ReferenceInputNormalization._(
    originalText: input,
    normalizedText: output.toString(),
    sourceSpans: List<ReferenceInputSpan>.unmodifiable(
      mutableSpans.map(
        (span) => ReferenceInputSpan(span.start, span.end),
      ),
    ),
  );
}