[evolution/wip/webkit2] Bug 740476 - Blockquote paragraph format indents in Plain Text



commit 7b6cb95b4a51313c1482c60e976cf86ebdd309a2
Author: Tomas Popela <tpopela redhat com>
Date:   Wed Apr 22 13:20:12 2015 +0200

    Bug 740476 - Blockquote paragraph format indents in Plain Text
    
    With this change the Blockquote format will quote the current paragraph
    instead of just indenting it.

 web-extensions/e-html-editor-history-event.h       |    1 +
 .../e-html-editor-selection-dom-functions.c        |  125 ++++++++++++++------
 web-extensions/e-html-editor-undo-redo-manager.c   |   54 ++++++++-
 3 files changed, 144 insertions(+), 36 deletions(-)
---
diff --git a/web-extensions/e-html-editor-history-event.h b/web-extensions/e-html-editor-history-event.h
index 62e65d2..6050765 100644
--- a/web-extensions/e-html-editor-history-event.h
+++ b/web-extensions/e-html-editor-history-event.h
@@ -26,6 +26,7 @@ G_BEGIN_DECLS
 enum EHTMLEditorHistoryEventType {
        HISTORY_ALIGNMENT,
        HISTORY_BLOCK_FORMAT,
+       HISTORY_BLOCKQUOTE,
        HISTORY_BOLD,
        HISTORY_CELL_DIALOG,
        HISTORY_DELETE, /* BackSpace, Delete, with and without selection */
diff --git a/web-extensions/e-html-editor-selection-dom-functions.c 
b/web-extensions/e-html-editor-selection-dom-functions.c
index 088b813..9ff7c6c 100644
--- a/web-extensions/e-html-editor-selection-dom-functions.c
+++ b/web-extensions/e-html-editor-selection-dom-functions.c
@@ -4104,9 +4104,10 @@ static gboolean
 process_block_to_block (WebKitDOMDocument *document,
                         EHTMLEditorWebExtension *extension,
                         EHTMLEditorSelectionBlockFormat format,
-                       const gchar *value,
+                        const gchar *value,
                         WebKitDOMNode *block,
                         WebKitDOMNode *end_block,
+                        WebKitDOMNode *blockquote,
                         gboolean html_mode)
 {
        gboolean after_selection_end = FALSE;
@@ -4130,6 +4131,7 @@ process_block_to_block (WebKitDOMDocument *document,
                                value,
                                webkit_dom_node_get_first_child (block),
                                end_block,
+                               blockquote,
                                html_mode);
 
                        if (finished)
@@ -4153,7 +4155,8 @@ process_block_to_block (WebKitDOMDocument *document,
 
                next_block = webkit_dom_node_get_next_sibling (block);
 
-               if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH)
+               if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH ||
+                   format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE)
                        element = dom_get_paragraph_element (document, extension, -1, 0);
                else
                        element = webkit_dom_document_create_element (
@@ -4202,10 +4205,15 @@ process_block_to_block (WebKitDOMDocument *document,
 
                block = next_block;
 
-               if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH && !html_mode) {
+               if (!html_mode &&
+                   (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH ||
+                    format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE)) {
                        gint citation_level;
 
-                       citation_level = get_citation_level (WEBKIT_DOM_NODE (element));
+                       if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE)
+                               citation_level = 1;
+                       else
+                               citation_level = get_citation_level (WEBKIT_DOM_NODE (element));
 
                        if (citation_level > 0) {
                                gint quote, word_wrap_length;
@@ -4220,7 +4228,12 @@ process_block_to_block (WebKitDOMDocument *document,
                        }
                }
 
-               if (quoted)
+               if (blockquote && format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE) {
+                       webkit_dom_node_append_child (
+                               blockquote, WEBKIT_DOM_NODE (element), NULL);
+                       if (!html_mode)
+                               dom_quote_plain_text_element_after_wrapping (document, element, 1);
+               } else if (!html_mode && quoted)
                        dom_quote_plain_text_element (document, element);
        }
 
@@ -4235,9 +4248,8 @@ format_change_block_to_block (WebKitDOMDocument *document,
 {
        gboolean html_mode = FALSE;
        WebKitDOMElement *selection_start_marker, *selection_end_marker;
-       WebKitDOMNode *block, *end_block;
+       WebKitDOMNode *block, *end_block, *blockquote = NULL;
 
-       dom_selection_save (document);
        selection_start_marker = webkit_dom_document_query_selector (
                document, "span#-x-evo-selection-start-marker", NULL);
        selection_end_marker = webkit_dom_document_query_selector (
@@ -4261,16 +4273,29 @@ format_change_block_to_block (WebKitDOMDocument *document,
        block = get_parent_block_node_from_child (
                WEBKIT_DOM_NODE (selection_start_marker));
 
+       html_mode = e_html_editor_web_extension_get_html_mode (extension);
+
+       if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE) {
+               blockquote = WEBKIT_DOM_NODE (
+                       webkit_dom_document_create_element (document, "BLOCKQUOTE", NULL));
+
+               webkit_dom_element_set_attribute (WEBKIT_DOM_ELEMENT (blockquote), "type", "cite", NULL);
+               if (!html_mode)
+                       webkit_dom_element_set_attribute (
+                               WEBKIT_DOM_ELEMENT (blockquote), "class", "-x-evo-plaintext-quoted", NULL);
+               webkit_dom_node_insert_before (
+                       webkit_dom_node_get_parent_node (block),
+                       blockquote,
+                       block,
+                       NULL);
+       }
+
        end_block = get_parent_block_node_from_child (
                WEBKIT_DOM_NODE (selection_end_marker));
 
-       html_mode = e_html_editor_web_extension_get_html_mode (extension);
-
        /* Process all blocks that are in the selection one by one */
        process_block_to_block (
-               document, extension, format, value, block, end_block, html_mode);
-
-       dom_selection_restore (document);
+               document, extension, format, value, block, end_block, blockquote, html_mode);
 }
 
 static void
@@ -4285,8 +4310,6 @@ format_change_block_to_list (WebKitDOMDocument *document,
        WebKitDOMElement *selection_start_marker, *selection_end_marker, *item, *list;
        WebKitDOMNode *block, *next_block;
 
-       dom_selection_save (document);
-
        selection_start_marker = webkit_dom_document_query_selector (
                document, "span#-x-evo-selection-start-marker", NULL);
        selection_end_marker = webkit_dom_document_query_selector (
@@ -4416,8 +4439,6 @@ format_change_block_to_list (WebKitDOMDocument *document,
        }
 
        merge_lists_if_possible (WEBKIT_DOM_NODE (list));
-
-       dom_selection_restore (document);
 }
 
 static WebKitDOMNode *
@@ -4521,8 +4542,6 @@ format_change_list_to_list (WebKitDOMDocument *document,
        WebKitDOMElement *selection_start_marker, *selection_end_marker;
        WebKitDOMNode *prev_list, *current_list, *next_list;
 
-       dom_selection_save (document);
-
        selection_start_marker = webkit_dom_document_query_selector (
                document, "span#-x-evo-selection-start-marker", NULL);
        selection_end_marker = webkit_dom_document_query_selector (
@@ -4551,7 +4570,7 @@ format_change_list_to_list (WebKitDOMDocument *document,
 
        if (!prev_list || !next_list || indented) {
                format_change_list_from_list (document, extension, format, html_mode);
-               goto out;
+               return;
        }
 
        if (webkit_dom_node_is_same_node (prev_list, next_list)) {
@@ -4565,7 +4584,7 @@ format_change_list_to_list (WebKitDOMDocument *document,
                                        WEBKIT_DOM_NODE (selection_end_marker))));
                if (!prev_list || !next_list) {
                        format_change_list_from_list (document, extension, format, html_mode);
-                       goto out;
+                       return;
                }
        }
 
@@ -4587,11 +4606,9 @@ format_change_list_to_list (WebKitDOMDocument *document,
        }
 
        if (done)
-               goto out;
+               return;
 
        format_change_list_from_list (document, extension, format, html_mode);
-out:
-       dom_selection_restore (document);
 }
 
 static void
@@ -4604,8 +4621,6 @@ format_change_list_to_block (WebKitDOMDocument *document,
        WebKitDOMElement *selection_start, *element, *selection_end;
        WebKitDOMNode *source_list, *next_item, *item, *source_list_clone;
 
-       dom_selection_save (document);
-
        selection_start = webkit_dom_document_query_selector (
                document, "span#-x-evo-selection-start-marker", NULL);
        selection_end = webkit_dom_document_query_selector (
@@ -4631,6 +4646,8 @@ format_change_list_to_block (WebKitDOMDocument *document,
                tmp = webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (next_item));
 
                if (!after_end) {
+                       WebKitDOMNode *node;
+
                        if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH)
                                element = dom_get_paragraph_element (document, extension, -1, 0);
                        else
@@ -4639,12 +4656,9 @@ format_change_list_to_block (WebKitDOMDocument *document,
 
                        after_end = webkit_dom_node_contains (next_item, WEBKIT_DOM_NODE (selection_end));
 
-                       while (webkit_dom_node_get_first_child (next_item)) {
-                               WebKitDOMNode *node = webkit_dom_node_get_first_child (next_item);
-
+                       while ((node = webkit_dom_node_get_first_child (next_item)))
                                webkit_dom_node_append_child (
                                        WEBKIT_DOM_NODE (element), node, NULL);
-                       }
 
                        webkit_dom_node_insert_before (
                                webkit_dom_node_get_parent_node (source_list),
@@ -4665,8 +4679,6 @@ format_change_list_to_block (WebKitDOMDocument *document,
 
        remove_node_if_empty (source_list_clone);
        remove_node_if_empty (source_list);
-
-       dom_selection_restore (document);
 }
 
 /**
@@ -4754,10 +4766,15 @@ dom_selection_set_block_format (WebKitDOMDocument *document,
        if (!range)
                return;
 
+       dom_selection_save (document);
+
        manager = e_html_editor_web_extension_get_undo_redo_manager (extension);
        if (!e_html_editor_undo_redo_manager_is_operation_in_progress (manager)) {
                ev = g_new0 (EHTMLEditorHistoryEvent, 1);
-               ev->type = HISTORY_BLOCK_FORMAT;
+               if (format != E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE)
+                       ev->type = HISTORY_BLOCK_FORMAT;
+               else
+                       ev->type = HISTORY_BLOCKQUOTE;
 
                dom_selection_get_coordinates (
                        document,
@@ -4765,8 +4782,38 @@ dom_selection_set_block_format (WebKitDOMDocument *document,
                        &ev->before.start.y,
                        &ev->before.end.x,
                        &ev->before.end.y);
-               ev->data.style.from = current_format;
-               ev->data.style.to = format;
+
+               if (format != E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE) {
+                       ev->data.style.from = current_format;
+                       ev->data.style.to = format;
+               } else {
+                       WebKitDOMDocumentFragment *fragment;
+                       WebKitDOMElement *element;
+                       WebKitDOMNode *block;
+
+                       fragment = webkit_dom_range_clone_contents (range, NULL);
+
+                       element = webkit_dom_document_get_element_by_id (
+                               document, "-x-evo-selection-start-marker");
+                       block = get_parent_block_node_from_child (WEBKIT_DOM_NODE (element));
+                       webkit_dom_node_replace_child (
+                               WEBKIT_DOM_NODE (fragment),
+                               webkit_dom_node_clone_node (block, TRUE),
+                               webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (fragment)),
+                               NULL);
+
+                       if (!webkit_dom_range_get_collapsed (range, NULL)) {
+                               element = webkit_dom_document_get_element_by_id (
+                                       document, "-x-evo-selection-end-marker");
+                               block = get_parent_block_node_from_child (WEBKIT_DOM_NODE (element));
+                               webkit_dom_node_replace_child (
+                                       WEBKIT_DOM_NODE (fragment),
+                                       webkit_dom_node_clone_node (block, TRUE),
+                                       webkit_dom_node_get_last_child (WEBKIT_DOM_NODE (fragment)),
+                                       NULL);
+                       }
+                       ev->data.fragment = fragment;
+               }
         }
 
        if (from_list && to_list)
@@ -4775,12 +4822,20 @@ dom_selection_set_block_format (WebKitDOMDocument *document,
        if (!from_list && !to_list)
                format_change_block_to_block (document, extension, format, value);
 
-       if (from_list && !to_list)
+       if (from_list && !to_list) {
                format_change_list_to_block (document, extension, format, value);
 
+               if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE) {
+                       dom_selection_restore (document);
+                       format_change_block_to_block (document, extension, format, value);
+               }
+       }
+
        if (!from_list && to_list)
                format_change_block_to_list (document, extension, format);
 
+       dom_selection_restore (document);
+
        dom_force_spell_check_for_current_paragraph (document, extension);
 
        /* When changing the format we need to re-set the alignment */
diff --git a/web-extensions/e-html-editor-undo-redo-manager.c 
b/web-extensions/e-html-editor-undo-redo-manager.c
index e373376..02847ad 100644
--- a/web-extensions/e-html-editor-undo-redo-manager.c
+++ b/web-extensions/e-html-editor-undo-redo-manager.c
@@ -232,7 +232,8 @@ print_history_event (EHTMLEditorHistoryEvent *event)
                case HISTORY_SMILEY:
                case HISTORY_IMAGE:
                case HISTORY_CITATION_SPLIT:
-                       print_fragment_inner_html (event->data.fragment);
+               case HISTORY_HISTORY_BLOCKQUOTE:
+                       print_node_inner_html (WEBKIT_DOM_NODE (event->data.fragment));
                        break;
                case HISTORY_ALIGNMENT:
                case HISTORY_BLOCK_FORMAT:
@@ -815,6 +816,8 @@ undo_redo_hrule_dialog (WebKitDOMDocument *document,
 
        if (undo)
                restore_selection_to_history_event_state (document, event->before);
+       else
+               dom_selection_restore (document);
 }
 
 static void
@@ -862,6 +865,8 @@ undo_redo_image_dialog (WebKitDOMDocument *document,
 
        if (undo)
                restore_selection_to_history_event_state (document, event->before);
+       else
+               dom_selection_restore (document);
 }
 
 static void
@@ -920,6 +925,8 @@ undo_redo_table_dialog (WebKitDOMDocument *document,
 
        if (undo)
                restore_selection_to_history_event_state (document, event->before);
+       else
+               dom_selection_restore (document);
 }
 
 static void
@@ -1328,6 +1335,44 @@ undo_redo_citation_split (WebKitDOMDocument *document,
        }
 }
 
+static void
+undo_redo_blockquote (WebKitDOMDocument *document,
+                      EHTMLEditorWebExtension *extension,
+                      EHTMLEditorHistoryEvent *event,
+                      gboolean undo)
+{
+       WebKitDOMElement *element;
+
+       if (undo)
+               restore_selection_to_history_event_state (document, event->after);
+
+       dom_selection_save (document);
+       element = webkit_dom_document_get_element_by_id (
+               document, "-x-evo-selection-start-marker");
+
+       if (undo) {
+               WebKitDOMNode *node;
+               WebKitDOMElement *parent;
+
+               parent = get_parent_block_element (WEBKIT_DOM_NODE (element));
+               node = webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (parent));
+
+               webkit_dom_node_replace_child (
+                       webkit_dom_node_get_parent_node (node),
+                       WEBKIT_DOM_NODE (event->data.fragment),
+                       node,
+                       NULL);
+       } else {
+               dom_selection_set_block_format (
+                       document, extension, E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE);
+       }
+
+       if (undo)
+               restore_selection_to_history_event_state (document, event->before);
+       else
+               dom_selection_restore (document);
+}
+
 gboolean
 e_html_editor_undo_redo_manager_is_operation_in_progress (EHTMLEditorUndoRedoManager *manager)
 {
@@ -1355,6 +1400,7 @@ free_history_event_content (EHTMLEditorHistoryEvent *event)
                case HISTORY_IMAGE:
                case HISTORY_SMILEY:
                case HISTORY_REMOVE_LINK:
+               case HISTORY_BLOCKQUOTE:
                        if (event->data.fragment != NULL)
                                g_object_unref (event->data.fragment);
                        break;
@@ -1648,6 +1694,9 @@ e_html_editor_undo_redo_manager_undo (EHTMLEditorUndoRedoManager *manager)
                case HISTORY_REPLACE_ALL:
                        undo_redo_replace_all (manager, document, extension, event, TRUE);
                        break;
+               case HISTORY_BLOCKQUOTE:
+                       undo_redo_blockquote (document, extension, event, TRUE);
+                       break;
                default:
                        g_object_unref (extension);
                        return;
@@ -1756,6 +1805,9 @@ e_html_editor_undo_redo_manager_redo (EHTMLEditorUndoRedoManager *manager)
                case HISTORY_REPLACE_ALL:
                        undo_redo_replace_all (manager, document, extension, event, FALSE);
                        break;
+               case HISTORY_BLOCKQUOTE:
+                       undo_redo_blockquote (document, extension, event, FALSE);
+                       break;
                default:
                        g_object_unref (extension);
                        return;


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