[evolution/gnome-3-16] EHTMLEditorSelection - Trailing space is lost when wrapping content



commit 9a1038abc5b20a0e447d92d5a69f317ca0c728a7
Author: Tomas Popela <tpopela redhat com>
Date:   Thu Apr 2 14:03:24 2015 +0200

    EHTMLEditorSelection - Trailing space is lost when wrapping content
    
    The thing is that the trailing space on the line is removed when wrapping,
    but never returned back when editing the same block after.

 e-util/e-html-editor-selection.c |   40 ++++++++++++++++++++++++++++++++++---
 e-util/e-html-editor-view.c      |   37 +++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 4 deletions(-)
---
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c
index 5a427ba..b0a044a 100644
--- a/e-util/e-html-editor-selection.c
+++ b/e-util/e-html-editor-selection.c
@@ -5724,6 +5724,23 @@ find_where_to_break_line (WebKitDOMNode *node,
        return ret_val;
 }
 
+static void
+mark_and_remove_leading_space (WebKitDOMDocument *document,
+                               WebKitDOMNode *node)
+{
+       WebKitDOMElement *element;
+
+       element = webkit_dom_document_create_element (document, "SPAN", NULL);
+       webkit_dom_element_set_attribute (element, "data-hidden-space", "", NULL);
+       webkit_dom_node_insert_before (
+               webkit_dom_node_get_parent_node (node),
+               WEBKIT_DOM_NODE (element),
+               node,
+               NULL);
+       webkit_dom_character_data_replace_data (
+               WEBKIT_DOM_CHARACTER_DATA (node), 0, 1, "", NULL);
+}
+
 static WebKitDOMElement *
 wrap_lines (EHTMLEditorSelection *selection,
            WebKitDOMNode *paragraph,
@@ -5843,6 +5860,23 @@ wrap_lines (EHTMLEditorSelection *selection,
                        start_node = node;
        }
 
+       if (start_node && WEBKIT_DOM_IS_ELEMENT (start_node)) {
+               WebKitDOMNodeList *list;
+
+               list = webkit_dom_element_query_selector_all (
+                       WEBKIT_DOM_ELEMENT (start_node), "span[data-hidden-space]", NULL);
+               len = webkit_dom_node_list_get_length (list);
+               for (ii = 0; ii < len; ii++) {
+                       WebKitDOMNode *hidden_space_node;
+
+                       hidden_space_node = webkit_dom_node_list_item (list, ii);
+                       webkit_dom_html_element_set_outer_text (
+                               WEBKIT_DOM_HTML_ELEMENT (hidden_space_node), " ", NULL);
+                       g_object_unref (hidden_space_node);
+               }
+               g_object_unref (list);
+       }
+
        len = 0;
        while (node) {
                gint offset = 0;
@@ -6019,8 +6053,7 @@ wrap_lines (EHTMLEditorSelection *selection,
                                        nd_content = webkit_dom_node_get_text_content (nd);
                                        if (nd_content && *nd_content) {
                                                if (g_str_has_prefix (nd_content, " "))
-                                                       webkit_dom_character_data_replace_data (
-                                                               WEBKIT_DOM_CHARACTER_DATA (nd), 0, 1, "", 
NULL);
+                                                       mark_and_remove_leading_space (document, nd);
                                                g_free (nd_content);
                                                nd_content = webkit_dom_node_get_text_content (nd);
                                                if (g_strcmp0 (nd_content, UNICODE_NBSP) == 0)
@@ -6052,8 +6085,7 @@ wrap_lines (EHTMLEditorSelection *selection,
                                        nd_content = webkit_dom_node_get_text_content (nd);
                                        if (nd_content && *nd_content) {
                                                if (g_str_has_prefix (nd_content, " "))
-                                                       webkit_dom_character_data_replace_data (
-                                                               WEBKIT_DOM_CHARACTER_DATA (nd), 0, 1, "", 
NULL);
+                                                       mark_and_remove_leading_space (document, nd);
                                                g_free (nd_content);
                                                nd_content = webkit_dom_node_get_text_content (nd);
                                                if (g_strcmp0 (nd_content, UNICODE_NBSP) == 0)
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index e2f6313..2ffbbf4 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -8759,10 +8759,12 @@ process_content_for_plain_text (EHTMLEditorView *view)
 static gchar *
 process_content_for_html (EHTMLEditorView *view)
 {
+       gint ii, length;
        gchar *html_content;
        WebKitDOMDocument *document;
        WebKitDOMElement *marker;
        WebKitDOMNode *node, *document_clone;
+       WebKitDOMNodeList *list;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        document_clone = webkit_dom_node_clone_node (
@@ -8791,6 +8793,18 @@ process_content_for_html (EHTMLEditorView *view)
        if (marker)
                remove_node (WEBKIT_DOM_NODE (marker));
 
+       list = webkit_dom_element_query_selector_all (
+               WEBKIT_DOM_ELEMENT (node), "span[data-hidden-space]", NULL);
+       length = webkit_dom_node_list_get_length (list);
+       for (ii = 0; ii < length; ii++) {
+               WebKitDOMNode *hidden_space_node;
+
+               hidden_space_node = webkit_dom_node_list_item (list, ii);
+               remove_node (hidden_space_node);
+               g_object_unref (hidden_space_node);
+       }
+       g_object_unref (list);
+
        process_elements (view, node, TRUE, FALSE, FALSE, NULL);
 
        html_content = webkit_dom_html_element_get_outer_html (
@@ -9204,6 +9218,28 @@ toggle_tables (EHTMLEditorView *view)
        g_object_unref (list);
 }
 
+static void
+replace_hidden_spaces (EHTMLEditorView *view)
+{
+       WebKitDOMDocument *document;
+       WebKitDOMNodeList *list;
+       gint ii, length;
+
+       document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
+       list = webkit_dom_document_query_selector_all (
+               document, "span[data-hidden-space]", NULL);
+       length = webkit_dom_node_list_get_length (list);
+       for (ii = 0; ii < length; ii++) {
+               WebKitDOMNode *hidden_space_node;
+
+               hidden_space_node = webkit_dom_node_list_item (list, ii);
+               webkit_dom_html_element_set_outer_text (
+                       WEBKIT_DOM_HTML_ELEMENT (hidden_space_node), " ", NULL);
+               g_object_unref (hidden_space_node);
+       }
+       g_object_unref (list);
+}
+
 /**
  * e_html_editor_view_set_html_mode:
  * @view: an #EHTMLEditorView
@@ -9280,6 +9316,7 @@ e_html_editor_view_set_html_mode (EHTMLEditorView *view,
                toggle_smileys (view);
                toggle_tables (view);
                remove_wrapping_from_view (view);
+               replace_hidden_spaces (view);
        } else {
                gchar *plain;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]