summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-10-19 21:46:54 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-10-19 21:46:54 +0000
commit3b433639d83e6bf4ddb074f989c17502bc862fc0 (patch)
treeb8b0aa295f2521413a52ddca79d19c2bf9d87f00 /src
parent0aa91129557556fcc8dbb92c699c641c161e777c (diff)
downloadlibcss-3b433639d83e6bf4ddb074f989c17502bc862fc0.tar.gz
libcss-3b433639d83e6bf4ddb074f989c17502bc862fc0.tar.bz2
Provide an internal mechanism for dumping stylesheets to a file handle.
Make the css21 test driver call this so we can see if it's working. svn path=/trunk/libcss/; revision=5602
Diffstat (limited to 'src')
-rw-r--r--src/stylesheet.c172
-rw-r--r--src/stylesheet.h3
2 files changed, 175 insertions, 0 deletions
diff --git a/src/stylesheet.c b/src/stylesheet.c
index fa32d76..80944db 100644
--- a/src/stylesheet.c
+++ b/src/stylesheet.c
@@ -521,4 +521,176 @@ css_error css_stylesheet_remove_rule(css_stylesheet *sheet, css_rule *rule)
return CSS_OK;
}
+static void css_stylesheet_dump_rule(css_rule *rule, FILE *target);
+static void css_stylesheet_dump_selector_list(css_selector *list, FILE *target);
+static void css_stylesheet_dump_selector(css_selector *selector, FILE *target);
+static void css_stylesheet_dump_string(css_string *string, FILE *target);
+
+/**
+ * Dump a stylesheet
+ *
+ * \param sheet The stylesheet to dump
+ * \param target The file handle to output to
+ */
+void css_stylesheet_dump(css_stylesheet *sheet, FILE *target)
+{
+ css_rule *r;
+
+ if (sheet == NULL || target == NULL)
+ return;
+
+ fprintf(target, "%s (%s) %sabled origin: %d media: %d\n",
+ sheet->url, sheet->title ? sheet->title : "",
+ sheet->disabled ? "dis" : "en", sheet->origin,
+ sheet->media);
+
+ fprintf(target, "Rules:\n");
+
+ for (r = sheet->rule_list; r != NULL; r = r->next)
+ css_stylesheet_dump_rule(r, target);
+}
+
+/**
+ * Dump a CSS rule
+ *
+ * \param rule The rule to dump
+ * \param target The file handle to output to
+ */
+void css_stylesheet_dump_rule(css_rule *rule, FILE *target)
+{
+ fprintf(target, " Rule %d (type %d):\n",
+ rule->index, rule->type);
+
+ fprintf(target, " ");
+
+ switch (rule->type) {
+ case CSS_RULE_UNKNOWN:
+ break;
+ case CSS_RULE_SELECTOR:
+ for (uint32_t i = 0; i < rule->data.selector.selector_count;
+ i++) {
+ css_stylesheet_dump_selector_list(
+ rule->data.selector.selectors[i], target);
+ if (i != rule->data.selector.selector_count - 1)
+ fprintf(target, ", ");
+ }
+ break;
+ case CSS_RULE_CHARSET:
+ case CSS_RULE_IMPORT:
+ case CSS_RULE_MEDIA:
+ case CSS_RULE_FONT_FACE:
+ case CSS_RULE_PAGE:
+ break;
+ }
+
+ fprintf(target, "\n");
+}
+
+/**
+ * Dump a CSS selector list
+ *
+ * \param list The selector list to dump
+ * \param target The file handle to output to
+ */
+void css_stylesheet_dump_selector_list(css_selector *list, FILE *target)
+{
+ if (list->combinator != NULL)
+ css_stylesheet_dump_selector_list(list->combinator, target);
+
+ switch (list->combinator_type) {
+ case CSS_COMBINATOR_NONE:
+ break;
+ case CSS_COMBINATOR_ANCESTOR:
+ fprintf(target, " ");
+ break;
+ case CSS_COMBINATOR_PARENT:
+ fprintf(target, " > ");
+ break;
+ case CSS_COMBINATOR_SIBLING:
+ fprintf(target, " + ");
+ break;
+ }
+
+ css_stylesheet_dump_selector(list, target);
+}
+
+/**
+ * Dump a CSS selector
+ *
+ * \param selector The selector to dump
+ * \param target The file handle to output to
+ */
+void css_stylesheet_dump_selector(css_selector *selector, FILE *target)
+{
+ css_selector *s;
+
+ switch (selector->type) {
+ case CSS_SELECTOR_ELEMENT:
+ if (selector->specifics != NULL &&
+ (selector->data.name.len != 1 ||
+ selector->data.name.ptr[0] != '*')) {
+ css_stylesheet_dump_string(&selector->data.name,
+ target);
+ }
+ break;
+ case CSS_SELECTOR_CLASS:
+ fprintf(target, ".");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ break;
+ case CSS_SELECTOR_ID:
+ fprintf(target, "#");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ break;
+ case CSS_SELECTOR_PSEUDO:
+ fprintf(target, ":");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ if (selector->data.value.len > 0) {
+ fprintf(target, "(");
+ css_stylesheet_dump_string(&selector->data.value,
+ target);
+ fprintf(target, ")");
+ }
+ break;
+ case CSS_SELECTOR_ATTRIBUTE:
+ fprintf(target, "[");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ fprintf(target, "]");
+ break;
+ case CSS_SELECTOR_ATTRIBUTE_EQUAL:
+ fprintf(target, "[");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ fprintf(target, "=\"");
+ css_stylesheet_dump_string(&selector->data.value, target);
+ fprintf(target, "\"]");
+ break;
+ case CSS_SELECTOR_ATTRIBUTE_DASHMATCH:
+ fprintf(target, "[");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ fprintf(target, "|=\"");
+ css_stylesheet_dump_string(&selector->data.value, target);
+ fprintf(target, "\"]");
+ break;
+ case CSS_SELECTOR_ATTRIBUTE_INCLUDES:
+ fprintf(target, "[");
+ css_stylesheet_dump_string(&selector->data.name, target);
+ fprintf(target, "~=\"");
+ css_stylesheet_dump_string(&selector->data.value, target);
+ fprintf(target, "\"]");
+ break;
+ }
+
+ for (s = selector->specifics; s != NULL; s = s->next)
+ css_stylesheet_dump_selector(s, target);
+}
+
+/**
+ * Dump a CSS string
+ *
+ * \param string The string to dump
+ * \param target The file handle to output to
+ */
+void css_stylesheet_dump_string(css_string *string, FILE *target)
+{
+ fprintf(target, "%.*s", string->len, string->ptr);
+}
diff --git a/src/stylesheet.h b/src/stylesheet.h
index bcb7b17..eaab9c3 100644
--- a/src/stylesheet.h
+++ b/src/stylesheet.h
@@ -9,6 +9,7 @@
#define css_stylesheet_h_
#include <inttypes.h>
+#include <stdio.h>
#include <libcss/errors.h>
#include <libcss/functypes.h>
@@ -173,5 +174,7 @@ css_error css_stylesheet_rule_add_selector(css_stylesheet *sheet,
css_error css_stylesheet_add_rule(css_stylesheet *sheet, css_rule *rule);
css_error css_stylesheet_remove_rule(css_stylesheet *sheet, css_rule *rule);
+void css_stylesheet_dump(css_stylesheet *sheet, FILE *target);
+
#endif