decodeText method
Decodes the specified text
part
the text part that should be decoded
codec
the character encoding (charset)
Set isHeader
to true to decode header text using the Q-Encoding scheme,
compare https://tools.ietf.org/html/rfc2047#section-4.2
Implementation
@override
String decodeText(final String part, final Encoding codec,
{bool isHeader = false}) {
final buffer = StringBuffer();
// remove all soft-breaks:
final cleaned = part.replaceAll('=\r\n', '');
for (var i = 0; i < cleaned.length; i++) {
final char = cleaned[i];
if (char == '=') {
final hexText = cleaned.substring(i + 1, i + 3);
var charCode = int.tryParse(hexText, radix: 16);
if (charCode == null) {
print('unable to decode quotedPrintable [$cleaned]: '
'invalid hex code [$hexText] at $i.');
buffer.write(hexText);
} else {
final charCodes = [charCode];
while (cleaned.length > (i + 4) && cleaned[i + 3] == '=') {
i += 3;
final hexText = cleaned.substring(i + 1, i + 3);
charCode = int.parse(hexText, radix: 16);
charCodes.add(charCode);
}
try {
final decoded = codec.decode(charCodes);
buffer.write(decoded);
} on FormatException catch (err) {
print('unable to decode quotedPrintable buffer: ${err.message}');
buffer.write(String.fromCharCodes(charCodes));
}
}
i += 2;
} else if (isHeader && char == '_') {
buffer.write(' ');
} else {
buffer.write(char);
}
}
return buffer.toString();
}