decodeText method

  1. @override
String decodeText(
  1. String part,
  2. Encoding codec, {
  3. bool isHeader = false,
})
override

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();
}