aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Popela <tpopela@redhat.com>2014-06-13 20:50:03 +0800
committerTomas Popela <tpopela@redhat.com>2014-06-13 20:57:26 +0800
commit748299f9c9ccfe3a8f5397445fd138c01e4c978b (patch)
treef5b5afdb2141ee25d9defa0b81301fed23a5cac0
parent5be727eeb41f8bb204784bf043b25373d723eff3 (diff)
downloadgsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.tar
gsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.tar.gz
gsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.tar.bz2
gsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.tar.lz
gsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.tar.xz
gsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.tar.zst
gsoc2013-evolution-748299f9c9ccfe3a8f5397445fd138c01e4c978b.zip
EHTMLEditor - Fix block format change with selection in quoted content
-rw-r--r--e-util/e-html-editor-selection.c94
-rw-r--r--e-util/e-html-editor-view.c5
2 files changed, 66 insertions, 33 deletions
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c
index ddd0b6d386..02c5586824 100644
--- a/e-util/e-html-editor-selection.c
+++ b/e-util/e-html-editor-selection.c
@@ -1589,6 +1589,8 @@ remove_wrapping (WebKitDOMElement *element)
length = webkit_dom_node_list_get_length (list);
for (ii = 0; ii < length; ii++)
remove_node (webkit_dom_node_list_item (list, ii));
+
+ webkit_dom_node_normalize (WEBKIT_DOM_NODE (element));
}
static void
@@ -1600,9 +1602,8 @@ remove_quoting (WebKitDOMElement *element)
list = webkit_dom_element_query_selector_all (
element, "span.-x-evo-quoted", NULL);
length = webkit_dom_node_list_get_length (list);
- for (ii = 0; ii < length; ii++) {
+ for (ii = 0; ii < length; ii++)
remove_node (webkit_dom_node_list_item (list, ii));
- }
list = webkit_dom_element_query_selector_all (
element, "span.-x-evo-temp-text-wrapper", NULL);
@@ -1656,7 +1657,7 @@ format_change_block_to_block (EHTMLEditorSelection *selection,
const gchar *value,
WebKitDOMDocument *document)
{
- gboolean after_selection_end, quoted = FALSE;
+ gboolean after_selection_end, html_mode;
WebKitDOMElement *selection_start_marker, *selection_end_marker, *element;
WebKitDOMNode *block, *next_block;
@@ -1667,17 +1668,25 @@ format_change_block_to_block (EHTMLEditorSelection *selection,
document, "span#-x-evo-selection-end-marker", NULL);
block = webkit_dom_node_get_parent_node (
WEBKIT_DOM_NODE (selection_start_marker));
- if (element_has_class (WEBKIT_DOM_ELEMENT (block), "-x-evo-temp-text-wrapper")) {
+ if (element_has_class (WEBKIT_DOM_ELEMENT (block), "-x-evo-temp-text-wrapper"))
block = webkit_dom_node_get_parent_node (block);
- remove_wrapping (WEBKIT_DOM_ELEMENT (block));
- remove_quoting (WEBKIT_DOM_ELEMENT (block));
- quoted = TRUE;
- }
+
+ html_mode = e_html_editor_view_get_html_mode (view);
/* Process all blocks that are in the selection one by one */
while (block) {
+ gboolean quoted = FALSE;
WebKitDOMNode *child;
+ if (webkit_dom_element_query_selector (
+ WEBKIT_DOM_ELEMENT (block), "span.-x-evo-quoted", NULL)) {
+ quoted = TRUE;
+ remove_quoting (WEBKIT_DOM_ELEMENT (block));
+ }
+
+ if (!html_mode)
+ remove_wrapping (WEBKIT_DOM_ELEMENT (block));
+
after_selection_end = webkit_dom_node_contains (
block, WEBKIT_DOM_NODE (selection_end_marker));
@@ -1705,23 +1714,22 @@ format_change_block_to_block (EHTMLEditorSelection *selection,
block = next_block;
- if (after_selection_end)
- break;
- }
+ if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH && !html_mode) {
+ gint citation_level, quote;
- if (format == E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH &&
- !e_html_editor_view_get_html_mode (view)) {
- gint citation_level, quote;
+ citation_level = get_citation_level (WEBKIT_DOM_NODE (element));
+ quote = citation_level ? citation_level * 2 : 0;
- citation_level = get_citation_level (WEBKIT_DOM_NODE (element));
- quote = citation_level ? citation_level * 2 : 0;
+ element = e_html_editor_selection_wrap_paragraph_length (
+ selection, element, selection->priv->word_wrap_length - quote);
+ }
- element = e_html_editor_selection_wrap_paragraph_length (
- selection, element, selection->priv->word_wrap_length - quote);
- }
+ if (quoted)
+ e_html_editor_view_quote_plain_text_element (view, element);
- if (quoted)
- e_html_editor_view_quote_plain_text_element (view, element);
+ if (after_selection_end)
+ break;
+ }
e_html_editor_selection_restore (selection);
}
@@ -1754,7 +1762,7 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
EHTMLEditorView *view,
WebKitDOMDocument *document)
{
- gboolean after_selection_end;
+ gboolean after_selection_end, in_quote = FALSE;
gboolean html_mode = e_html_editor_view_get_html_mode (view);
WebKitDOMElement *selection_start_marker, *selection_end_marker, *item, *list;
WebKitDOMNode *block, *next_block;
@@ -1767,16 +1775,24 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
document, "span#-x-evo-selection-end-marker", NULL);
block = webkit_dom_node_get_parent_node (
WEBKIT_DOM_NODE (selection_start_marker));
+ if (element_has_class (WEBKIT_DOM_ELEMENT (block), "-x-evo-temp-text-wrapper"))
+ block = webkit_dom_node_get_parent_node (block);
list = create_list_element (selection, document, format, 0, html_mode);
- if (element_has_class (WEBKIT_DOM_ELEMENT (block), "-x-evo-temp-text-wrapper")) {
+ if (webkit_dom_element_query_selector (
+ WEBKIT_DOM_ELEMENT (block), "span.-x-evo-quoted", NULL)) {
WebKitDOMElement *element;
- block = webkit_dom_node_get_parent_node (block);
+ in_quote = TRUE;
- remove_wrapping (WEBKIT_DOM_ELEMENT (block));
- remove_quoting (WEBKIT_DOM_ELEMENT (block));
+ webkit_dom_node_insert_before (
+ webkit_dom_node_get_parent_node (block),
+ e_html_editor_selection_get_caret_position_node (document),
+ block,
+ NULL);
+
+ e_html_editor_selection_restore_caret_position (selection);
e_html_editor_view_exec_command (
view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_NEW_LINE_IN_QUOTED_CONTENT, NULL);
@@ -1790,10 +1806,6 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
WEBKIT_DOM_NODE (element),
NULL);
- selection_start_marker = webkit_dom_document_query_selector (
- document, "span#-x-evo-selection-start-marker", NULL);
- selection_end_marker = webkit_dom_document_query_selector (
- document, "span#-x-evo-selection-end-marker", NULL);
block = webkit_dom_node_get_parent_node (
WEBKIT_DOM_NODE (selection_start_marker));
} else
@@ -1807,7 +1819,7 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
while (block) {
gboolean empty = FALSE;
gchar *content;
- WebKitDOMNode *child;
+ WebKitDOMNode *child, *parent;
after_selection_end = webkit_dom_node_contains (
block, WEBKIT_DOM_NODE (selection_end_marker));
@@ -1815,6 +1827,9 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
next_block = webkit_dom_node_get_next_sibling (
WEBKIT_DOM_NODE (block));
+ remove_wrapping (WEBKIT_DOM_ELEMENT (block));
+ remove_quoting (WEBKIT_DOM_ELEMENT (block));
+
item = webkit_dom_document_create_element (document, "LI", NULL);
content = webkit_dom_node_get_text_content (block);
@@ -1836,8 +1851,25 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
webkit_dom_node_append_child (
WEBKIT_DOM_NODE (list), WEBKIT_DOM_NODE (item), NULL);
+ parent = webkit_dom_node_get_parent_node (block);
remove_node (block);
+ if (in_quote) {
+ /* Remove all parents if previously removed node was the
+ * only one with text content */
+ content = webkit_dom_node_get_text_content (parent);
+ while (parent && content && !*content) {
+ WebKitDOMNode *tmp = webkit_dom_node_get_parent_node (parent);
+
+ remove_node (parent);
+ parent = tmp;
+
+ g_free (content);
+ content = webkit_dom_node_get_text_content (parent);
+ }
+ g_free (content);
+ }
+
block = next_block;
if (after_selection_end)
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index c843afd535..e4f52c593c 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -3034,8 +3034,8 @@ e_html_editor_view_get_selection (EHTMLEditorView *view)
*/
gboolean
e_html_editor_view_exec_command (EHTMLEditorView *view,
- EHTMLEditorViewCommand command,
- const gchar *value)
+ EHTMLEditorViewCommand command,
+ const gchar *value)
{
WebKitDOMDocument *document;
const gchar *cmd_str = 0;
@@ -3274,6 +3274,7 @@ quote_node (WebKitDOMDocument *document,
next_sibling = webkit_dom_node_get_next_sibling (node);
is_html_node =
+ !WEBKIT_DOM_IS_TEXT (prev_sibling) &&
!WEBKIT_DOM_IS_COMMENT (prev_sibling) && (
WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (prev_sibling) ||
element_has_tag (WEBKIT_DOM_ELEMENT (prev_sibling), "b") ||