diff options
-rw-r--r-- | e-util/e-html-editor-view.c | 132 |
1 files changed, 74 insertions, 58 deletions
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c index 493fa74a60..945b60a3e6 100644 --- a/e-util/e-html-editor-view.c +++ b/e-util/e-html-editor-view.c @@ -449,6 +449,62 @@ get_citation_level (WebKitDOMNode *node, return level; } +static gchar * +get_quotation_for_level (gint quote_level) +{ + gint ii; + GString *output = g_string_new (""); + + for (ii = 0; ii < quote_level; ii++) { + g_string_append (output, "<span class=\"-x-evo-quote-character\">"); + g_string_append (output, QUOTE_SYMBOL); + g_string_append (output, " "); + g_string_append (output, "</span>"); + } + + return g_string_free (output, FALSE); +} + +static void +quote_plain_text_element_after_wrapping (WebKitDOMDocument *document, + WebKitDOMElement *element, + gint quote_level) +{ + WebKitDOMNodeList *list; + WebKitDOMNode *quoted_node; + gint length, ii; + gchar *quotation; + + quoted_node = WEBKIT_DOM_NODE ( + webkit_dom_document_create_element (document, "SPAN", NULL)); + webkit_dom_element_set_class_name ( + WEBKIT_DOM_ELEMENT (quoted_node), "-x-evo-quoted"); + quotation = get_quotation_for_level (quote_level); + webkit_dom_html_element_set_inner_html ( + WEBKIT_DOM_HTML_ELEMENT (quoted_node), quotation, NULL); + + list = webkit_dom_element_query_selector_all ( + element, "br.-x-evo-wrap-br", NULL); + webkit_dom_node_insert_before ( + WEBKIT_DOM_NODE (element), + quoted_node, + webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (element)), + NULL); + + length = webkit_dom_node_list_get_length (list); + for (ii = 0; ii < length; ii++) { + WebKitDOMNode *br = webkit_dom_node_list_item (list, ii); + + webkit_dom_node_insert_before ( + webkit_dom_node_get_parent_node (br), + webkit_dom_node_clone_node (quoted_node, TRUE), + webkit_dom_node_get_next_sibling (br), + NULL); + } + + g_free (quotation); +} + static WebKitDOMElement * insert_new_line_into_citation (EHTMLEditorView *view, const gchar *html_to_insert) @@ -484,8 +540,24 @@ insert_new_line_into_citation (EHTMLEditorView *view, WEBKIT_DOM_NODE (element)); if (WEBKIT_DOM_IS_HTML_QUOTE_ELEMENT (next_sibling)) { - e_html_editor_view_quote_plain_text_element ( - view, WEBKIT_DOM_ELEMENT (next_sibling)); + gint citation_level, length; + gint word_wrap_length = + e_html_editor_selection_get_word_wrap_length (selection); + WebKitDOMNode *node; + + citation_level = get_citation_level (next_sibling, FALSE); + length = word_wrap_length - 2 * citation_level; + + node = webkit_dom_node_get_first_child (next_sibling); + /* Rewrap and requote first block after the newly inserted line */ + if (node && WEBKIT_DOM_IS_ELEMENT (node)) { + remove_quoting_from_element (WEBKIT_DOM_ELEMENT (node)); + remove_wrapping_from_element (WEBKIT_DOM_ELEMENT (node)); + node = WEBKIT_DOM_NODE (e_html_editor_selection_wrap_paragraph_length ( + selection, WEBKIT_DOM_ELEMENT (node), length)); + quote_plain_text_element_after_wrapping ( + document, WEBKIT_DOM_ELEMENT (node), citation_level); + } e_html_editor_view_force_spell_check (view); } @@ -522,62 +594,6 @@ insert_new_line_into_citation (EHTMLEditorView *view, return paragraph; } -static gchar * -get_quotation_for_level (gint quote_level) -{ - gint ii; - GString *output = g_string_new (""); - - for (ii = 0; ii < quote_level; ii++) { - g_string_append (output, "<span class=\"-x-evo-quote-character\">"); - g_string_append (output, QUOTE_SYMBOL); - g_string_append (output, " "); - g_string_append (output, "</span>"); - } - - return g_string_free (output, FALSE); -} - -static void -quote_plain_text_element_after_wrapping (WebKitDOMDocument *document, - WebKitDOMElement *element, - gint quote_level) -{ - WebKitDOMNodeList *list; - WebKitDOMNode *quoted_node; - gint length, ii; - gchar *quotation; - - quoted_node = WEBKIT_DOM_NODE ( - webkit_dom_document_create_element (document, "SPAN", NULL)); - webkit_dom_element_set_class_name ( - WEBKIT_DOM_ELEMENT (quoted_node), "-x-evo-quoted"); - quotation = get_quotation_for_level (quote_level); - webkit_dom_html_element_set_inner_html ( - WEBKIT_DOM_HTML_ELEMENT (quoted_node), quotation, NULL); - - list = webkit_dom_element_query_selector_all ( - element, "br.-x-evo-wrap-br", NULL); - webkit_dom_node_insert_before ( - WEBKIT_DOM_NODE (element), - quoted_node, - webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (element)), - NULL); - - length = webkit_dom_node_list_get_length (list); - for (ii = 0; ii < length; ii++) { - WebKitDOMNode *br = webkit_dom_node_list_item (list, ii); - - webkit_dom_node_insert_before ( - webkit_dom_node_get_parent_node (br), - webkit_dom_node_clone_node (quoted_node, TRUE), - webkit_dom_node_get_next_sibling (br), - NULL); - } - - g_free (quotation); -} - static void body_input_event_cb (WebKitDOMElement *element, WebKitDOMEvent *event, |