[evolution/wip/webkit2] Composer - Fix code around block wrapping



commit f1a2c08d096af4ade13ee2e996789db41b5b7933
Author: Tomas Popela <tpopela redhat com>
Date:   Wed Feb 24 12:45:01 2016 +0100

    Composer - Fix code around block wrapping

 .../e-html-editor-selection-dom-functions.c        |  186 ++++++++++----------
 .../composer/e-html-editor-view-dom-functions.c    |   47 +-----
 2 files changed, 103 insertions(+), 130 deletions(-)
---
diff --git a/web-extensions/composer/e-html-editor-selection-dom-functions.c 
b/web-extensions/composer/e-html-editor-selection-dom-functions.c
index c018754..3dd54e3 100644
--- a/web-extensions/composer/e-html-editor-selection-dom-functions.c
+++ b/web-extensions/composer/e-html-editor-selection-dom-functions.c
@@ -1911,7 +1911,7 @@ find_where_to_break_line (WebKitDOMNode *node,
                        if (pos <= max_len)
                                return pos;
                        else
-                               return last_space;
+                               return last_space > 0 ? last_space - 1 : 0;
                }
 
                /* If last_space is zero then the word is longer than
@@ -1920,7 +1920,7 @@ find_where_to_break_line (WebKitDOMNode *node,
                if ((pos > max_len) && (last_space > 0)) {
                        if (last_space > word_wrap_length) {
                                g_free (text_start);
-                               return last_space - 1;
+                               return last_space  > 0 ? last_space - 1 : 0;
                        }
 
                        if (last_space > max_len) {
@@ -1938,7 +1938,7 @@ find_where_to_break_line (WebKitDOMNode *node,
                        }
 
                        g_free (text_start);
-                       return last_space;
+                       return last_space > 0 ? last_space - 1 : 0;
                }
 
                if (g_unichar_isspace (uc) || str[0] == '-')
@@ -1952,17 +1952,17 @@ find_where_to_break_line (WebKitDOMNode *node,
                position = g_utf8_offset_to_pointer (text_start, max_len);
 
        if (position && g_unichar_isspace (g_utf8_get_char (position))) {
-               ret_val = max_len + 1;
+               ret_val = max_len;
        } else {
                if (last_space == 0) {
                        /* If word is longer than word_wrap_length, we have to
                         * split at maximal given length. */
                        ret_val = max_len;
                } else if (last_space < max_len) {
-                       ret_val = last_space;
+                       ret_val = last_space > 0 ? last_space - 1 : 0;
                } else {
                        if (length > word_wrap_length)
-                               ret_val = last_space;
+                               ret_val = last_space > 0 ? last_space - 1 : 0;
                        else
                                ret_val = 0;
                }
@@ -2053,23 +2053,23 @@ mark_and_remove_leading_space (WebKitDOMDocument *document,
 static WebKitDOMElement *
 wrap_lines (WebKitDOMDocument *document,
             EHTMLEditorWebExtension *extension,
-            WebKitDOMNode *paragraph,
+            WebKitDOMNode *block,
            gboolean remove_all_br,
            gint word_wrap_length)
 {
-       WebKitDOMNode *node, *start_node;
-       WebKitDOMNode *paragraph_clone;
-       WebKitDOMDocumentFragment *fragment;
+       WebKitDOMNode *node, *start_node, *block_clone;
        WebKitDOMElement *element;
        gboolean has_selection;
-       gint len, ii, br_count;
+       guint line_length;
        gulong length_left;
        gchar *text_content;
 
        has_selection = !dom_selection_is_collapsed (document);
 
        if (has_selection) {
-               WebKitDOMNodeList *wrap_br;
+               gint ii, length;
+               WebKitDOMDocumentFragment *fragment;
+               WebKitDOMNodeList *list;
                WebKitDOMRange *range;
 
                range = dom_get_current_range (document);
@@ -2079,25 +2079,41 @@ wrap_lines (WebKitDOMDocument *document,
                /* Select all BR elements or just ours that are used for wrapping.
                 * We are not removing user BR elements when this function is activated
                 * from Format->Wrap Lines action */
-               wrap_br = webkit_dom_document_fragment_query_selector_all (
+               list = webkit_dom_document_fragment_query_selector_all (
                        fragment,
                        remove_all_br ? "br" : "br.-x-evo-wrap-br",
                        NULL);
-               br_count = webkit_dom_node_list_get_length (wrap_br);
+               length = webkit_dom_node_list_get_length (list);
                /* And remove them */
-               for (ii = 0; ii < br_count; ii++) {
-                       WebKitDOMNode *node = webkit_dom_node_list_item (wrap_br, ii);
+               for (ii = 0; ii < length; ii++) {
+                       WebKitDOMNode *node = webkit_dom_node_list_item (list, length);
                        remove_node (node);
                        g_object_unref (node);
                }
-               g_object_unref (wrap_br);
+               g_object_unref (list);
+
+               list = webkit_dom_document_fragment_query_selector_all (
+                       fragment, "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);
+
+               node = WEBKIT_DOM_NODE (fragment);
+               start_node = node;
        } else {
-               if (!webkit_dom_node_has_child_nodes (paragraph))
-                       return WEBKIT_DOM_ELEMENT (paragraph);
+               if (!webkit_dom_node_has_child_nodes (block))
+                       return WEBKIT_DOM_ELEMENT (block);
 
-               paragraph_clone = webkit_dom_node_clone_node (paragraph, TRUE);
+               block_clone = webkit_dom_node_clone_node (block, TRUE);
                element = webkit_dom_element_query_selector (
-                       WEBKIT_DOM_ELEMENT (paragraph_clone),
+                       WEBKIT_DOM_ELEMENT (block_clone),
                        "span#-x-evo-caret-position",
                        NULL);
 
@@ -2105,7 +2121,7 @@ wrap_lines (WebKitDOMDocument *document,
                 * before the caret is already wrapped, so unwrap the text after
                 * the caret position */
                element = webkit_dom_element_query_selector (
-                       WEBKIT_DOM_ELEMENT (paragraph_clone),
+                       WEBKIT_DOM_ELEMENT (block_clone),
                        "span#-x-evo-selection-end-marker",
                        NULL);
 
@@ -2123,14 +2139,9 @@ wrap_lines (WebKitDOMDocument *document,
                                nd = next_nd;
                        }
                }
-       }
 
-       if (has_selection) {
-               node = WEBKIT_DOM_NODE (fragment);
-               start_node = node;
-       } else {
-               webkit_dom_node_normalize (paragraph_clone);
-               node = webkit_dom_node_get_first_child (paragraph_clone);
+               webkit_dom_node_normalize (block_clone);
+               node = webkit_dom_node_get_first_child (block_clone);
                if (node) {
                        text_content = webkit_dom_node_get_text_content (node);
                        if (g_strcmp0 ("\n", text_content) == 0)
@@ -2138,9 +2149,27 @@ wrap_lines (WebKitDOMDocument *document,
                        g_free (text_content);
                }
 
+               if (block_clone && WEBKIT_DOM_IS_ELEMENT (block_clone)) {
+                       gint ii, length;
+                       WebKitDOMNodeList *list;
+
+                       list = webkit_dom_element_query_selector_all (
+                               WEBKIT_DOM_ELEMENT (block_clone), "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);
+               }
+
                /* We have to start from the end of the last wrapped line */
                element = webkit_dom_element_query_selector (
-                       WEBKIT_DOM_ELEMENT (paragraph_clone),
+                       WEBKIT_DOM_ELEMENT (block_clone),
                        "span#-x-evo-selection-start-marker",
                        NULL);
 
@@ -2158,29 +2187,12 @@ wrap_lines (WebKitDOMDocument *document,
 
                if (element) {
                        node = webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (element));
-                       start_node = paragraph_clone;
+                       start_node = block_clone;
                } else
                        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;
+       line_length = 0;
        while (node) {
                gint offset = 0;
 
@@ -2275,7 +2287,7 @@ wrap_lines (WebKitDOMDocument *document,
                                        continue;
                                }
 
-                               if (len + anchor_length > word_wrap_length) {
+                               if (line_length + anchor_length > word_wrap_length) {
                                        element = webkit_dom_document_create_element (
                                                document, "BR", NULL);
                                        element_add_class (element, "-x-evo-wrap-br");
@@ -2284,29 +2296,11 @@ wrap_lines (WebKitDOMDocument *document,
                                                WEBKIT_DOM_NODE (element),
                                                node,
                                                NULL);
-                                       len = anchor_length;
+                                       line_length = anchor_length;
                                } else
-                                       len += anchor_length;
+                                       line_length += anchor_length;
 
-                               /* If there is space after the anchor don't try to
-                                * wrap before it */
                                node = next_sibling;
-                               if (WEBKIT_DOM_IS_TEXT (node)) {
-                                       text_content = webkit_dom_node_get_text_content (node);
-                                       if (g_str_has_prefix (text_content, " ")) {
-                                               if (g_strcmp0 (text_content, " ") == 0) {
-                                                       node = webkit_dom_node_get_next_sibling (node);
-                                                       len++;
-                                               } else {
-                                                       WebKitDOMText *text_node;
-
-                                                       text_node = webkit_dom_text_split_text (
-                                                               WEBKIT_DOM_TEXT (node), 1, NULL);
-                                                       node = WEBKIT_DOM_NODE (text_node);
-                                               }
-                                       }
-                                       g_free (text_content);
-                               }
                                continue;
                        }
 
@@ -2314,7 +2308,7 @@ wrap_lines (WebKitDOMDocument *document,
                         * we need to skip those elements */
                        if (!remove_all_br && WEBKIT_DOM_IS_HTML_BR_ELEMENT (node)) {
                                if (!element_has_class (WEBKIT_DOM_ELEMENT (node), "-x-evo-wrap-br")) {
-                                       len = 0;
+                                       line_length = 0;
                                        node = webkit_dom_node_get_next_sibling (node);
                                        continue;
                                }
@@ -2328,16 +2322,16 @@ wrap_lines (WebKitDOMDocument *document,
                length_left = webkit_dom_character_data_get_length (
                        WEBKIT_DOM_CHARACTER_DATA (node));
 
-               if ((length_left + len) < word_wrap_length) {
-                       len += length_left;
+               if ((length_left + line_length) < word_wrap_length) {
+                       line_length += length_left;
                        goto next_node;
                }
 
                /* wrap until we have something */
-               while ((length_left + len) > word_wrap_length) {
+               while ((length_left + line_length) > word_wrap_length) {
                        gint max_length;
 
-                       max_length = word_wrap_length - len;
+                       max_length = word_wrap_length - line_length;
                        if (max_length < 0)
                                max_length = word_wrap_length;
                        /* Find where we can line-break the node so that it
@@ -2349,15 +2343,16 @@ wrap_lines (WebKitDOMDocument *document,
                        element_add_class (element, "-x-evo-wrap-br");
 
                        if (offset > 0 && offset <= word_wrap_length) {
+                               WebKitDOMNode *nd;
+
                                if (offset != length_left)
                                        webkit_dom_text_split_text (
                                                WEBKIT_DOM_TEXT (node), offset, NULL);
 
-                               if (webkit_dom_node_get_next_sibling (node)) {
+                               nd = webkit_dom_node_get_next_sibling (node);
+                               if (nd) {
                                        gchar *nd_content;
-                                       WebKitDOMNode *nd = webkit_dom_node_get_next_sibling (node);
 
-                                       nd = webkit_dom_node_get_next_sibling (node);
                                        nd_content = webkit_dom_node_get_text_content (nd);
                                        if (nd_content && *nd_content) {
                                                if (g_str_has_prefix (nd_content, " "))
@@ -2406,11 +2401,11 @@ wrap_lines (WebKitDOMDocument *document,
                                                WEBKIT_DOM_NODE (element),
                                                nd,
                                                NULL);
-                                       len = 0;
+                                       line_length = 0;
                                        break;
                                } else {
                                        node = WEBKIT_DOM_NODE (webkit_dom_text_split_text (
-                                               WEBKIT_DOM_TEXT (node), word_wrap_length - len, NULL));
+                                               WEBKIT_DOM_TEXT (node), word_wrap_length - line_length, 
NULL));
 
                                        webkit_dom_node_insert_before (
                                                webkit_dom_node_get_parent_node (node),
@@ -2428,12 +2423,12 @@ wrap_lines (WebKitDOMDocument *document,
                        length_left = webkit_dom_character_data_get_length (
                                WEBKIT_DOM_CHARACTER_DATA (node));
 
-                       len = 0;
+                       line_length = 0;
                }
-               len += length_left - offset;
+               line_length += length_left - offset;
  next_node:
                if (WEBKIT_DOM_IS_HTML_LI_ELEMENT (node))
-                       len = 0;
+                       line_length = 0;
 
                /* Move to next node */
                if (webkit_dom_node_has_child_nodes (node)) {
@@ -2472,16 +2467,16 @@ wrap_lines (WebKitDOMDocument *document,
 
                return NULL;
        } else {
-               webkit_dom_node_normalize (paragraph_clone);
+               webkit_dom_node_normalize (block_clone);
 
-               node = webkit_dom_node_get_parent_node (paragraph);
+               node = webkit_dom_node_get_parent_node (block);
                if (node) {
-                       /* Replace paragraph with wrapped one */
+                       /* Replace block with wrapped one */
                        webkit_dom_node_replace_child (
-                               node, paragraph_clone, paragraph, NULL);
+                               node, block_clone, block, NULL);
                }
 
-               return WEBKIT_DOM_ELEMENT (paragraph_clone);
+               return WEBKIT_DOM_ELEMENT (block_clone);
        }
 }
 
@@ -2500,9 +2495,22 @@ dom_remove_wrapping_from_element (WebKitDOMElement *element)
                g_object_unref (node);
        }
 
-       webkit_dom_node_normalize (WEBKIT_DOM_NODE (element));
+       g_object_unref (list);
 
+       list = webkit_dom_element_query_selector_all (
+               element, "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);
+
+       webkit_dom_node_normalize (WEBKIT_DOM_NODE (element));
 }
 
 void
diff --git a/web-extensions/composer/e-html-editor-view-dom-functions.c 
b/web-extensions/composer/e-html-editor-view-dom-functions.c
index 0bb09ab..d20c2d9 100644
--- a/web-extensions/composer/e-html-editor-view-dom-functions.c
+++ b/web-extensions/composer/e-html-editor-view-dom-functions.c
@@ -5944,25 +5944,6 @@ process_elements (EHTMLEditorWebExtension *extension,
 }
 
 static void
-remove_wrapping_from_document (WebKitDOMDocument *document)
-{
-       gint length;
-       gint ii;
-       WebKitDOMNodeList *list;
-
-       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 *node = webkit_dom_node_list_item (list, ii);
-               remove_node (node);
-               g_object_unref (node);
-       }
-
-       g_object_unref (list);
-}
-
-static void
 remove_image_attributes_from_element (WebKitDOMElement *element)
 {
        webkit_dom_element_remove_attribute (element, "background");
@@ -7745,26 +7726,6 @@ toggle_tables (WebKitDOMDocument *document,
        g_object_unref (list);
 }
 
-static void
-replace_hidden_spaces (WebKitDOMDocument *document)
-{
-       WebKitDOMNodeList *list;
-       gint ii, length;
-
-       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);
-}
-
 void
 dom_process_content_after_mode_change (WebKitDOMDocument *document,
                                        EHTMLEditorWebExtension *extension)
@@ -7779,14 +7740,18 @@ dom_process_content_after_mode_change (WebKitDOMDocument *document,
                document, "blockquote[type|=cite]", NULL);
 
        if (html_mode) {
+               WebKitDOMHTMLElement *body;
+
                if (blockquote)
                        dom_dequote_plain_text (document);
 
                toggle_paragraphs_style (document, extension);
                toggle_smileys (document, extension);
                toggle_tables (document, html_mode);
-               remove_wrapping_from_document (document);
-               replace_hidden_spaces (document);
+
+               body = webkit_dom_document_get_body (document);
+
+               dom_remove_wrapping_from_element (WEBKIT_DOM_ELEMENT (body));
        } else {
                gchar *plain;
 


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