diff options
author | 2014-02-11 13:40:32 -0600 | |
---|---|---|
committer | 2014-02-11 13:40:32 -0600 | |
commit | f63e036efe20190299774d2911a88a6e32ce267c (patch) | |
tree | 3e26b381d8dedccfdde11cf6fb3b1ea63bdea1e4 | |
parent | 447501d0b6b18a00051801058f57d78190db0388 (diff) | |
parent | c2ae30416dda25c5d8771bae716a09376d6d88c5 (diff) |
Merge branch 'master' of github.com:MailCore/mailcore2
-rwxr-xr-x | scripts/travis/before-script.sh | 2 | ||||
-rw-r--r-- | src/core/basetypes/MCArray.cc | 5 | ||||
-rw-r--r-- | src/core/basetypes/MCArray.h | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCHTMLCleaner.cc | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCHashMap.cc | 2 | ||||
-rw-r--r-- | src/core/basetypes/MCIndexSet.cc | 3 | ||||
-rw-r--r-- | src/core/basetypes/MCString.cc | 83 | ||||
-rw-r--r-- | src/core/basetypes/MCString.h | 1 | ||||
-rw-r--r-- | src/core/renderer/MCHTMLRenderer.cc | 3 |
9 files changed, 97 insertions, 4 deletions
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 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); 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); 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); } } 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); 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("<br/>")); + } + } + 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("<blockquote type=\"cite\">")); + localString->appendString(quoted->htmlMessageContent()); + localString->appendString(MCSTR("</blockquote>")); + MC_SAFE_RELEASE(quoted); + state = 0; + } + localString->appendString(line->htmlEncodedString()); + localString->appendString(MCSTR("<br/>")); + } + } + } + + if (quoted != nil) { + localString->appendString(MCSTR("<blockquote type=\"cite\">")); + localString->appendString(quoted); + localString->appendString(MCSTR("</blockquote>")); + 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(); |