[evolution/webkit-composer] Minor code refactoring, cleaning, leaks fixing.
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/webkit-composer] Minor code refactoring, cleaning, leaks fixing.
- Date: Fri, 13 Sep 2013 14:14:45 +0000 (UTC)
commit e9bb392ffca22c64a541877297dadeeff48be15d
Author: Tomas Popela <tpopela redhat com>
Date: Fri Sep 13 16:16:27 2013 +0200
Minor code refactoring, cleaning, leaks fixing.
e-util/e-editor-selection.c | 202 ++++++++++++++++++++++++++-----------------
e-util/e-editor-widget.c | 65 ++++++++------
e-util/e-web-view.c | 115 ++++++++++++++++++++++++
e-util/e-web-view.h | 10 ++
4 files changed, 284 insertions(+), 108 deletions(-)
---
diff --git a/e-util/e-editor-selection.c b/e-util/e-editor-selection.c
index d6eda50..9477081 100644
--- a/e-util/e-editor-selection.c
+++ b/e-util/e-editor-selection.c
@@ -1341,6 +1341,7 @@ e_editor_selection_set_block_format (EEditorSelection *selection,
WebKitDOMDOMWindow *window;
WebKitDOMNodeList *list;
gint paragraph_count, ii;
+ gchar *content;
web_view = WEBKIT_WEB_VIEW (editor_widget);
document = webkit_web_view_get_dom_document (web_view);
@@ -1351,10 +1352,13 @@ e_editor_selection_set_block_format (EEditorSelection *selection,
paragraph_count = webkit_dom_node_list_get_length (list);
for (ii = paragraph_count - 1; ii >= 0; ii--) {
- WebKitDOMNode *br = webkit_dom_node_list_item (list, ii);
- if (g_strcmp0 (webkit_dom_node_get_text_content (br), UNICODE_HIDDEN_SPACE) == 0) {
- webkit_dom_node_set_text_content (br, "", NULL);
+ WebKitDOMNode *paragraph_node = webkit_dom_node_list_item (list, ii);
+
+ content = webkit_dom_node_get_text_content (paragraph_node);
+ if (g_strcmp0 (content, UNICODE_HIDDEN_SPACE) == 0) {
+ webkit_dom_node_set_text_content (paragraph_node, "", NULL);
}
+ g_free (content);
}
/* Create list elements */
@@ -1362,10 +1366,12 @@ e_editor_selection_set_block_format (EEditorSelection *selection,
/* We have to use again the hidden space to move caret into newly
* inserted list */
+ content = g_strconcat ("<li>", UNICODE_HIDDEN_SPACE, "</li>", NULL);
webkit_dom_html_element_set_inner_html (
WEBKIT_DOM_HTML_ELEMENT (element),
- g_strconcat ("<li>", UNICODE_HIDDEN_SPACE, "</li>", NULL),
+ content,
NULL);
+ g_free (content);
if (format != E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST) {
webkit_dom_element_set_attribute (
@@ -1428,8 +1434,7 @@ e_editor_selection_set_block_format (EEditorSelection *selection,
paragraph = e_editor_dom_node_find_parent_element (node, "P");
if (paragraph) {
- webkit_dom_element_set_class_name (WEBKIT_DOM_ELEMENT (paragraph),
- "-x-evo-paragraph");
+ element_add_class (WEBKIT_DOM_ELEMENT (paragraph), "-x-evo-paragraph");
}
}
@@ -1642,6 +1647,7 @@ gboolean
e_editor_selection_is_citation (EEditorSelection *selection)
{
gboolean ret_val;
+ const gchar *text_content;
gchar *value;
EEditorWidget *editor_widget;
WebKitDOMCSSStyleDeclaration *style;
@@ -1664,9 +1670,10 @@ e_editor_selection_is_citation (EEditorSelection *selection)
return FALSE;
node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+ text_content = webkit_dom_node_get_text_content (node);
/* If we are changing the format of block we have to re-set bold property,
* otherwise it will be turned off because of no text in composer */
- if (g_strcmp0 (webkit_dom_node_get_text_content (node), "") == 0)
+ if (g_strcmp0 (text_content, "") == 0)
return FALSE;
style = webkit_dom_dom_window_get_computed_style (
@@ -1764,6 +1771,7 @@ gboolean
e_editor_selection_is_bold (EEditorSelection *selection)
{
gboolean ret_val;
+ const gchar *text_content;
gchar *value;
EEditorWidget *editor_widget;
WebKitDOMCSSStyleDeclaration *style;
@@ -1788,7 +1796,8 @@ e_editor_selection_is_bold (EEditorSelection *selection)
node = webkit_dom_range_get_common_ancestor_container (range, NULL);
/* If we are changing the format of block we have to re-set bold property,
* otherwise it will be turned off because of no text in composer */
- if (g_strcmp0 (webkit_dom_node_get_text_content (node), "") == 0)
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_strcmp0 (text_content, "") == 0)
return selection->priv->is_bold;
style = webkit_dom_dom_window_get_computed_style (
@@ -1850,6 +1859,7 @@ gboolean
e_editor_selection_is_italic (EEditorSelection *selection)
{
gboolean ret_val;
+ const gchar *text_content;
gchar *value;
EEditorWidget *editor_widget;
WebKitDOMCSSStyleDeclaration *style;
@@ -1874,7 +1884,8 @@ e_editor_selection_is_italic (EEditorSelection *selection)
node = webkit_dom_range_get_common_ancestor_container (range, NULL);
/* If we are changing the format of block we have to re-set italic property,
* otherwise it will be turned off because of no text in composer */
- if (g_strcmp0 (webkit_dom_node_get_text_content (node), "") == 0)
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_strcmp0 (text_content, "") == 0)
return selection->priv->is_italic;
style = webkit_dom_dom_window_get_computed_style (
@@ -1937,6 +1948,7 @@ e_editor_selection_is_monospaced (EEditorSelection *selection)
{
WebKitDOMRange *range;
WebKitDOMNode *node;
+ const gchar *text_content;
g_return_val_if_fail (E_IS_EDITOR_SELECTION (selection), FALSE);
@@ -1947,7 +1959,8 @@ e_editor_selection_is_monospaced (EEditorSelection *selection)
node = webkit_dom_range_get_common_ancestor_container (range, NULL);
/* If we are changing the format of block we have to re-set monospaced property,
* otherwise it will be turned off because of no text in composer */
- if (g_strcmp0 (webkit_dom_node_get_text_content (node), "") == 0)
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_strcmp0 (text_content, "") == 0)
return selection->priv->is_monospaced;
return get_has_style (selection, "tt");
@@ -2043,26 +2056,30 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
move_caret_into_element (document, tt_element);
}
} else {
- if (g_strcmp0 (e_editor_selection_get_string (selection), "") != 0) {
- gchar *html;
- gchar *start_position, *end_position;
- WebKitDOMElement *tt_element;
- WebKitDOMElement *wrapper;
- WebKitDOMNode *node;
-
- node = webkit_dom_range_get_end_container (range, NULL);
- if (g_strcmp0 (webkit_dom_node_get_local_name (node), "tt") == 0)
- tt_element = WEBKIT_DOM_ELEMENT (node);
- else
- tt_element = webkit_dom_node_get_parent_element (node);
+ WebKitDOMElement *tt_element;
+ WebKitDOMNode *node;
- if (g_strcmp0 (webkit_dom_element_get_tag_name (tt_element), "TT") != 0) {
+ node = webkit_dom_range_get_end_container (range, NULL);
+ if (element_has_tag (WEBKIT_DOM_ELEMENT (node), "tt"))
+ tt_element = WEBKIT_DOM_ELEMENT (node);
+ else {
+ tt_element = webkit_dom_node_get_parent_element (node);
+ if (!element_has_tag (WEBKIT_DOM_ELEMENT (node), "tt")) {
g_object_unref (editor_widget);
return;
}
+ }
+
+ if (g_strcmp0 (e_editor_selection_get_string (selection), "") != 0) {
+ gchar *html, *outer_html, *inner_html;
+ gchar *beginning, *end;
+ gchar *start_position, *end_position;
+ WebKitDOMElement *wrapper;
wrapper = webkit_dom_document_create_element (document, "SPAN", NULL);
- webkit_dom_html_element_set_id (WEBKIT_DOM_HTML_ELEMENT (wrapper),
"-x-evo-remove-tt");
+ webkit_dom_html_element_set_id (
+ WEBKIT_DOM_HTML_ELEMENT (wrapper),
+ "-x-evo-remove-tt");
webkit_dom_range_surround_contents (range, WEBKIT_DOM_NODE (wrapper), NULL);
html = webkit_dom_html_element_get_outer_html (WEBKIT_DOM_HTML_ELEMENT (tt_element));
@@ -2070,57 +2087,54 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
start_position = g_strstr_len (html, -1, "<span id=\"-x-evo-remove-tt\"");
end_position = g_strstr_len (start_position, -1, "</span>");
- webkit_dom_html_element_set_outer_html (
- WEBKIT_DOM_HTML_ELEMENT (tt_element),
+ beginning = g_utf8_substring (html, 0, g_utf8_pointer_to_offset (html,
start_position));
+ inner_html = webkit_dom_html_element_get_inner_html (WEBKIT_DOM_HTML_ELEMENT
(wrapper));
+ end = g_utf8_substring (html,
+ g_utf8_pointer_to_offset (html, end_position) + 7,
+ g_utf8_strlen (html, -1)),
+
+ outer_html =
g_strconcat (
/* Beginning */
- g_utf8_substring (html,
- 0,
- g_utf8_pointer_to_offset (html, start_position)),
+ beginning,
/* End the previous TT tag */
"</tt>",
/* Inside will be the same */
- webkit_dom_html_element_get_inner_html (
- WEBKIT_DOM_HTML_ELEMENT (wrapper)),
+ inner_html,
/* Put caret position here */
"<span id=\"-x-evo-caret-position\">*</span>",
/* Start the new TT element */
"<tt>",
/* End - we have to start after </span> */
- g_utf8_substring (html,
- g_utf8_pointer_to_offset (html, end_position) + 7,
- g_utf8_strlen (html, -1)),
+ end,
NULL),
+
+ webkit_dom_html_element_set_outer_html (
+ WEBKIT_DOM_HTML_ELEMENT (tt_element),
+ outer_html,
NULL);
e_editor_selection_restore_caret_position (selection);
g_free (html);
+ g_free (outer_html);
+ g_free (inner_html);
+ g_free (beginning);
+ g_free (end);
} else {
- WebKitDOMElement *tt_element;
WebKitDOMRange *new_range;
- WebKitDOMNode *node;
gchar *outer_html, *inner_html, *new_inner_html;
+ gchar *tmp;
GRegex *regex;
- node = webkit_dom_range_get_end_container (range, NULL);
- if (g_strcmp0 (webkit_dom_node_get_local_name (node), "tt") == 0)
- tt_element = WEBKIT_DOM_ELEMENT (node);
- else
- tt_element = webkit_dom_node_get_parent_element (node);
-
- if (g_strcmp0 (webkit_dom_element_get_tag_name (tt_element), "TT") != 0) {
- g_object_unref (editor_widget);
- return;
- }
-
regex = g_regex_new (UNICODE_HIDDEN_SPACE, 0, 0, NULL);
if (!regex) {
g_object_unref (editor_widget);
return;
}
- webkit_dom_html_element_set_id (WEBKIT_DOM_HTML_ELEMENT (tt_element), "ev-tt");
+ webkit_dom_html_element_set_id (
+ WEBKIT_DOM_HTML_ELEMENT (tt_element), "ev-tt");
inner_html = webkit_dom_html_element_get_inner_html (WEBKIT_DOM_HTML_ELEMENT
(tt_element));
new_inner_html = g_regex_replace_literal (regex, inner_html, -1, 0, "", 0, NULL);
@@ -2129,9 +2143,10 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
new_inner_html, NULL);
outer_html = webkit_dom_html_element_get_outer_html (WEBKIT_DOM_HTML_ELEMENT
(tt_element));
+ tmp = g_strconcat (outer_html, UNICODE_HIDDEN_SPACE, NULL);
webkit_dom_html_element_set_outer_html (
WEBKIT_DOM_HTML_ELEMENT (tt_element),
- g_strconcat (outer_html, UNICODE_HIDDEN_SPACE, NULL), NULL);
+ tmp, NULL);
/* We need to get that element again */
tt_element = webkit_dom_document_get_element_by_id (document, "ev-tt");
@@ -2150,6 +2165,7 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
g_free (inner_html);
g_free (new_inner_html);
g_free (outer_html);
+ g_free (tmp);
}
}
@@ -2171,6 +2187,7 @@ gboolean
e_editor_selection_is_strike_through (EEditorSelection *selection)
{
gboolean ret_val;
+ const gchar *text_content;
gchar *value;
EEditorWidget *editor_widget;
WebKitDOMCSSStyleDeclaration *style;
@@ -2195,7 +2212,8 @@ e_editor_selection_is_strike_through (EEditorSelection *selection)
node = webkit_dom_range_get_common_ancestor_container (range, NULL);
/* If we are changing the format of block we have to re-set strike-through property,
* otherwise it will be turned off because of no text in composer */
- if (g_strcmp0 (webkit_dom_node_get_text_content (node), "") == 0)
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_strcmp0 (text_content, "") == 0)
return selection->priv->is_strike_through;
style = webkit_dom_dom_window_get_computed_style (
@@ -2393,6 +2411,7 @@ gboolean
e_editor_selection_is_underline (EEditorSelection *selection)
{
gboolean ret_val;
+ const gchar *text_content;
gchar *value;
EEditorWidget *editor_widget;
WebKitDOMCSSStyleDeclaration *style;
@@ -2417,7 +2436,8 @@ e_editor_selection_is_underline (EEditorSelection *selection)
node = webkit_dom_range_get_common_ancestor_container (range, NULL);
/* If we are changing the format of block we have to re-set underline property,
* otherwise it will be turned off because of no text in composer */
- if (g_strcmp0 (webkit_dom_node_get_text_content (node), "") == 0)
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_strcmp0 (text_content, "") == 0)
return selection->priv->is_underline;
style = webkit_dom_dom_window_get_computed_style (
@@ -2744,9 +2764,7 @@ e_editor_selection_restore_caret_position (EEditorSelection *selection)
/* Look if we have DIV on right */
next_sibling = webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (element));
- if (g_strcmp0 (webkit_dom_element_get_class_name (WEBKIT_DOM_ELEMENT (next_sibling)),
- "-x-evo-paragraph") == 0) {
-
+ if (element_has_class (WEBKIT_DOM_ELEMENT (next_sibling), "-x-evo-paragraph")) {
webkit_dom_node_remove_child (
webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (element)),
WEBKIT_DOM_NODE (element),
@@ -2847,9 +2865,7 @@ find_where_to_break_line (WebKitDOMNode *node,
static gboolean
is_caret_position_node (WebKitDOMNode *node)
{
- return (WEBKIT_DOM_IS_HTML_ELEMENT (node) &&
- (g_strcmp0 (webkit_dom_html_element_get_id (WEBKIT_DOM_HTML_ELEMENT (node)),
- "-x-evo-caret-position")) == 0);
+ return element_has_id (WEBKIT_DOM_ELEMENT (node), "-x-evo-caret-position");
}
static void
@@ -2862,13 +2878,14 @@ wrap_lines (EEditorSelection *selection,
gboolean delete_pressed)
{
WebKitDOMNode *node, *start_node;
+ WebKitDOMNode *paragraph_clone;
WebKitDOMDocumentFragment *fragment;
WebKitDOMElement *element;
WebKitDOMNodeList *wrap_br;
gint len, ii, br_count;
gulong length_left;
glong paragraph_char_count;
- WebKitDOMNode *paragraph_clone;
+ gchar *text_content;
if (selection) {
paragraph_char_count = g_utf8_strlen (e_editor_selection_get_string (selection), -1);
@@ -2886,7 +2903,9 @@ wrap_lines (EEditorSelection *selection,
NULL);
} else {
paragraph_clone = webkit_dom_node_clone_node (paragraph, TRUE);
- paragraph_char_count = g_utf8_strlen (webkit_dom_node_get_text_content (paragraph_clone), -1);
+ text_content = webkit_dom_node_get_text_content (paragraph_clone);
+ paragraph_char_count = g_utf8_strlen (text_content, -1);
+ g_free (text_content);
wrap_br = webkit_dom_element_query_selector_all (
WEBKIT_DOM_ELEMENT (paragraph_clone),
@@ -2926,19 +2945,22 @@ wrap_lines (EEditorSelection *selection,
}
/* If there is temporary hidden space we remove it */
- if (strstr (webkit_dom_node_get_text_content (node), UNICODE_HIDDEN_SPACE))
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_strstr_len (text_content, -1, UNICODE_HIDDEN_SPACE))
webkit_dom_character_data_delete_data (
WEBKIT_DOM_CHARACTER_DATA (node), 0, 1, NULL);
+ g_free (text_content);
} else {
/* If element is ANCHOR we wrap it separately */
if (WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node)) {
glong anchor_length;
- anchor_length = g_utf8_strlen (webkit_dom_node_get_text_content (node), -1);
+ text_content = webkit_dom_node_get_text_content (node);
+ anchor_length = g_utf8_strlen (text_content, -1);
if (len + anchor_length > word_wrap_length) {
element = webkit_dom_document_create_element (
document, "BR", NULL);
- webkit_dom_element_set_class_name (element, "-x-evo-wrap-br");
+ element_add_class (element, "-x-evo-wrap-br");
webkit_dom_node_insert_before (
webkit_dom_node_get_parent_node (node),
WEBKIT_DOM_NODE (element),
@@ -2948,6 +2970,7 @@ wrap_lines (EEditorSelection *selection,
} else
len += anchor_length;
+ g_free (text_content);
node = webkit_dom_node_get_next_sibling (node);
continue;
}
@@ -2968,8 +2991,8 @@ wrap_lines (EEditorSelection *selection,
/* When we are not removing user-entered BR elements (lines wrapped by user),
* we need to skip those elements */
- if (!remove_all_br && g_strcmp0 (webkit_dom_node_get_local_name (node), "br") == 0) {
- if (!g_strcmp0 (webkit_dom_element_get_class_name (WEBKIT_DOM_ELEMENT
(node)), "-x-evo-wrap-br") == 0) {
+ if (!remove_all_br && WEBKIT_DOM_IS_HTMLBR_ELEMENT (node)) {
+ if (element_has_class (WEBKIT_DOM_ELEMENT (node), "-x-evo-wrap-br")) {
len = 0;
node = webkit_dom_node_get_next_sibling (node);
continue;
@@ -3009,7 +3032,7 @@ wrap_lines (EEditorSelection *selection,
offset = find_where_to_break_line (node, word_wrap_length - len,
word_wrap_length);
element = webkit_dom_document_create_element (document, "BR", NULL);
- webkit_dom_element_set_class_name (element, "-x-evo-wrap-br");
+ element_add_class (element, "-x-evo-wrap-br");
if (offset > 0 && offset <= word_wrap_length) {
if (offset != length_left) {
@@ -3058,7 +3081,10 @@ wrap_lines (EEditorSelection *selection,
node,
NULL);
}
- length_left = webkit_dom_character_data_get_length (WEBKIT_DOM_CHARACTER_DATA
(node));
+ length_left =
+ webkit_dom_character_data_get_length (
+ WEBKIT_DOM_CHARACTER_DATA (node));
+
len = 0;
}
len += length_left - offset;
@@ -3083,7 +3109,7 @@ wrap_lines (EEditorSelection *selection,
/* Create a wrapper DIV and put the processed content into it */
element = webkit_dom_document_create_element (document, "DIV", NULL);
- webkit_dom_element_set_class_name (WEBKIT_DOM_ELEMENT (element), "-x-evo-paragraph");
+ element_add_class (WEBKIT_DOM_ELEMENT (element), "-x-evo-paragraph");
webkit_dom_node_append_child (
WEBKIT_DOM_NODE (element),
WEBKIT_DOM_NODE (start_node),
@@ -3111,16 +3137,19 @@ static gboolean
check_if_previously_wrapped (WebKitDOMDocument *document)
{
WebKitDOMNode *sibling;
- sibling = WEBKIT_DOM_NODE (webkit_dom_document_get_element_by_id (document, "-x-evo-caret-position"));
+
+ sibling = WEBKIT_DOM_NODE (
+ webkit_dom_document_get_element_by_id (
+ document, "-x-evo-caret-position"));
while (sibling) {
- if (sibling && WEBKIT_DOM_IS_ELEMENT (sibling)) {
- if (g_strcmp0 (webkit_dom_element_get_class_name (WEBKIT_DOM_ELEMENT (sibling)),
"-x-evo-wrap-br") == 0) {
- return TRUE;
- }
- }
+ if (WEBKIT_DOM_IS_ELEMENT (sibling) &&
+ element_has_class (WEBKIT_DOM_ELEMENT (sibling), "-x-evo-wrap-br"))
+ return TRUE;
+
sibling = webkit_dom_node_get_next_sibling (sibling);
}
+
return FALSE;
}
@@ -3183,6 +3212,7 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
WebKitDOMNode *parent;
WebKitDOMNode *paragraph;
gulong start_offset;
+ const gchar *text_content;
/* We need to save caret position and restore it after
* wrapping the selection, but we need to save it before we
@@ -3209,12 +3239,12 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
/* Wrap only text surrounded in DIV and P tags */
parent = webkit_dom_node_get_parent_node(end_container);
if (WEBKIT_DOM_IS_HTML_DIV_ELEMENT (parent) || WEBKIT_DOM_IS_HTML_PARAGRAPH_ELEMENT (parent))
{
- webkit_dom_element_set_class_name (WEBKIT_DOM_ELEMENT (parent), "-x-evo-paragraph");
+ element_add_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-paragraph");
paragraph = parent;
} else {
WebKitDOMElement *parent_div = e_editor_dom_node_find_parent_element (parent, "DIV");
- if (parent_div && g_strcmp0 (webkit_dom_element_get_class_name (parent_div),
"-x-evo-paragraph") == 0) {
+ if (element_has_class (parent_div, "-x-evo-paragraph")) {
paragraph = WEBKIT_DOM_NODE (parent_div);
} else {
WebKitDOMNode *position = WEBKIT_DOM_NODE
(webkit_dom_document_get_element_by_id (document, "-x-evo-caret-position"));
@@ -3228,7 +3258,7 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
if (WEBKIT_DOM_IS_TEXT (paragraph)) {
WebKitDOMRange *new_range = webkit_dom_document_create_range
(document);
WebKitDOMNode *container = WEBKIT_DOM_NODE
(webkit_dom_document_create_element (document, "DIV", NULL));
- webkit_dom_element_set_class_name (WEBKIT_DOM_ELEMENT
(container), "-x-evo-paragraph");
+ element_add_class (WEBKIT_DOM_ELEMENT (container),
"-x-evo-paragraph");
webkit_dom_range_select_node (new_range, paragraph, NULL);
webkit_dom_range_surround_contents (new_range, container,
NULL);
/* We have to move caret position inside this container */
@@ -3246,10 +3276,13 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
if (!paragraph)
return;
- webkit_dom_html_element_set_id (WEBKIT_DOM_HTML_ELEMENT (paragraph),
"-x-evo-active-paragraph");
+ webkit_dom_html_element_set_id (
+ WEBKIT_DOM_HTML_ELEMENT (paragraph),
+ "-x-evo-active-paragraph");
+ text_content = webkit_dom_node_get_text_content (paragraph);
/* If there is hidden space character in the beginning we remove it */
- if (strstr (webkit_dom_node_get_text_content (paragraph), UNICODE_HIDDEN_SPACE)) {
+ if (g_strstr_len (text_content, -1, UNICODE_HIDDEN_SPACE)) {
WebKitDOMNode *child = webkit_dom_node_get_first_child (paragraph);
if (WEBKIT_DOM_IS_CHARACTER_DATA (child)) {
@@ -3283,7 +3316,9 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
WebKitDOMElement *caret_position;
gboolean parent_is_body = FALSE;
- caret_position = webkit_dom_document_get_element_by_id (document,
"-x-evo-caret-position");
+ caret_position =
+ webkit_dom_document_get_element_by_id (
+ document, "-x-evo-caret-position");
webkit_dom_dom_selection_select_all_children (
window_selection,
@@ -3294,7 +3329,10 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
parent_is_body = TRUE;
if (backspace_pressed && parent_is_body) {
- WebKitDOMElement *prev_sibling =
webkit_dom_element_get_previous_element_sibling (caret_position);
+ WebKitDOMElement *prev_sibling;
+
+ prev_sibling = webkit_dom_element_get_previous_element_sibling
(caret_position);
+
move_caret_into_element (document, prev_sibling);
e_editor_selection_clear_caret_position_marker (selection);
webkit_dom_dom_selection_modify (window_selection, "move", "forward",
"character");
@@ -3355,9 +3393,11 @@ e_editor_selection_wrap_lines (EEditorSelection *selection,
list = webkit_dom_document_query_selector_all (document, "div.-x-evo-paragraph,
p.-x-evo-paragraph", NULL);
for (ii = 0; ii < webkit_dom_node_list_get_length (list); ii++) {
WebKitDOMNode *node = webkit_dom_node_list_item (list, ii);
+ const gchar *text_content;
/* Select elements that actualy have some text content */
- if (g_utf8_strlen (webkit_dom_node_get_text_content (node), -1) == 0)
+ text_content = webkit_dom_node_get_text_content (node);
+ if (g_utf8_strlen (text_content, -1) == 0)
continue;
if (signature) {
diff --git a/e-util/e-editor-widget.c b/e-util/e-editor-widget.c
index 89f38cd..076070f 100644
--- a/e-util/e-editor-widget.c
+++ b/e-util/e-editor-widget.c
@@ -463,12 +463,14 @@ editor_widget_check_magic_links (EEditorWidget *widget,
href = webkit_dom_html_anchor_element_get_href (
WEBKIT_DOM_HTML_ANCHOR_ELEMENT (parent));
- if (appending_to_link)
- text = g_strconcat (
+ if (appending_to_link) {
+ const gchar *inner_text;
+ inner_text =
webkit_dom_html_element_get_inner_text (
WEBKIT_DOM_HTML_ELEMENT (parent)),
- text_to_append, NULL);
- else
+
+ text = g_strconcat (inner_text, text_to_append, NULL);
+ } else
text = webkit_dom_html_element_get_inner_text (
WEBKIT_DOM_HTML_ELEMENT (parent));
@@ -492,14 +494,19 @@ editor_widget_check_magic_links (EEditorWidget *widget,
new_href);
if (appending_to_link) {
+ gchar *tmp;
+
+ tmp = g_strconcat (inner_html, text_to_append, NULL);
webkit_dom_html_element_set_inner_html (
WEBKIT_DOM_HTML_ELEMENT (parent),
- g_strconcat (inner_html, text_to_append, NULL),
+ tmp,
NULL);
webkit_dom_node_remove_child (
webkit_dom_node_get_parent_node (node),
node, NULL);
+
+ g_free (tmp);
}
g_free (new_href);
@@ -526,14 +533,19 @@ editor_widget_check_magic_links (EEditorWidget *widget,
new_href);
if (appending_to_link) {
+ gchar *tmp;
+
+ tmp = g_strconcat (inner_html, text_to_append, NULL);
webkit_dom_html_element_set_inner_html (
WEBKIT_DOM_HTML_ELEMENT (parent),
- g_strconcat (inner_html, text_to_append, NULL),
+ tmp,
NULL);
webkit_dom_node_remove_child (
webkit_dom_node_get_parent_node (node),
node, NULL);
+
+ g_free (tmp);
}
g_free (new_href);
@@ -1591,6 +1603,7 @@ process_elements (WebKitDOMNode *node,
WebKitDOMNodeList *nodes;
gulong ii, length;
GRegex *regex, *regex_hidden_space;
+ gchar *content;
/* Replace images with smileys by their text representation */
if (WEBKIT_DOM_IS_HTML_IMAGE_ELEMENT (node)) {
@@ -1615,9 +1628,7 @@ process_elements (WebKitDOMNode *node,
}
/* Skip signature */
- if (g_strcmp0 (webkit_dom_element_get_class_name (WEBKIT_DOM_ELEMENT (node)),
- "-x-evolution-signature") == 0) {
-
+ if (element_has_class (WEBKIT_DOM_ELEMENT (node), "-x-evolution-signature")) {
if (process_nodes)
g_string_append (buffer, "\n");
else
@@ -1655,39 +1666,37 @@ process_elements (WebKitDOMNode *node,
g_free (content);
} else {
/* Leave caret position untouched */
- if (WEBKIT_DOM_IS_HTML_ELEMENT (child) &&
- g_strcmp0 (webkit_dom_html_element_get_id (WEBKIT_DOM_HTML_ELEMENT (child)),
- "-x-evo-caret-position") == 0) {
-
- if (!process_nodes)
- g_string_append (buffer, webkit_dom_html_element_get_outer_html
(WEBKIT_DOM_HTML_ELEMENT (child)));
-
+ if (element_has_id (WEBKIT_DOM_ELEMENT (child), "-x-evo-caret-position")) {
+ if (!process_nodes) {
+ content = webkit_dom_html_element_get_outer_html
(WEBKIT_DOM_HTML_ELEMENT (child));
+ g_string_append (buffer, content);
+ g_free (content);
+ }
skip_node = TRUE;
}
/* Leave blockquotes as they are */
- if (g_strcmp0 (webkit_dom_node_get_local_name (child),
- "blockquote") == 0) {
-
+ if (element_has_tag (WEBKIT_DOM_ELEMENT (child), "blockquote")) {
if (!process_nodes) {
- g_string_append (buffer, webkit_dom_html_element_get_outer_html
(WEBKIT_DOM_HTML_ELEMENT (child)));
+ content = webkit_dom_html_element_get_outer_html
(WEBKIT_DOM_HTML_ELEMENT (child));
+ g_string_append (buffer, content);
+ g_free (content);
skip_node = TRUE;
}
}
/* Leave wrapped paragraphs as they are */
- if (WEBKIT_DOM_IS_ELEMENT (child) &&
- g_strcmp0 (webkit_dom_element_get_class_name (WEBKIT_DOM_ELEMENT (child)),
- "-x-evo-paragraph") == 0) {
-
+ if (element_has_class (WEBKIT_DOM_ELEMENT (child), "-x-evo-paragraph")) {
if (!process_nodes) {
- g_string_append (buffer, webkit_dom_html_element_get_outer_html
(WEBKIT_DOM_HTML_ELEMENT (child)));
+ content = webkit_dom_html_element_get_outer_html
(WEBKIT_DOM_HTML_ELEMENT (child));
+ g_string_append (buffer, content);
+ g_free (content);
skip_node = TRUE;
}
}
/* Insert new line when we hit BR element */
- if (g_strcmp0 (webkit_dom_node_get_local_name (child), "br") == 0)
+ if (WEBKIT_DOM_IS_HTMLBR_ELEMENT (child))
g_string_append (buffer, process_nodes ? "\n" : "<br>");
}
@@ -1709,9 +1718,11 @@ process_elements (WebKitDOMNode *node,
add_br = FALSE;
}
- if (add_br && g_utf8_strlen (webkit_dom_node_get_text_content (node), -1) > 0) {
+ content = webkit_dom_node_get_text_content (node);
+ if (add_br && g_utf8_strlen (content, -1) > 0) {
g_string_append (buffer, process_nodes ? "\n" : "<br>");
}
+ g_free (content);
}
g_regex_unref (regex);
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c
index 668b395..8629201 100644
--- a/e-util/e-web-view.c
+++ b/e-util/e-web-view.c
@@ -3459,3 +3459,118 @@ e_web_view_add_css_rule_into_style_sheet (EWebView *view,
selector,
style);
}
+
+gboolean
+element_has_id (WebKitDOMElement *element,
+ const gchar* id)
+{
+ const gchar *element_id;
+
+ if (!element)
+ return FALSE;
+
+ if (!WEBKIT_DOM_IS_ELEMENT (element))
+ return FALSE;
+
+ element_id = webkit_dom_html_element_get_id (WEBKIT_DOM_HTML_ELEMENT (element));
+
+ if (g_ascii_strcasecmp (element_id, id) != 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean
+element_has_tag (WebKitDOMElement *element,
+ const gchar* tag)
+{
+ const gchar *element_tag;
+
+ if (!WEBKIT_DOM_IS_ELEMENT (element))
+ return FALSE;
+
+ element_tag = webkit_dom_node_get_local_name (WEBKIT_DOM_NODE (element));
+
+ if (g_ascii_strcasecmp (element_tag, tag) != 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean
+element_has_class (WebKitDOMElement *element,
+ const gchar* class)
+{
+ const gchar *element_class;
+
+ if (!element)
+ return FALSE;
+
+ if (!WEBKIT_DOM_IS_ELEMENT (element))
+ return FALSE;
+
+ element_class = webkit_dom_element_get_class_name (element);
+
+ if (g_strstr_len (element_class, -1, class))
+ return TRUE;
+
+ return FALSE;
+}
+
+void
+element_add_class (WebKitDOMElement *element,
+ const gchar* class)
+{
+ const gchar *element_class;
+ gchar *new_class;
+
+ if (!WEBKIT_DOM_IS_ELEMENT (element))
+ return;
+
+ if (element_has_class (element, class))
+ return;
+
+ element_class = webkit_dom_element_get_class_name (element);
+
+ if (g_strcmp0 (element_class, ""))
+ new_class = g_strdup (class);
+ else
+ new_class = g_strconcat (element_class, " ", class, NULL);
+
+ webkit_dom_element_set_class_name (element, new_class);
+
+ g_free (new_class);
+}
+
+void
+element_remove_class (WebKitDOMElement *element,
+ const gchar* class)
+{
+ GRegex *regex;
+ char *new_class;
+ const gchar *element_class;
+
+ if (!WEBKIT_DOM_IS_ELEMENT (element))
+ return;
+
+ if (!element_has_class (element, class))
+ return;
+
+ element_class = webkit_dom_element_get_class_name (element);
+
+ if (g_strcmp0 (element_class, class) == 0) {
+ webkit_dom_element_remove_attribute (element, "class");
+ return;
+ }
+
+ regex = g_regex_new (class, 0, 0, NULL);
+ if (!regex)
+ return;
+
+ new_class = g_regex_replace_literal (regex, element_class, -1, 0, "", 0, NULL);
+
+ webkit_dom_element_set_class_name (element, new_class);
+
+ g_free (new_class);
+ g_regex_unref (regex);
+}
diff --git a/e-util/e-web-view.h b/e-util/e-web-view.h
index 51826a7..8803efd 100644
--- a/e-util/e-web-view.h
+++ b/e-util/e-web-view.h
@@ -203,6 +203,16 @@ void e_web_view_add_css_rule_into_style_sheet
const gchar *style_sheet_id,
const gchar *selector,
const gchar *style);
+gboolean element_has_id (WebKitDOMElement *element,
+ const gchar* id);
+gboolean element_has_tag (WebKitDOMElement *element,
+ const gchar* tag);
+gboolean element_has_class (WebKitDOMElement *element,
+ const gchar* class);
+void element_add_class (WebKitDOMElement *element,
+ const gchar* class);
+void element_remove_class (WebKitDOMElement *element,
+ const gchar* class);
G_END_DECLS
#endif /* E_WEB_VIEW_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]