/** * e_html_editor_dom_node_find_parent_element: * @node: Start node * @tagname: Tag name of element to search * * Recursively searches for first occurance of element with given @tagname * that is parent of given @node. * * Returns: A #WebKitDOMElement with @tagname representing parent of @node or * @NULL when @node has no parent with given @tagname. When @node matches @tagname, * then the @node is returned. */ WebKitDOMElement * e_html_editor_dom_node_find_parent_element (WebKitDOMNode *node, const gchar *tagname) { gint taglen = strlen (tagname); while (node) { if (WEBKIT_DOM_IS_ELEMENT (node)) { gchar *node_tagname; node_tagname = webkit_dom_element_get_tag_name ( WEBKIT_DOM_ELEMENT (node)); if (node_tagname && (strlen (node_tagname) == taglen) && (g_ascii_strncasecmp (node_tagname, tagname, taglen) == 0)) { g_free (node_tagname); return WEBKIT_DOM_ELEMENT (node); } g_free (node_tagname); } node = WEBKIT_DOM_NODE (webkit_dom_node_get_parent_element (node)); } return NULL; }
/** * e_html_editor_dom_node_find_child_element: * @node: Start node * @tagname: Tag name of element to search. * * Recursively searches for first occurrence of element with given @tagname that * is a child of @node. * * Returns: A #WebKitDOMElement with @tagname representing a child of @node or * @NULL when @node has no child with given @tagname. When @node matches @tagname, * then the @node is returned. */ WebKitDOMElement * e_html_editor_dom_node_find_child_element (WebKitDOMNode *node, const gchar *tagname) { WebKitDOMNode *start_node = node; gint taglen = strlen (tagname); do { if (WEBKIT_DOM_IS_ELEMENT (node)) { gchar *node_tagname; node_tagname = webkit_dom_element_get_tag_name ( WEBKIT_DOM_ELEMENT (node)); if (node_tagname && (strlen (node_tagname) == taglen) && (g_ascii_strncasecmp (node_tagname, tagname, taglen) == 0)) { g_free (node_tagname); return WEBKIT_DOM_ELEMENT (node); } g_free (node_tagname); } if (webkit_dom_node_has_child_nodes (node)) { node = webkit_dom_node_get_first_child (node); } else if (webkit_dom_node_get_next_sibling (node)) { node = webkit_dom_node_get_next_sibling (node); } else { node = webkit_dom_node_get_parent_node (node); } } while (!webkit_dom_node_is_same_node (node, start_node)); return NULL; }
static gboolean get_has_style (EEditorSelection *selection, const gchar *style_tag) { WebKitDOMNode *node; WebKitDOMElement *element; WebKitDOMRange *range; gboolean result; gint tag_len; range = editor_selection_get_current_range (selection); if (!range) return FALSE; node = webkit_dom_range_get_start_container (range, NULL); if (!WEBKIT_DOM_IS_ELEMENT (node)) element = webkit_dom_node_get_parent_element (node); else element = WEBKIT_DOM_ELEMENT (node); tag_len = strlen (style_tag); result = FALSE; while (!result && element) { gchar *element_tag; element_tag = webkit_dom_element_get_tag_name (element); result = ((tag_len == strlen (element_tag)) && (g_ascii_strncasecmp (element_tag, style_tag, tag_len) == 0)); /* Special case: <blockquote type=cite> marks quotation, while * just <blockquote> is used for indentation. If the <blockquote> * has type=cite, then ignore it */ if (result && g_ascii_strncasecmp (element_tag, "blockquote", 10) == 0) { if (webkit_dom_element_has_attribute (element, "type")) { gchar *type; type = webkit_dom_element_get_attribute ( element, "type"); if (g_ascii_strncasecmp (type, "cite", 4) == 0) { result = FALSE; } g_free (type); } } g_free (element_tag); if (result) { break; } element = webkit_dom_node_get_parent_element ( WEBKIT_DOM_NODE (element)); } return result; }
gboolean e_html_editor_node_is_selection_position_node (WebKitDOMNode *node) { WebKitDOMElement *element; if (!node || !WEBKIT_DOM_IS_ELEMENT (node)) return FALSE; element = WEBKIT_DOM_ELEMENT (node); return element_has_id (element, "-x-evo-selection-start-marker") || element_has_id (element, "-x-evo-selection-end-marker"); }
gboolean element_has_tag (WebKitDOMElement *element, const gchar* tag) { gchar *element_tag; if (!WEBKIT_DOM_IS_ELEMENT (element)) return FALSE; element_tag = webkit_dom_node_get_local_name (WEBKIT_DOM_NODE (element)); if (g_ascii_strcasecmp (element_tag, tag) != 0) { g_free (element_tag); return FALSE; } g_free (element_tag); return TRUE; }
gboolean element_has_id (WebKitDOMElement *element, const gchar* id) { gchar *element_id; if (!element) return FALSE; if (!WEBKIT_DOM_IS_ELEMENT (element)) return FALSE; element_id = webkit_dom_element_get_id (element); if (g_ascii_strcasecmp (element_id, id) != 0) { g_free (element_id); return FALSE; } g_free (element_id); return TRUE; }
WebKitDOMNode * e_html_editor_get_parent_block_node_from_child (WebKitDOMNode *node) { WebKitDOMNode *parent = node; if (!WEBKIT_DOM_IS_ELEMENT (parent) || e_html_editor_node_is_selection_position_node (parent)) parent = webkit_dom_node_get_parent_node (parent); if (element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-temp-text-wrapper") || element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-quoted") || element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-quote-character") || element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-signature") || WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (parent) || element_has_tag (WEBKIT_DOM_ELEMENT (parent), "b") || element_has_tag (WEBKIT_DOM_ELEMENT (parent), "i") || element_has_tag (WEBKIT_DOM_ELEMENT (parent), "u")) parent = webkit_dom_node_get_parent_node (parent); if (element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-quoted")) parent = webkit_dom_node_get_parent_node (parent); return parent; }