From 95f1b96ba86c610aeeb8b30c35d1254a962f5edd Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Wed, 5 Feb 2014 22:28:41 -0800 Subject: added removeLastObject() --- src/core/basetypes/MCArray.cc | 5 +++++ src/core/basetypes/MCArray.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/core/basetypes/MCArray.cc b/src/core/basetypes/MCArray.cc index c4c0fee1..804f796c 100644 --- a/src/core/basetypes/MCArray.cc +++ b/src/core/basetypes/MCArray.cc @@ -180,6 +180,11 @@ Object * Array::lastObject() return objectAtIndex(count() - 1); } +void Array::removeLastObject() +{ + removeObjectAtIndex(count() - 1); +} + bool Array::containsObject(Object * obj) { return (indexOfObject(obj) != -1); diff --git a/src/core/basetypes/MCArray.h b/src/core/basetypes/MCArray.h index cbf65b82..a26e34d8 100644 --- a/src/core/basetypes/MCArray.h +++ b/src/core/basetypes/MCArray.h @@ -32,6 +32,7 @@ namespace mailcore { virtual void addObjectsFromArray(Array * array); virtual Object * lastObject(); + virtual void removeLastObject(); virtual bool containsObject(Object * obj); virtual Array * sortedArray(int (* compare)(void * a, void * b, void * context), void * context); -- cgit v1.2.3 From 9edebd8221a3407704880de8d98226c24d88e6b1 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Wed, 5 Feb 2014 22:56:18 -0800 Subject: Render text as HTML --- src/core/basetypes/MCString.cc | 83 ++++++++++++++++++++++++++++++++++++- src/core/basetypes/MCString.h | 1 + src/core/renderer/MCHTMLRenderer.cc | 3 +- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/src/core/basetypes/MCString.cc b/src/core/basetypes/MCString.cc index 26e2f931..054cbb80 100644 --- a/src/core/basetypes/MCString.cc +++ b/src/core/basetypes/MCString.cc @@ -26,6 +26,7 @@ #include "MCValue.h" #include "MCHTMLCleaner.h" #include "MCBase64.h" +#include "MCIterator.h" using namespace mailcore; @@ -1744,7 +1745,7 @@ String * String::flattenHTMLAndShowBlockquoteAndLink(bool showBlockquote, bool s String * result = String::string(); xmlSAXHandler handler; bzero(&handler, sizeof(xmlSAXHandler)); - handler.characters = &charactersParsed; + handler.characters = charactersParsed; handler.startElement = elementStarted; handler.endElement = elementEnded; handler.comment = commentParsed; @@ -2116,6 +2117,86 @@ String * String::cleanedHTMLString() return HTMLCleaner::cleanHTML(this); } +String * String::htmlMessageContent() +{ + String * str = this; + + Array * lines = str->componentsSeparatedByString(MCSTR("\n")); + + while (1) { + if (lines->count() == 0) { + break; + } + + if (((String *) lines->lastObject())->length() > 0) { + break; + } + + lines->removeLastObject(); + } + + String * localString; + int state; + localString = String::string(); + + String * quoted = NULL; + state = 0; + mc_foreacharray(String, line, lines) { + if (state == 0) { + if (line->hasPrefix(MCSTR(">"))) { + state = 1; + quoted = new String(); + int i = 1; + while (i < line->length()) { + if (line->characterAtIndex(i) != ' ') { + break; + } + i ++; + } + quoted->appendString(line->substringFromIndex(i)); + quoted->appendString(MCSTR("\n")); + } + else { + localString->appendString(line->htmlEncodedString()); + localString->appendString(MCSTR("
")); + } + } + else if (state == 1) { + if (line->hasPrefix(MCSTR(">"))) { + int i = 1; + while (i < line->length()) { + if (line->characterAtIndex(i) != ' ') { + break; + } + i ++; + } + quoted->appendString(line->substringFromIndex(i)); + quoted->appendString(MCSTR("\n")); + } + else { + if (quoted != NULL) { + localString->appendString(MCSTR("
")); + localString->appendString(quoted->htmlMessageContent()); + localString->appendString(MCSTR("
")); + MC_SAFE_RELEASE(quoted); + state = 0; + } + localString->appendString(line->htmlEncodedString()); + localString->appendString(MCSTR("
")); + } + } + } + + if (quoted != nil) { + localString->appendString(MCSTR("
")); + localString->appendString(quoted); + localString->appendString(MCSTR("
")); + MC_SAFE_RELEASE(quoted); + } + + return localString; +} + bool String::isEqualCaseInsensitive(String * otherString) { return caseInsensitiveCompare(otherString) == 0; diff --git a/src/core/basetypes/MCString.h b/src/core/basetypes/MCString.h index 2afd0e7b..49e0a5ac 100644 --- a/src/core/basetypes/MCString.h +++ b/src/core/basetypes/MCString.h @@ -108,6 +108,7 @@ namespace mailcore { virtual String * htmlEncodedString(); virtual String * cleanedHTMLString(); + virtual String * htmlMessageContent(); virtual Data * decodedBase64Data(); diff --git a/src/core/renderer/MCHTMLRenderer.cc b/src/core/renderer/MCHTMLRenderer.cc index 071d7523..45c3a77a 100644 --- a/src/core/renderer/MCHTMLRenderer.cc +++ b/src/core/renderer/MCHTMLRenderer.cc @@ -266,8 +266,9 @@ static String * htmlForAbstractSinglePart(AbstractPart * part, htmlRendererConte return NULL; String * str = data->stringWithDetectedCharset(charset, false); + str = str->htmlMessageContent(); context->firstRendered = true; - return str->htmlEncodedString(); + return str; } else if (mimeType->isEqual(MCSTR("text/html"))) { String * charset = part->charset(); -- cgit v1.2.3 From 1180f5a8d4fdf97a0939ffa00b0380444fc84912 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Wed, 5 Feb 2014 23:07:49 -0800 Subject: Don't install cmake --- scripts/travis/before-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis/before-script.sh b/scripts/travis/before-script.sh index b8753159..74a3fa31 100755 --- a/scripts/travis/before-script.sh +++ b/scripts/travis/before-script.sh @@ -3,4 +3,4 @@ set -e brew update #brew install xctool -brew install cmake +#brew install cmake -- cgit v1.2.3 From e451b9d5497f15c3234f1d2d72e4f4f81522cd48 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Thu, 6 Feb 2014 19:51:24 -0800 Subject: Fixed removeRange() implementation --- src/core/basetypes/MCIndexSet.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/basetypes/MCIndexSet.cc b/src/core/basetypes/MCIndexSet.cc index ae54f8ff..4306f5ff 100644 --- a/src/core/basetypes/MCIndexSet.cc +++ b/src/core/basetypes/MCIndexSet.cc @@ -277,6 +277,9 @@ void IndexSet::removeRange(Range range) int left = -1; int right = -1; int leftRangeIndex = leftRangeIndexForIndex(range.location); + if (leftRangeIndex >= mCount) { + leftRangeIndex = mCount - 1; + } for(int i = leftRangeIndex ; i < mCount ; i ++) { if (RangeHasIntersection(mRanges[i], range)) { IndexSet * indexSet = RangeRemoveRange(mRanges[i], range); -- cgit v1.2.3 From 6d0591c40cb8adb91899df151a4e317a72401fc6 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Sun, 9 Feb 2014 21:51:08 -0800 Subject: Fixed serialization of HashMap --- src/core/basetypes/MCHashMap.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/basetypes/MCHashMap.cc b/src/core/basetypes/MCHashMap.cc index 41266c1b..536dbee1 100644 --- a/src/core/basetypes/MCHashMap.cc +++ b/src/core/basetypes/MCHashMap.cc @@ -312,7 +312,7 @@ void HashMap::importSerializable(HashMap * serializable) else { key = Object::objectWithSerializable((HashMap *) serializedKey); } - Object * value = Object::objectWithSerializable((HashMap *) keys->objectAtIndex(i)); + Object * value = Object::objectWithSerializable((HashMap *) values->objectAtIndex(i)); setObjectForKey(key, value); } } -- cgit v1.2.3 From af94fa92ae221b9548ee7e8d4930008d382973ce Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Tue, 11 Feb 2014 10:55:22 -0800 Subject: Don't remove empty div elements. Tidy shouldn't be removing any empty dom elements like
. Let the browser determine how it should be displayed. --- src/core/basetypes/MCHTMLCleaner.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/basetypes/MCHTMLCleaner.cc b/src/core/basetypes/MCHTMLCleaner.cc index 45271c10..04b83763 100644 --- a/src/core/basetypes/MCHTMLCleaner.cc +++ b/src/core/basetypes/MCHTMLCleaner.cc @@ -34,6 +34,7 @@ String * HTMLCleaner::cleanHTML(String * input) Data * data = input->dataUsingEncoding("utf-8"); tidyBufAppend(&docbuf, data->bytes(), data->length()); + tidyOptSetBool(tdoc, TidyDropEmptyElems, no); tidyOptSetBool(tdoc, TidyXhtmlOut, yes); tidySetCharEncoding(tdoc, "utf8"); tidyOptSetBool(tdoc, TidyForceOutput, yes); -- cgit v1.2.3