aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Matt Ronge <mronge@mronge.com>2014-02-11 13:40:32 -0600
committerGravatar Matt Ronge <mronge@mronge.com>2014-02-11 13:40:32 -0600
commitf63e036efe20190299774d2911a88a6e32ce267c (patch)
tree3e26b381d8dedccfdde11cf6fb3b1ea63bdea1e4
parent447501d0b6b18a00051801058f57d78190db0388 (diff)
parentc2ae30416dda25c5d8771bae716a09376d6d88c5 (diff)
Merge branch 'master' of github.com:MailCore/mailcore2
-rwxr-xr-xscripts/travis/before-script.sh2
-rw-r--r--src/core/basetypes/MCArray.cc5
-rw-r--r--src/core/basetypes/MCArray.h1
-rw-r--r--src/core/basetypes/MCHTMLCleaner.cc1
-rw-r--r--src/core/basetypes/MCHashMap.cc2
-rw-r--r--src/core/basetypes/MCIndexSet.cc3
-rw-r--r--src/core/basetypes/MCString.cc83
-rw-r--r--src/core/basetypes/MCString.h1
-rw-r--r--src/core/renderer/MCHTMLRenderer.cc3
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();