From d601aa71887b45b4fbd1c1c86f5cfe2971100216 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Fri, 30 Jul 2004 21:53:52 +0000 Subject: [project @ 2004-07-30 21:53:52 by jmb] Implement some CSS3 attribute selectors svn path=/import/netsurf/; revision=1167 --- css/css.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) (limited to 'css/css.c') diff --git a/css/css.c b/css/css.c index 9287096f3..6ff243b18 100644 --- a/css/css.c +++ b/css/css.c @@ -870,6 +870,69 @@ bool css_match_detail(const struct css_selector *detail, match = true; break; + case CSS_SELECTOR_ATTRIB_PRE: + /* matches if the attribute begins with a certain + * value (CSS3) */ + word = strndup(detail->data, detail->data_length); + if (!word) { + /** \todo report to user */ + return false; + } + s = (char *)xmlGetProp(element, + (const xmlChar *) word); + free(word); + if (s && strncasecmp(detail->data2, s, + detail->data2_length) == 0) + match = true; + break; + + case CSS_SELECTOR_ATTRIB_SUF: + /* matches if the attribute ends with a certain + * value (CSS3) */ + word = strndup(detail->data, detail->data_length); + if (!word) { + /** \todo report to user */ + return false; + } + s = (char *)xmlGetProp(element, + (const xmlChar *) word); + free(word); + if (!s) + break; + word = s + (strlen(s) - detail->data2_length); + if (s && strncasecmp(detail->data2, word, + detail->data2_length) == 0) + match = true; + break; + + case CSS_SELECTOR_ATTRIB_SUB: + /* matches if the attribute contains a certain + * value (CSS3) */ + word = strndup(detail->data, detail->data_length); + if (!word) { + /** \todo report to user */ + return false; + } + s = (char *)xmlGetProp(element, + (const xmlChar *) word); + free(word); + if (!s) + break; + /* case insensitive strstr follows */ + /* space -> last possible start position */ + /* word -> start of string to search */ + space = s + (strlen(s) - detail->data2_length); + word = s; + while (word <= space) { + if (strncasecmp(detail->data2, word, + detail->data2_length) == 0) { + match = true; + break; + } + word++; + } + break; + case CSS_SELECTOR_PSEUDO: break; @@ -1336,6 +1399,21 @@ void css_dump_selector(const struct css_selector *r) m->data_length, m->data, m->data2_length, m->data2); break; + case CSS_SELECTOR_ATTRIB_PRE: + fprintf(stderr, "[%.*s^=%.*s]", + m->data_length, m->data, + m->data2_length, m->data2); + break; + case CSS_SELECTOR_ATTRIB_SUF: + fprintf(stderr, "[%.*s$=%.*s]", + m->data_length, m->data, + m->data2_length, m->data2); + break; + case CSS_SELECTOR_ATTRIB_SUB: + fprintf(stderr, "[%.*s*=%.*s]", + m->data_length, m->data, + m->data2_length, m->data2); + break; case CSS_SELECTOR_PSEUDO: fprintf(stderr, ":%.*s", m->data_length, m->data); -- cgit v1.2.3