[evolution/wip/webkit-composer] EEditorWidget: Remove unneeded Unicode ZERO WIDTH SPACE characters while typing



commit 51101c6dcd1d78e82a173d66ff66170beeab87ca
Author: Tomas Popela <tpopela redhat com>
Date:   Mon Jan 27 15:26:48 2014 +0100

    EEditorWidget: Remove unneeded Unicode ZERO WIDTH SPACE characters while typing
    
    Also rename UNICODE_HIDDEN_SPACE to UNICODE_ZERO_WIDTH_SPACE

 composer/e-composer-private.c |    4 +-
 e-util/e-editor-selection.c   |   18 +++++++-------
 e-util/e-editor-widget.c      |   48 +++++++++++++++++++++++++++++++++++++++-
 3 files changed, 57 insertions(+), 13 deletions(-)
---
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c
index a0a7d3f..d58180d 100644
--- a/composer/e-composer-private.c
+++ b/composer/e-composer-private.c
@@ -27,7 +27,7 @@
 /* Initial height of the picture gallery. */
 #define GALLERY_INITIAL_HEIGHT 150
 
-#define UNICODE_HIDDEN_SPACE "\xe2\x80\x8b"
+#define UNICODE_ZERO_WIDTH_SPACE "\xe2\x80\x8b"
 
 static void
 composer_setup_charset_menu (EMsgComposer *composer)
@@ -874,7 +874,7 @@ composer_move_caret (EMsgComposer *composer)
                webkit_dom_element_set_id (
                        WEBKIT_DOM_ELEMENT (element), "-x-evo-input-start");
                webkit_dom_html_element_set_inner_html (
-                       WEBKIT_DOM_HTML_ELEMENT (element), UNICODE_HIDDEN_SPACE, NULL);
+                       WEBKIT_DOM_HTML_ELEMENT (element), UNICODE_ZERO_WIDTH_SPACE, NULL);
        }
 
        if (start_bottom) {
diff --git a/e-util/e-editor-selection.c b/e-util/e-editor-selection.c
index 8f62412..2f99cad 100644
--- a/e-util/e-editor-selection.c
+++ b/e-util/e-editor-selection.c
@@ -39,7 +39,7 @@
        (G_TYPE_INSTANCE_GET_PRIVATE \
        ((obj), E_TYPE_EDITOR_SELECTION, EEditorSelectionPrivate))
 
-#define UNICODE_HIDDEN_SPACE "\xe2\x80\x8b"
+#define UNICODE_ZERO_WIDTH_SPACE "\xe2\x80\x8b"
 #define SPACES_PER_INDENTATION 4
 
 /**
@@ -1439,7 +1439,7 @@ e_editor_selection_set_block_format (EEditorSelection *selection,
                        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) {
+                       if (g_strcmp0 (content, UNICODE_ZERO_WIDTH_SPACE) == 0) {
                                webkit_dom_node_set_text_content (paragraph_node, "", NULL);
                        }
                        g_free (content);
@@ -1450,7 +1450,7 @@ 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);
+               content = g_strconcat ("<li>", UNICODE_ZERO_WIDTH_SPACE, "</li>", NULL);
                webkit_dom_html_element_set_inner_html (
                        WEBKIT_DOM_HTML_ELEMENT (element),
                        content,
@@ -2369,7 +2369,7 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
                        /* https://bugs.webkit.org/show_bug.cgi?id=15256 */
                        webkit_dom_html_element_set_inner_html (
                                WEBKIT_DOM_HTML_ELEMENT (tt_element),
-                               UNICODE_HIDDEN_SPACE, NULL);
+                               UNICODE_ZERO_WIDTH_SPACE, NULL);
                        webkit_dom_range_insert_node (range, WEBKIT_DOM_NODE (tt_element), NULL);
 
                        move_caret_into_element (document, tt_element);
@@ -2447,7 +2447,7 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
                        webkit_dom_element_set_id (tt_element, "ev-tt");
 
                        inner_html = webkit_dom_html_element_get_inner_html (WEBKIT_DOM_HTML_ELEMENT 
(tt_element));
-                       result = e_str_replace_string (inner_html, UNICODE_HIDDEN_SPACE, "");
+                       result = e_str_replace_string (inner_html, UNICODE_ZERO_WIDTH_SPACE, "");
                        if (result) {
                                webkit_dom_html_element_set_inner_html (
                                        WEBKIT_DOM_HTML_ELEMENT (tt_element),
@@ -2457,7 +2457,7 @@ e_editor_selection_set_monospaced (EEditorSelection *selection,
                        }
 
                        outer_html = webkit_dom_html_element_get_outer_html (WEBKIT_DOM_HTML_ELEMENT 
(tt_element));
-                       tmp = g_strconcat (outer_html, UNICODE_HIDDEN_SPACE, NULL);
+                       tmp = g_strconcat (outer_html, UNICODE_ZERO_WIDTH_SPACE, NULL);
                        webkit_dom_html_element_set_outer_html (
                                WEBKIT_DOM_HTML_ELEMENT (tt_element),
                                tmp, NULL);
@@ -3629,7 +3629,7 @@ wrap_lines (EEditorSelection *selection,
 
                        /* If there is temporary hidden space we remove it */
                        text_content = webkit_dom_node_get_text_content (node);
-                       if (g_strstr_len (text_content, -1, UNICODE_HIDDEN_SPACE)) {
+                       if (g_strstr_len (text_content, -1, UNICODE_ZERO_WIDTH_SPACE)) {
                                webkit_dom_character_data_delete_data (
                                        WEBKIT_DOM_CHARACTER_DATA (node), 0, 1, NULL);
                                g_free (text_content);
@@ -4005,12 +4005,12 @@ e_editor_selection_wrap_lines (EEditorSelection *selection)
 
                text_content = webkit_dom_node_get_text_content (paragraph);
                /* If there is hidden space character in the beginning we remove it */
-               if (g_strstr_len (text_content, -1, UNICODE_HIDDEN_SPACE)) {
+               if (g_strstr_len (text_content, -1, UNICODE_ZERO_WIDTH_SPACE)) {
                        WebKitDOMNode *child = webkit_dom_node_get_first_child (paragraph);
 
                        if (WEBKIT_DOM_IS_CHARACTER_DATA (child)) {
                                GString *result = e_str_replace_string (
-                                       text_content, UNICODE_HIDDEN_SPACE, "");
+                                       text_content, UNICODE_ZERO_WIDTH_SPACE, "");
 
                                if (result) {
                                        webkit_dom_character_data_set_data (
diff --git a/e-util/e-editor-widget.c b/e-util/e-editor-widget.c
index c55158f..fe0f2fd 100644
--- a/e-util/e-editor-widget.c
+++ b/e-util/e-editor-widget.c
@@ -35,7 +35,7 @@
        (G_TYPE_INSTANCE_GET_PRIVATE \
        ((obj), E_TYPE_EDITOR_WIDGET, EEditorWidgetPrivate))
 
-#define UNICODE_HIDDEN_SPACE "\xe2\x80\x8b"
+#define UNICODE_ZERO_WIDTH_SPACE "\xe2\x80\x8b"
 
 #define URL_PATTERN \
        "((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?" \
@@ -304,15 +304,59 @@ e_editor_widget_force_spellcheck (EEditorWidget *widget)
 }
 
 static void
+body_input_event_cb (WebKitDOMElement *element,
+                     WebKitDOMEvent *event,
+                     EEditorWidget *editor_widget)
+{
+       WebKitDOMNode *node;
+       WebKitDOMRange *range = editor_widget_get_dom_range (editor_widget);
+
+       /* If text before caret includes UNICODE_ZERO_WIDTH_SPACE character, remove it */
+       node = webkit_dom_range_get_end_container (range, NULL);
+       if (WEBKIT_DOM_IS_TEXT (node)) {
+               gchar *text = webkit_dom_node_get_text_content (node);
+               if (strstr (text, UNICODE_ZERO_WIDTH_SPACE)) {
+                       WebKitDOMDocument *document;
+                       WebKitDOMDOMWindow *window;
+                       WebKitDOMDOMSelection *selection;
+
+                       GString *res = e_str_replace_string (text, UNICODE_ZERO_WIDTH_SPACE, "");
+
+                       webkit_dom_node_set_text_content (node, res->str, NULL);
+
+                       document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (editor_widget));
+                       window = webkit_dom_document_get_default_view (document);
+                       selection = webkit_dom_dom_window_get_selection (window);
+
+                       webkit_dom_dom_selection_modify (selection, "move", "right", "character");
+
+                       g_string_free (res, TRUE);
+               }
+               g_free (text);
+       }
+}
+
+
+static void
 editor_widget_load_status_changed (EEditorWidget *widget)
 {
        WebKitLoadStatus status;
+       WebKitDOMDocument *document;
 
        status = webkit_web_view_get_load_status (WEBKIT_WEB_VIEW (widget));
        if (status != WEBKIT_LOAD_FINISHED)
                return;
 
        widget->priv->reload_in_progress = FALSE;
+       document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (widget));
+
+       /* Register on input event that is called when the content (body) is modified */
+       webkit_dom_event_target_add_event_listener (
+               WEBKIT_DOM_EVENT_TARGET (webkit_dom_document_get_body (document)),
+               "input",
+               G_CALLBACK (body_input_event_cb),
+               FALSE,
+               widget);
 
        /* Dispatch queued operations */
        while (widget->priv->postreload_operations &&
@@ -2327,7 +2371,7 @@ process_elements (WebKitDOMNode *node,
        nodes = webkit_dom_node_get_child_nodes (node);
        length = webkit_dom_node_list_get_length (nodes);
        regex = g_regex_new ("\x9", 0, 0, NULL);
-       regex_hidden_space = g_regex_new (UNICODE_HIDDEN_SPACE, 0, 0, NULL);
+       regex_hidden_space = g_regex_new (UNICODE_ZERO_WIDTH_SPACE, 0, 0, NULL);
 
        for (ii = 0; ii < length; ii++) {
                WebKitDOMNode *child;


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