[evolution/wip/mcrha/webkit-jsc-api] Correct and add tests for EvoConvert.ToPlainText() with quoted text
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip/mcrha/webkit-jsc-api] Correct and add tests for EvoConvert.ToPlainText() with quoted text
- Date: Thu, 30 Jan 2020 15:27:50 +0000 (UTC)
commit 4c0fd71751104f3f5d1f895edeb6fc130b18b1cb
Author: Milan Crha <mcrha redhat com>
Date: Thu Jan 30 16:29:00 2020 +0100
Correct and add tests for EvoConvert.ToPlainText() with quoted text
data/webkit/e-convert.js | 45 ++++++++++---
src/e-util/test-web-view-jsc.c | 150 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 185 insertions(+), 10 deletions(-)
---
diff --git a/data/webkit/e-convert.js b/data/webkit/e-convert.js
index 5bb949ba5d..7ce8a897df 100644
--- a/data/webkit/e-convert.js
+++ b/data/webkit/e-convert.js
@@ -336,7 +336,19 @@ EvoConvert.calcLineLetters = function(line)
return len;
}
-EvoConvert.formatParagraph = function(str, ltr, align, indent, whiteSpace, wrapWidth, extraIndent, liText)
+EvoConvert.getQuotePrefix = function(quoteLevel, ltr)
+{
+ var prefix = "";
+
+ if (quoteLevel > 0) {
+ prefix = ltr ? "> " : " <";
+ prefix = prefix.repeat(quoteLevel);
+ }
+
+ return prefix;
+}
+
+EvoConvert.formatParagraph = function(str, ltr, align, indent, whiteSpace, wrapWidth, extraIndent, liText,
quoteLevel)
{
if (!str || str == "")
return liText ? liText : str;
@@ -488,7 +500,10 @@ EvoConvert.formatParagraph = function(str, ltr, align, indent, whiteSpace, wrapW
worker.commit(ii);
}
} else {
- lines[lines.length] = str.endsWith("\n") ? str.substr(0, str.length - 1) : str;
+ if (str.endsWith("\n"))
+ str = str.substr(0, str.length - 1);
+
+ lines = str.split("\n");
}
var extraIndentStr = extraIndent > 0 ? " ".repeat(extraIndent) : null;
@@ -578,6 +593,13 @@ EvoConvert.formatParagraph = function(str, ltr, align, indent, whiteSpace, wrapW
line = line + indent;
}
+ if (quoteLevel > 0) {
+ if (ltr)
+ line = EvoConvert.getQuotePrefix(quoteLevel, ltr) + line;
+ else
+ line = line + EvoConvert.getQuotePrefix(quoteLevel, ltr);
+ }
+
str += line + "\n";
}
@@ -603,7 +625,7 @@ EvoConvert.ImgToText = function(img)
return txt;
}
-EvoConvert.extractElemText = function(elem, normalDivWidth)
+EvoConvert.extractElemText = function(elem, normalDivWidth, quoteLevel)
{
if (!elem)
return "";
@@ -619,13 +641,13 @@ EvoConvert.extractElemText = function(elem, normalDivWidth)
if (!node)
continue;
- str += EvoConvert.processNode(node, normalDivWidth);
+ str += EvoConvert.processNode(node, normalDivWidth, quoteLevel);
}
return str;
}
-EvoConvert.processNode = function(node, normalDivWidth)
+EvoConvert.processNode = function(node, normalDivWidth, quoteLevel)
{
var str = "";
@@ -707,17 +729,20 @@ EvoConvert.processNode = function(node, normalDivWidth)
width = normalDivWidth;
}
- str = EvoConvert.formatParagraph(EvoConvert.extractElemText(node, normalDivWidth),
ltr, align, indent, whiteSpace, width, extraIndent, liText);
+ str = EvoConvert.formatParagraph(EvoConvert.extractElemText(node, normalDivWidth,
quoteLevel), ltr, align, indent, whiteSpace, width, extraIndent, liText, quoteLevel);
} else if (node.tagName == "PRE") {
- str = EvoConvert.formatParagraph(EvoConvert.extractElemText(node, normalDivWidth),
ltr, align, indent, "pre", -1, 0, "");
+ str = EvoConvert.formatParagraph(EvoConvert.extractElemText(node, normalDivWidth,
quoteLevel), ltr, align, indent, "pre", -1, 0, "", quoteLevel);
} else if (node.tagName == "BR") {
str = "\n";
} else if (node.tagName == "IMG") {
str = EvoConvert.ImgToText(node);
} else {
- str = EvoConvert.extractElemText(node, normalDivWidth);
+ var isBlockquote = node.tagName == "BLOCKQUOTE";
+
+ str = EvoConvert.extractElemText(node, normalDivWidth, quoteLevel + (isBlockquote ? 1
: 0));
- if (str != "\n" && ((style && style.display == "block") || node.tagName ==
"ADDRESS")) {
+ if ((!isBlockquote || !str.endsWith("\n")) &&
+ str != "\n" && ((style && style.display == "block") || node.tagName ==
"ADDRESS")) {
str += "\n";
}
}
@@ -772,7 +797,7 @@ EvoConvert.ToPlainText = function(element, normalDivWidth)
if (!node)
continue;
- str += EvoConvert.processNode(node, normalDivWidth);
+ str += EvoConvert.processNode(node, normalDivWidth, 0);
}
return str;
diff --git a/src/e-util/test-web-view-jsc.c b/src/e-util/test-web-view-jsc.c
index 0194726f5e..a53f46ae56 100644
--- a/src/e-util/test-web-view-jsc.c
+++ b/src/e-util/test-web-view-jsc.c
@@ -2539,6 +2539,155 @@ test_convert_to_plain (TestFixture *fixture)
}
}
+static void
+test_convert_to_plain_quoted (TestFixture *fixture)
+{
+ #define HTML(_body) ("<html><head><style><!-- span.Apple-tab-span { white-space:pre; }
--></style></head><body style='font-family:monospace;'>" _body "</body></html>")
+
+ struct _tests {
+ const gchar *html;
+ const gchar *plain;
+ gint normal_div_width;
+ } tests[] = {
+ /* 0 */ { HTML ("<div style='width:10ch;'>123 456 789 123</div>"
+ "<blockquote type='cite'>"
+ "<div style='width:8ch;'>123 456 789 1 2 3 4</div>"
+ "<div style='width:8ch;'>abc def ghi j k l m</div>"
+ "</blockquote>"
+ "<div>end</div>"),
+ "123 456\n"
+ "789 123\n"
+ "> 123 456\n"
+ "> 789 1 2\n"
+ "> 3 4\n"
+ "> abc def\n"
+ "> ghi j k\n"
+ "> l m\n"
+ "end\n",
+ 10 },
+ /* 1 */ { HTML ("<div style='width:12ch;'>123 456</div>"
+ "<blockquote type='cite'>"
+ "<div style='width:10ch;'>123 456</div>"
+ "<blockquote>"
+ "<div style='width:8ch;'>789 1 2 3 4</div>"
+ "</blockquote>"
+ "<div style='width:10ch;'>mid</div>"
+ "<blockquote>"
+ "<blockquote>"
+ "<div style='width:6ch;'>abc</div>"
+ "<div style='width:6ch;'>def ghi j k l m</div>"
+ "</blockquote>"
+ "<div style='width:8ch;'>abc d e f g h i j</div>"
+ "</blockquote>"
+ "<div style='width:10ch;'>l1 a b c d e f g</div>"
+ "</blockquote>"
+ "<div>end</div>"),
+ "123 456\n"
+ "> 123 456\n"
+ "> > 789 1 2\n"
+ "> > 3 4\n"
+ "> mid\n"
+ "> > > abc\n"
+ "> > > def\n"
+ "> > > ghi j\n"
+ "> > > k l m\n"
+ "> > abc d e\n"
+ "> > f g h i\n"
+ "> > j\n"
+ "> l1 a b c d\n"
+ "> e f g\n"
+ "end\n",
+ 10 },
+ /* 2 */ { HTML ("<div style='width:10ch;'>123 456<br>789 123</div>"
+ "<blockquote type='cite'>"
+ "<div style='width:8ch;'>123 456<br>789 1 2 3 4</div>"
+ "<blockquote type='cite'>"
+ "<div style='width:6ch;'>abc<br>def g h i j k</div>"
+ "</blockquote>"
+ "</blockquote>"
+ "<div>end</div>"),
+ "123 456\n"
+ "789 123\n"
+ "> 123 456\n"
+ "> 789 1 2\n"
+ "> 3 4\n"
+ "> > abc\n"
+ "> > def g\n"
+ "> > h i j\n"
+ "> > k\n"
+ "end\n",
+ 10 },
+ /* 3 */ { HTML ("<p style='width:10ch;'>123 456<br>789 123</p>"
+ "<blockquote type='cite'>"
+ "<p style='width:8ch;'>123 456<br>789 1 2 3 4</p>"
+ "<blockquote type='cite'>"
+ "<p style='width:6ch;'>abc<br>def g h i j k</p>"
+ "</blockquote>"
+ "</blockquote>"
+ "<p>end</p>"),
+ "123 456\n"
+ "789 123\n"
+ "> 123 456\n"
+ "> 789 1 2\n"
+ "> 3 4\n"
+ "> > abc\n"
+ "> > def g\n"
+ "> > h i j\n"
+ "> > k\n"
+ "end\n",
+ 10 },
+ /* 4 */ { HTML ("<pre>123 456 789 123</pre>"
+ "<blockquote type='cite'>"
+ "<pre>123 456 789 1 2 3 4</pre>"
+ "<blockquote type='cite'>"
+ "<pre>abc def g h i j k</pre>"
+ "</blockquote>"
+ "</blockquote>"
+ "<pre>end</pre>"),
+ "123 456 789 123\n"
+ "> 123 456 789 1 2 3 4\n"
+ "> > abc def g h i j k\n"
+ "end\n",
+ 10 },
+ /* 5 */ { HTML ("<pre>123 456\n789 123</pre>"
+ "<blockquote type='cite'>"
+ "<pre>123 456\n789 1 2 3 4</pre>"
+ "<blockquote type='cite'>"
+ "<pre>abc def\ng h\ni j k</pre>"
+ "</blockquote>"
+ "<pre>a b\nc\nd e f</pre>"
+ "</blockquote>"
+ "<pre>end</pre>"),
+ "123 456\n"
+ "789 123\n"
+ "> 123 456\n"
+ "> 789 1 2 3 4\n"
+ "> > abc def\n"
+ "> > g h\n"
+ "> > i j k\n"
+ "> a b\n"
+ "> c\n"
+ "> d e f\n"
+ "end\n",
+ 10 }
+ };
+
+ #undef HTML
+
+ gchar *script;
+ gint ii;
+
+ for (ii = 0; ii < G_N_ELEMENTS (tests); ii++) {
+ test_utils_load_string (fixture, tests[ii].html);
+
+ script = e_web_view_jsc_printf_script ("EvoConvert.ToPlainText(document.body, %d);",
tests[ii].normal_div_width);
+
+ test_utils_jsc_call_string_and_verify (fixture, script, tests[ii].plain);
+
+ g_free (script);
+ }
+}
+
gint
main (gint argc,
gchar *argv[])
@@ -2570,6 +2719,7 @@ main (gint argc,
test_utils_add_test ("/EWebView/GetContent", test_get_content);
test_utils_add_test ("/EWebView/GetElementFromPoint", test_get_element_from_point);
test_utils_add_test ("/EWebView/ConvertToPlain", test_convert_to_plain);
+ test_utils_add_test ("/EWebView/ConvertToPlainQuoted", test_convert_to_plain_quoted);
res = g_test_run ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]