From 1ea27d7020ab4f4338e52f838111cbe53fd7924e Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 5 May 2011 00:17:34 -0700 Subject: [PATCH] Issue 3105: Generate proper HTML-ified versions of text messages so that textification of the HTMLified text message preserves the original newlines. --- src/com/fsck/k9/helper/HtmlConverter.java | 48 ++++++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/com/fsck/k9/helper/HtmlConverter.java b/src/com/fsck/k9/helper/HtmlConverter.java index f4135138d..1282bd985 100644 --- a/src/com/fsck/k9/helper/HtmlConverter.java +++ b/src/com/fsck/k9/helper/HtmlConverter.java @@ -123,6 +123,43 @@ public class HtmlConverter { private static final int MAX_SMART_HTMLIFY_MESSAGE_LENGTH = 1024 * 256 ; + /** + * Naively convert a text string into an HTML document. This method avoids using regular expressions on the entire + * message body to save memory. + * @param text Plain text string. + * @return HTML string. + */ + private static String simpleTextToHtml(String text) { + // Encode HTML entities to make sure we don't display something evil. + text = TextUtils.htmlEncode(text); + + StringReader reader = new StringReader(text); + StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH); + buff.append(""); + + int c; + try { + while ((c = reader.read()) != -1) { + switch (c) { + case '\n': + buff.append("
\n"); + break; + case '\r': + break; + default: + buff.append((char)c); + }//switch + } + } catch (IOException e) { + //Should never happen + Log.e(K9.LOG_TAG, "Could not read string to convert text to HTML:", e); + } + + buff.append(""); + + return buff.toString(); + } + /** * Convert a text string into an HTML document. Attempts to do smart replacement for large * documents to prevent OOM errors. This method adds headers and footers to create a proper HTML @@ -136,11 +173,7 @@ public class HtmlConverter { // if the message is big and plain text, just do // a trivial htmlification if (text.length() > MAX_SMART_HTMLIFY_MESSAGE_LENGTH) { - return "" + - htmlifyMessageHeader() + - text + - htmlifyMessageFooter() + - ""; + return simpleTextToHtml(text); } StringReader reader = new StringReader(text); StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH); @@ -148,6 +181,9 @@ public class HtmlConverter { try { while ((c = reader.read()) != -1) { switch (c) { + case '\n': + buff.append("
\n"); + break; case '&': buff.append("&"); break; @@ -1076,7 +1112,7 @@ public class HtmlConverter { final String font = K9.messageViewFixedWidthFont() ? "monospace" : "sans-serif"; - return "
";
+        return "
";
     }
 
     private static String htmlifyMessageFooter() {