textSanitizeRunesLimited function

List<int> textSanitizeRunesLimited(
  1. List<int> runes, {
  2. required bool multiline,
  3. required int maxOutputCodepoints,
})

Implementation

List<int> textSanitizeRunesLimited(
  List<int> runes, {
  required bool multiline,
  required int maxOutputCodepoints,
}) {
  if (maxOutputCodepoints <= 0) return const [];

  final tabRunes = multiline
      ? const <int>[0x20, 0x20, 0x20, 0x20]
      : const <int>[0x20];
  final newlineRunes = multiline ? const <int>[0x0A] : const <int>[0x20];
  final result = <int>[];

  for (final rune in runes) {
    if (result.length >= maxOutputCodepoints) break;

    if (rune == 0xFFFD) {
      continue;
    } else if (rune == 0x0D || rune == 0x0A) {
      for (final codepoint in newlineRunes) {
        if (result.length >= maxOutputCodepoints) break;
        result.add(codepoint);
      }
    } else if (rune == 0x09) {
      for (final codepoint in tabRunes) {
        if (result.length >= maxOutputCodepoints) break;
        result.add(codepoint);
      }
    } else if (_isControlRune(rune)) {
      continue;
    } else {
      result.add(rune);
    }
  }

  return result;
}