unfold static method

List<String> unfold(
  1. String input
)

Unfolds the given input text, usually with lines separated by \r\n

Implementation

static List<String> unfold(
  String input,
) {
  _UnfoldData getUnfoldData(String input) {
    final firstStandardLineBreak = input.indexOf('\r\n');
    final firstUnixLineBreak = input.indexOf('\n');

    if (firstStandardLineBreak != -1 &&
        (firstUnixLineBreak == -1 ||
            firstStandardLineBreak < firstUnixLineBreak)) {
      return _UnfoldData(input, hasStandardLineBreaks: true);
    }

    if (firstStandardLineBreak != -1 && firstUnixLineBreak != -1) {
      return _UnfoldData(
        input.replaceAll('\r\n', '\n'),
        hasStandardLineBreaks: false,
      );
    }

    return _UnfoldData(input, hasStandardLineBreaks: false);
  }

  final data = getUnfoldData(input);
  if (data.hasStandardLineBreaks) {
    return unfoldStandardCompliantLines(data.input.split('\r\n'));
  }
  final output = <String>[];
  var buffer = StringBuffer();
  final ascii = data.input.runes.toList();
  var isInQuote = false;
  for (var i = 0; i < ascii.length; i++) {
    final rune = ascii[i];
    if (rune == Rune.runeLineFeed) {
      if (i < ascii.length - 1 &&
          (ascii[i + 1] == Rune.runeSpace || ascii[i + 1] == Rune.runeTab)) {
        // this line-break must be ignored:
        i++;
        while (i < ascii.length - 1 &&
            (ascii[i + 1] == Rune.runeSpace ||
                ascii[i + 1] == Rune.runeTab)) {
          i++;
        }
        continue;
      }
      if (!isInQuote) {
        // this marks the end of the current line:
        if (buffer.isNotEmpty) {
          output.add(buffer.toString());
          buffer = StringBuffer();
        }
        continue;
      }
    } else if (rune == Rune.runeDoubleQuote) {
      isInQuote = !isInQuote;
    }
    buffer.writeCharCode(rune);
  }
  if (buffer.isNotEmpty) {
    output.add(buffer.toString());
  }

  return output;
}