aboutsummaryrefslogtreecommitdiff
path: root/src/HtmlSearch.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/HtmlSearch.c')
-rw-r--r--src/HtmlSearch.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/HtmlSearch.c b/src/HtmlSearch.c
index 8449ac9..adf64bd 100644
--- a/src/HtmlSearch.c
+++ b/src/HtmlSearch.c
@@ -450,6 +450,37 @@ QuickMediaStringView quickmedia_html_node_get_attribute_value(QuickMediaHtmlNode
}
}
+QuickMediaHtmlNode* quickmedia_html_node_find_child(QuickMediaHtmlNode *self, const char *tag_name, const char *attribute_name, const char *attribute_value) {
+ QuickMediaStringView tag;
+ tag.data = tag_name;
+ tag.size = strlen(tag_name);
+
+ QuickMediaStringView attr_name;
+ attr_name.data = attribute_name;
+ attr_name.size = strlen(attribute_name);
+
+ QuickMediaStringView attr_value;
+ attr_value.data = attribute_value;
+ attr_value.size = strlen(attribute_value);
+
+ for(QuickMediaHtmlChildNode *child = self->first_child; child; child = child->next) {
+ if(!child->node.is_tag)
+ continue;
+
+ if(!string_views_equal_case_insensitive(child->node.name, tag))
+ continue;
+
+ QuickMediaHtmlAttribute *attr = get_attribute_by_name(child, attr_name);
+ if(!attr)
+ continue;
+
+ if(string_views_equal_case_insensitive(attr->value, attr_value))
+ return &child->node;
+ }
+
+ return NULL;
+}
+
static int merge_inner_text(QuickMediaHtmlNode *node, QuickMediaString *str) {
if(node->is_tag) {
int newline = 0;