summaryrefslogtreecommitdiff
path: root/css/css.c
diff options
context:
space:
mode:
Diffstat (limited to 'css/css.c')
-rw-r--r--css/css.c78
1 files changed, 78 insertions, 0 deletions
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);