unfold static method
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;
}