[geary: 1/2] Add plaintext quote marker to blockquote lines in one pass
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary: 1/2] Add plaintext quote marker to blockquote lines in one pass
- Date: Wed, 9 Jan 2019 00:50:18 +0000 (UTC)
commit a9efe8fd3a35bfd4dbe49c790c65942962fbeee1
Author: Alex Henrie <alexhenrie24 gmail com>
Date: Tue Jan 1 17:55:28 2019 -0700
Add plaintext quote marker to blockquote lines in one pass
test/js/composer-page-state-test.vala | 55 ----------------------
ui/composer-web-view.js | 89 ++++++++---------------------------
2 files changed, 19 insertions(+), 125 deletions(-)
---
diff --git a/test/js/composer-page-state-test.vala b/test/js/composer-page-state-test.vala
index 94611932..ad8098fd 100644
--- a/test/js/composer-page-state-test.vala
+++ b/test/js/composer-page-state-test.vala
@@ -23,8 +23,6 @@ class ComposerPageStateTest : ClientWebViewTestCase<ComposerWebView> {
add_test("get_text_with_nested_quote", get_text_with_nested_quote);
add_test("contains_keywords", contains_keywords);
- add_test("quote_lines", quote_lines);
- add_test("resolve_nesting", resolve_nesting);
add_test("replace_non_breaking_space", replace_non_breaking_space);
try {
@@ -271,59 +269,6 @@ unknown://example6.com
}
}
- public void resolve_nesting() throws Error {
- load_body_fixture();
- unichar q_marker = Geary.RFC822.Utils.QUOTE_MARKER;
- unichar q_start = '';
- unichar q_end = '';
- string js_no_quote = "foo";
- string js_spaced_quote = @"foo $(q_start)0$(q_end) bar";
- string js_leading_quote = @"$(q_start)0$(q_end) bar";
- string js_hanging_quote = @"foo $(q_start)0$(q_end)";
- string js_cosy_quote1 = @"foo$(q_start)0$(q_end)bar";
- string js_cosy_quote2 = @"foo$(q_start)0$(q_end)$(q_start)1$(q_end)bar";
- string js_values = "['quote1','quote2']";
- try {
- assert(WebKitUtil.to_string(run_javascript(@"ComposerPageState.resolveNesting('$(js_no_quote)',
$(js_values));")) ==
- @"foo");
-
assert(WebKitUtil.to_string(run_javascript(@"ComposerPageState.resolveNesting('$(js_spaced_quote)',
$(js_values));")) ==
- @"foo $(q_marker)quote1 bar");
-
assert(WebKitUtil.to_string(run_javascript(@"ComposerPageState.resolveNesting('$(js_leading_quote)',
$(js_values));")) ==
- @"$(q_marker)quote1 bar");
-
assert(WebKitUtil.to_string(run_javascript(@"ComposerPageState.resolveNesting('$(js_hanging_quote)',
$(js_values));")) ==
- @"foo $(q_marker)quote1");
-
assert(WebKitUtil.to_string(run_javascript(@"ComposerPageState.resolveNesting('$(js_cosy_quote1)',
$(js_values));")) ==
- @"foo$(q_marker)quote1bar");
-
assert(WebKitUtil.to_string(run_javascript(@"ComposerPageState.resolveNesting('$(js_cosy_quote2)',
$(js_values));")) ==
- @"foo$(q_marker)quote1$(q_marker)quote2bar");
- } catch (Geary.JS.Error err) {
- print("Geary.JS.Error: %s\n", err.message);
- assert_not_reached();
- } catch (Error err) {
- print("WKError: %s\n", err.message);
- assert_not_reached();
- }
- }
-
- public void quote_lines() throws Error {
- load_body_fixture();
- unichar q_marker = Geary.RFC822.Utils.QUOTE_MARKER;
- try {
- assert(WebKitUtil.to_string(run_javascript("ComposerPageState.quoteLines('');")) ==
- @"$(q_marker)");
- assert(WebKitUtil.to_string(run_javascript("ComposerPageState.quoteLines('line1');")) ==
- @"$(q_marker)line1");
- assert(WebKitUtil.to_string(run_javascript("ComposerPageState.quoteLines('line1\\nline2');")) ==
- @"$(q_marker)line1\n$(q_marker)line2");
- } catch (Geary.JS.Error err) {
- print("Geary.JS.Error: %s\n", err.message);
- assert_not_reached();
- } catch (Error err) {
- print("WKError: %s\n", err.message);
- assert_not_reached();
- }
- }
-
public void replace_non_breaking_space() throws Error {
load_body_fixture();
string single_nbsp = "a b";
diff --git a/ui/composer-web-view.js b/ui/composer-web-view.js
index 84bfa2d3..6425cb61 100644
--- a/ui/composer-web-view.js
+++ b/ui/composer-web-view.js
@@ -13,8 +13,6 @@ let ComposerPageState = function() {
this.init.apply(this, arguments);
};
ComposerPageState.KEYWORD_SPLIT_REGEX = /[\s]+/g;
-ComposerPageState.QUOTE_START = "\x91"; // private use one
-ComposerPageState.QUOTE_END = "\x92"; // private use two
ComposerPageState.QUOTE_MARKER = "\x7f"; // delete
ComposerPageState.PROTOCOL_REGEX =
/^(aim|apt|bitcoin|cvs|ed2k|ftp|file|finger|git|gtalk|http|https|irc|ircs|irc6|lastfm|ldap|ldaps|magnet|news|nntp|rsync|sftp|skype|smb|sms|svn|telnet|tftp|ssh|webcal|xmpp):/i;
// Taken from Geary.HTML.URL_REGEX, without the inline modifier (?x)
@@ -330,7 +328,8 @@ ComposerPageState.prototype = {
return parent.innerHTML;
},
getText: function() {
- return ComposerPageState.htmlToQuotedText(document.body);
+ let text = ComposerPageState.htmlToText(document.body);
+ return ComposerPageState.replaceNonBreakingSpace(text);
},
setRichText: function(enabled) {
if (enabled) {
@@ -440,25 +439,6 @@ ComposerPageState.cleanPart = function(part, removeIfEmpty) {
return part;
};
-/**
- * Convert a HTML DOM tree to plain text with delineated quotes.
- *
- * Lines are delinated using LF. Quoted lines are prefixed with
- * `ComposerPageState.QUOTE_MARKER`, where the number of markers
- * indicates the depth of nesting of the quote.
- */
-ComposerPageState.htmlToQuotedText = function(root) {
- let bqTexts = [];
-
- text = ComposerPageState.htmlToTextAndQuotes(root, bqTexts);
-
- // Reassemble plain text out of parts, and replace non-breaking
- // space with regular space.
- text = ComposerPageState.resolveNesting(text, bqTexts);
-
- return ComposerPageState.replaceNonBreakingSpace(text);
-};
-
/**
* Gets plain text that adequately represents the information in the HTML
*
@@ -466,10 +446,11 @@ ComposerPageState.htmlToQuotedText = function(root) {
* underscores around underlined text. Link URLs are inserted after the link
* text.
*
- * Blockquotes are extracted and replaced with tokens deliminated with the
- * characters QUOTE_START and QUOTE_END (from a unicode private use block).
+ * Each line of a blockquote is prefixed with
+ * `ComposerPageState.QUOTE_MARKER`, where the number of markers indicates
+ * the depth of nesting of the quote.
*/
-ComposerPageState.htmlToTextAndQuotes = function(root, bqTexts) {
+ComposerPageState.htmlToText = function(root) {
let parentStyle = window.getComputedStyle(root);
let text = "";
@@ -509,37 +490,38 @@ ComposerPageState.htmlToTextAndQuotes = function(root, bqTexts) {
if (node.textContent == node.href) {
text += "<" + node.href + ">";
} else {
- text += ComposerPageState.htmlToTextAndQuotes(node, bqTexts);
+ text += ComposerPageState.htmlToText(node);
text += " <" + node.href + ">";
}
break;
case "b":
case "strong":
- text += "*" + ComposerPageState.htmlToTextAndQuotes(node, bqTexts) + "*";
+ text += "*" + ComposerPageState.htmlToText(node) + "*";
break;
case "blockquote":
- let bqText = ComposerPageState.htmlToTextAndQuotes(node, bqTexts);
- text += (
- ComposerPageState.QUOTE_START
- + bqTexts.length.toString()
- + ComposerPageState.QUOTE_END
- );
- bqTexts.push(bqText);
+ let bqText = ComposerPageState.htmlToText(node);
+ // If there is a newline at the end of the quote, remove it
+ // After this switch we ensure that there is a newline after the quote
+ bqText = bqText.replace(/\n$/, "");
+ let lines = bqText.split("\n");
+ for (let i = 0; i < lines.length; i++)
+ lines[i] = ComposerPageState.QUOTE_MARKER + lines[i];
+ text += lines.join("\n");
break;
case "br":
text += "\n";
break;
case "i":
case "em":
- text += "/" + ComposerPageState.htmlToTextAndQuotes(node, bqTexts) + "/";
+ text += "/" + ComposerPageState.htmlToText(node) + "/";
break;
case "u":
- text += "_" + ComposerPageState.htmlToTextAndQuotes(node, bqTexts) + "_";
+ text += "_" + ComposerPageState.htmlToText(node) + "_";
break;
case "#comment":
break;
default:
- text += ComposerPageState.htmlToTextAndQuotes(node, bqTexts);
+ text += ComposerPageState.htmlToText(node);
break;
}
if (isBlock) {
@@ -607,39 +589,6 @@ ComposerPageState.linkify = function(node) {
}
};
-ComposerPageState.resolveNesting = function(text, values) {
- let tokenregex = new RegExp(
- ComposerPageState.QUOTE_START
- + "([0-9]+)"
- + ComposerPageState.QUOTE_END, "g"
- );
- return text.replace(tokenregex, function(match, p1, offset, str) {
- let key = new Number(p1);
-
- let value = "";
- if (key >= 0 && key < values.length) {
- let nested = ComposerPageState.resolveNesting(values[key], values);
- // If there is a newline at the end of the quote, remove it
- // htmltoTextandQuotes already ensured that there is a newline after the quote
- nested = nested.replace(/\n$/, "");
- value = ComposerPageState.quoteLines(nested);
- } else {
- console.error("Regex error in denesting blockquotes: Invalid key");
- }
- return value;
- });
-};
-
-/**
- * Prefixes each NL-delineated line with `ComposerPageState.QUOTE_MARKER`.
- */
-ComposerPageState.quoteLines = function(text) {
- let lines = text.split("\n");
- for (let i = 0; i < lines.length; i++)
- lines[i] = ComposerPageState.QUOTE_MARKER + lines[i];
- return lines.join("\n");
-};
-
/**
* Converts all non-breaking space chars to plain spaces.
*/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]