1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Add get_dom_node_child() which searches for a node with given type

This commit is contained in:
Jonas Fonseca 2006-01-16 07:11:02 +01:00 committed by Jonas Fonseca
parent 6c85c0f009
commit 1d52d67e50
3 changed files with 61 additions and 42 deletions

View File

@ -796,48 +796,17 @@ dom_rss_pop_element(struct dom_stack *stack, struct dom_node *node, void *data)
return DOM_STACK_CODE_OK; return DOM_STACK_CODE_OK;
} }
static struct dom_string *
get_rss_node_text(struct dom_node *node)
{
struct dom_node *child;
int index;
if (!node->data.element.children)
return NULL;
foreach_dom_node (node->data.element.children, child, index) {
if (child->type == DOM_NODE_TEXT)
return &child->string;
}
return NULL;
}
static struct dom_node *
get_rss_child(struct dom_node *parent, enum rss_element_type type)
{
struct dom_node *node;
int index;
if (!parent->data.element.children)
return NULL;
foreach_dom_node (parent->data.element.children, node, index) {
if (node->type == DOM_NODE_ELEMENT
&& type == node->data.element.type)
return node;
}
return NULL;
}
static struct dom_string * static struct dom_string *
get_rss_text(struct dom_node *node, enum rss_element_type type) get_rss_text(struct dom_node *node, enum rss_element_type type)
{ {
node = get_rss_child(node, type); node = get_dom_node_child(node, DOM_NODE_ELEMENT, type);
return node ? get_rss_node_text(node) : NULL; if (!node) return NULL;
node = get_dom_node_child(node, DOM_NODE_TEXT, 0);
return node ? &node->string: NULL;
} }
static void static void

View File

@ -267,6 +267,48 @@ get_dom_node_prev(struct dom_node *node)
return NULL; return NULL;
} }
struct dom_node *
get_dom_node_child(struct dom_node *parent, enum dom_node_type type,
int16_t subtype)
{
struct dom_node_list **list;
struct dom_node *node;
int index;
list = get_dom_node_list_by_type(parent, type);
if (!list) return NULL;
foreach_dom_node (*list, node, index) {
if (node->type != type)
continue;
if (!subtype) return node;
switch (type) {
case DOM_NODE_ELEMENT:
if (node->data.element.type == subtype)
return node;
break;
case DOM_NODE_ATTRIBUTE:
if (node->data.attribute.type == subtype)
return node;
break;
case DOM_NODE_PROCESSING_INSTRUCTION:
if (node->data.attribute.type == subtype)
return node;
break;
default:
return node;
}
}
return NULL;
}
/* Nodes */ /* Nodes */
struct dom_node * struct dom_node *

View File

@ -246,6 +246,11 @@ int get_dom_node_map_index(struct dom_node_list *list, struct dom_node *node);
/* Returns the previous sibling to the node. */ /* Returns the previous sibling to the node. */
struct dom_node *get_dom_node_prev(struct dom_node *node); struct dom_node *get_dom_node_prev(struct dom_node *node);
/* Returns first text node of the element or NULL. */
struct dom_node *
get_dom_node_child(struct dom_node *node, enum dom_node_type child_type,
int16_t child_subtype);
/* Looks up the @node_map for a node matching the requested type and name. /* Looks up the @node_map for a node matching the requested type and name.
* The @subtype maybe be 0 indication unknown subtype and only name should be * The @subtype maybe be 0 indication unknown subtype and only name should be
* tested else it will indicate either the element or attribute private * tested else it will indicate either the element or attribute private
@ -307,17 +312,17 @@ struct dom_string *get_dom_node_value(struct dom_node *node);
/* Returns the name used for identifying the node type. */ /* Returns the name used for identifying the node type. */
struct dom_string *get_dom_node_type_name(enum dom_node_type type); struct dom_string *get_dom_node_type_name(enum dom_node_type type);
/* Based on the type of the parent and the node return a proper list /* Based on the type of the parent and the node type return a proper list
* or NULL. This is useful when adding a node to a parent node. */ * or NULL. This is useful when adding a node to a parent node. */
static inline struct dom_node_list ** static inline struct dom_node_list **
get_dom_node_list(struct dom_node *parent, struct dom_node *node) get_dom_node_list_by_type(struct dom_node *parent, enum dom_node_type type)
{ {
switch (parent->type) { switch (parent->type) {
case DOM_NODE_DOCUMENT: case DOM_NODE_DOCUMENT:
return &parent->data.document.children; return &parent->data.document.children;
case DOM_NODE_ELEMENT: case DOM_NODE_ELEMENT:
switch (node->type) { switch (type) {
case DOM_NODE_ATTRIBUTE: case DOM_NODE_ATTRIBUTE:
return &parent->data.element.map; return &parent->data.element.map;
@ -326,7 +331,7 @@ get_dom_node_list(struct dom_node *parent, struct dom_node *node)
} }
case DOM_NODE_DOCUMENT_TYPE: case DOM_NODE_DOCUMENT_TYPE:
switch (node->type) { switch (type) {
case DOM_NODE_ENTITY: case DOM_NODE_ENTITY:
return &parent->data.document_type.entities; return &parent->data.document_type.entities;
@ -338,7 +343,7 @@ get_dom_node_list(struct dom_node *parent, struct dom_node *node)
} }
case DOM_NODE_PROCESSING_INSTRUCTION: case DOM_NODE_PROCESSING_INSTRUCTION:
switch (node->type) { switch (type) {
case DOM_NODE_ATTRIBUTE: case DOM_NODE_ATTRIBUTE:
return &parent->data.proc_instruction.map; return &parent->data.proc_instruction.map;
@ -351,4 +356,7 @@ get_dom_node_list(struct dom_node *parent, struct dom_node *node)
} }
} }
#define get_dom_node_list(parent, node) \
get_dom_node_list_by_type(parent, (node)->type)
#endif #endif