[evolution/wip/webkit-composer: 765/966] Convert HTML emails to plain text when opening them in plain text mode
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip/webkit-composer: 765/966] Convert HTML emails to plain text when opening them in plain text mode
- Date: Wed, 23 Apr 2014 10:57:44 +0000 (UTC)
commit 218c7f996dc952f46744e418f5f63ce28096123b
Author: Tomas Popela <tpopela redhat com>
Date: Fri Oct 11 14:39:38 2013 +0200
Convert HTML emails to plain text when opening them in plain text mode
To do that we are creating another WebKitWebView, loading given HTML
there and after it's loaded we take the innerText of the body.
e-util/e-editor-widget.c | 148 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 144 insertions(+), 4 deletions(-)
---
diff --git a/e-util/e-editor-widget.c b/e-util/e-editor-widget.c
index 15b1b6b..d26c1b5 100644
--- a/e-util/e-editor-widget.c
+++ b/e-util/e-editor-widget.c
@@ -2278,7 +2278,7 @@ process_elements (WebKitDOMNode *node,
g_string_append (buffer, content);
g_free (tmp);
g_free (content);
- } else {
+ } else if (!WEBKIT_DOM_IS_COMMENT (child)) {
/* Leave caret position untouched */
if (element_has_id (WEBKIT_DOM_ELEMENT (child), "-x-evo-caret-position")) {
if (!process_nodes) {
@@ -2456,7 +2456,8 @@ e_editor_widget_set_html_mode (EEditorWidget *widget,
plain = changing_composer_mode_get_text_plain (widget);
if (*plain)
- e_editor_widget_set_text_html (widget, plain);
+ webkit_web_view_load_string (
+ WEBKIT_WEB_VIEW (widget), plain, NULL, NULL, "file://");
g_free (plain);
}
@@ -2662,6 +2663,140 @@ e_editor_widget_get_text_plain (EEditorWidget *widget)
return g_string_free (plain_text, FALSE);
}
+static void
+html_plain_text_convertor_load_status_changed (WebKitWebView *web_view,
+ GParamSpec *pspec,
+ EEditorWidget *widget)
+{
+ WebKitLoadStatus status;
+ WebKitDOMDocument *document_convertor;
+ WebKitDOMDocument *document;
+ WebKitDOMElement *paragraph;
+ WebKitDOMElement *blockquote;
+ gchar *inner_text;
+
+ status = webkit_web_view_get_load_status (web_view);
+ if (status != WEBKIT_LOAD_FINISHED)
+ return;
+
+ document_convertor = webkit_web_view_get_dom_document (web_view);
+ document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (widget));
+
+ /* Get innertText from convertor */
+ inner_text = webkit_dom_html_element_get_inner_text (webkit_dom_document_get_body
(document_convertor));
+ /* And set it as body to composer */
+ paragraph = webkit_dom_document_get_element_by_id (document, "-x-evo-input-start");
+ blockquote = webkit_dom_document_query_selector (document_convertor, "blockquote[type|=cite]", NULL);
+
+ if (!paragraph) {
+ WebKitDOMElement *element;
+
+ element = webkit_dom_document_create_element (document, "div", NULL);
+ element_add_class (element, "-x-evo-paragraph");
+ webkit_dom_html_element_set_id (WEBKIT_DOM_HTML_ELEMENT (element), "-x-evo-input-start");
+ webkit_dom_node_append_child (
+ WEBKIT_DOM_NODE (webkit_dom_document_get_body (document)),
+ WEBKIT_DOM_NODE (element),
+ NULL);
+ paragraph = webkit_dom_document_get_element_by_id (document, "-x-evo-input-start");
+ }
+
+ if (paragraph) {
+ if (blockquote) {
+ EEditorSelection *selection;
+ WebKitDOMNode *blockquote_clone;
+ WebKitDOMElement *pre;
+ gchar *style_value;
+ WebKitDOMNodeList *list;
+ gint length, ii;
+
+ selection = e_editor_widget_get_selection (widget);
+ e_editor_selection_save_caret_position (selection);
+
+ blockquote_clone = webkit_dom_node_clone_node (WEBKIT_DOM_NODE (blockquote), FALSE);
+ pre = webkit_dom_document_create_element (document, "pre", NULL);
+
+ style_value =
+ g_strdup_printf (
+ "word-wrap: normal; "
+ "width: %dch",
+ e_editor_selection_get_word_wrap_length (selection));
+
+ webkit_dom_element_set_attribute (
+ WEBKIT_DOM_ELEMENT (blockquote_clone),
+ "style",
+ style_value,
+ NULL);
+
+ g_free (style_value);
+
+ webkit_dom_html_element_set_inner_text (
+ WEBKIT_DOM_HTML_ELEMENT (pre), inner_text, NULL);
+ webkit_dom_node_append_child (
+ blockquote_clone,
+ WEBKIT_DOM_NODE (pre),
+ NULL);
+ webkit_dom_node_insert_before (
+ webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (paragraph)),
+ blockquote_clone,
+ webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (paragraph)),
+ NULL);
+
+ e_editor_selection_wrap_paragraph (
+ selection,
+ pre);
+
+ /* Clean after wrapping */
+ list = webkit_dom_document_query_selector_all (
+ document,
+ "br.-x-evo-wrap-br",
+ NULL);
+
+ length = webkit_dom_node_list_get_length (list);
+ for (ii = 0; ii < length; ii++) {
+ WebKitDOMNode *br;
+
+ br = webkit_dom_node_list_item (list, ii);
+
+ webkit_dom_element_remove_attribute (
+ WEBKIT_DOM_ELEMENT (br),
+ "class");
+ }
+
+ e_editor_widget_quote_plain_text (widget);
+
+ e_editor_selection_restore_caret_position (selection);
+ } else {
+ webkit_dom_html_element_set_inner_text (
+ WEBKIT_DOM_HTML_ELEMENT (paragraph), inner_text, NULL);
+ }
+ }
+
+ e_editor_widget_force_spellcheck (widget);
+ g_free (inner_text);
+}
+
+static void
+convert_html_to_plain_text (EEditorWidget *widget,
+ const gchar *html)
+{
+ /* FIXME Clean this convertor's web_view */
+ WebKitWebView *web_view = WEBKIT_WEB_VIEW(webkit_web_view_new());
+ WebKitWebSettings *settings = webkit_web_view_get_settings (web_view);
+
+ g_object_set (
+ G_OBJECT (settings),
+ "enable-scripts", FALSE,
+ "enable-plugins", FALSE,
+ NULL);
+
+ g_signal_connect (
+ web_view, "notify::load-status",
+ G_CALLBACK (html_plain_text_convertor_load_status_changed), widget);
+
+ webkit_web_view_load_string (web_view, html, NULL, NULL, "file://");
+}
+
/**
* e_editor_widget_set_text_html:
* @widget: an #EEditorWidget
@@ -2675,8 +2810,13 @@ e_editor_widget_set_text_html (EEditorWidget *widget,
{
widget->priv->reload_in_progress = TRUE;
- webkit_web_view_load_string (
- WEBKIT_WEB_VIEW (widget), text, NULL, NULL, "file://");
+ /* Only convert messages that are in HTML */
+ if (strstr (text, "<!-- text/html -->") && !widget->priv->html_mode) {
+ convert_html_to_plain_text (widget, text);
+ } else {
+ webkit_web_view_load_string (
+ WEBKIT_WEB_VIEW (widget), text, NULL, NULL, "file://");
+ }
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]