normalizeDetailed static method
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),
),
),
);
}