[evolution/wip/webkit2] Composer - Fix code around block wrapping
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip/webkit2] Composer - Fix code around block wrapping
- Date: Wed, 24 Feb 2016 11:45:00 +0000 (UTC)
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]