[evolution/wip/webkit2] Bug 740476 - Blockquote paragraph format indents in Plain Text
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip/webkit2] Bug 740476 - Blockquote paragraph format indents in Plain Text
- Date: Wed, 22 Apr 2015 13:17:52 +0000 (UTC)
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]