From e1fde5a0f174c15b85fbd4ab1c69ec03327b76bd 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() {