diff options
author | James Bursa <james@netsurf-browser.org> | 2003-04-13 12:50:10 +0000 |
---|---|---|
committer | James Bursa <james@netsurf-browser.org> | 2003-04-13 12:50:10 +0000 |
commit | 63b6455f7365507ce502369b738ecc09e54e25ed (patch) | |
tree | 52b677856ffad0793f0f3b7d1ab46d9768d30e8a /render | |
parent | 120ef825e08eac5ac274449a2df53812073b560d (diff) | |
download | netsurf-63b6455f7365507ce502369b738ecc09e54e25ed.tar.gz netsurf-63b6455f7365507ce502369b738ecc09e54e25ed.tar.bz2 |
[project @ 2003-04-13 12:50:10 by bursa]
style element, CSS fixes, id selectors.
svn path=/import/netsurf/; revision=124
Diffstat (limited to 'render')
-rw-r--r-- | render/box.c | 41 | ||||
-rw-r--r-- | render/html.c | 100 | ||||
-rw-r--r-- | render/layout.c | 16 |
3 files changed, 112 insertions, 45 deletions
diff --git a/render/box.c b/render/box.c index a94088fa6..f99715659 100644 --- a/render/box.c +++ b/render/box.c @@ -1,5 +1,5 @@ /** - * $Id: box.c,v 1.40 2003/04/11 21:06:51 bursa Exp $ + * $Id: box.c,v 1.41 2003/04/13 12:50:10 bursa Exp $ */ #include <assert.h> @@ -148,10 +148,11 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, { struct box * box = 0; struct box * inline_container_c; - struct css_style * style; + struct css_style * style = 0; xmlNode * c; char * s; char * text = 0; + xmlChar *s2; assert(n != 0 && parent_style != 0 && stylesheet != 0 && selector != 0 && parent != 0 && fonts != 0); @@ -163,15 +164,17 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, *selector = xrealloc(*selector, (depth + 1) * sizeof(struct css_selector)); (*selector)[depth].element = (const char *) n->name; (*selector)[depth].class = (*selector)[depth].id = 0; - if ((s = (char *) xmlGetProp(n, (const xmlChar *) "class"))) { - (*selector)[depth].class = s; - /*free(s);*/ - } + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "class"))) + (*selector)[depth].class = s; /* TODO: free this later */ + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "id"))) + (*selector)[depth].id = s; style = box_get_style(stylesheet, stylesheet_count, parent_style, n, *selector, depth + 1); LOG(("display: %s", css_display_name[style->display])); - if (style->display == CSS_DISPLAY_NONE) + if (style->display == CSS_DISPLAY_NONE) { + free(style); return inline_container; + } /* special elements */ if (strcmp((const char *) n->name, "a") == 0) { @@ -187,13 +190,18 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, LOG(("image")); /*box = box_image(n, style, href); add_img_element(elements, box->img);*/ - if (style->display == CSS_DISPLAY_INLINE) { + /*if (style->display == CSS_DISPLAY_INLINE) { if ((s = (char *) xmlGetProp(n, (const xmlChar *) "alt"))) { text = squash_tolat1(s); xfree(s); } - } + }*/ /* TODO: block images, start fetch */ + if ((s2 = xmlGetProp(n, (const xmlChar *) "alt"))) { + xmlNode *alt = xmlNewText(s2); + free(s2); + xmlAddChild(n, alt); + } } else if (strcmp((const char *) n->name, "textarea") == 0) { char * content = xmlNodeGetContent(n); @@ -213,7 +221,7 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, for (c = n->children; c != 0; c = c->next) { if (strcmp((const char *) c->name, "option") == 0) { char * content = xmlNodeGetContent(c); - char * thistext = tolat1(content); + char * thistext = squash_tolat1(content); LOG(("option")); current_option = box_option(c, style, current_select); option_addtext(current_option, thistext); @@ -242,6 +250,8 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, inline_container->last->space = 1; } xfree(text); + if (style != 0) + free(style); return inline_container; } } @@ -283,7 +293,6 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, parent = box_create(BOX_FLOAT_LEFT, 0, href); if (style->float_ == CSS_FLOAT_RIGHT) parent->type = BOX_FLOAT_RIGHT; box_add_child(inline_container, parent); - style->float_ = CSS_FLOAT_NONE; if (style->display == CSS_DISPLAY_INLINE) style->display = CSS_DISPLAY_BLOCK; @@ -309,7 +318,9 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, selector, depth + 1, box, inline_container_c, href, fonts, current_select, current_option, current_textarea, current_form, elements); - inline_container = 0; + if (style->float_ == CSS_FLOAT_NONE) + /* continue in this inline container if this is a float */ + inline_container = 0; break; case CSS_DISPLAY_INLINE: /* inline elements get no box, but their children do */ assert(box == 0); /* special inline elements have already been @@ -423,6 +434,8 @@ struct css_style * box_get_style(struct content ** stylesheet, unsigned int r, g, b; if (s[0] == '#' && sscanf(s + 1, "%2x%2x%2x", &r, &g, &b) == 3) style->background_color = (b << 16) | (g << 8) | r; + else if (s[0] != '#') + style->background_color = named_colour(s); free(s); } @@ -437,6 +450,8 @@ struct css_style * box_get_style(struct content ** stylesheet, unsigned int r, g, b; if (s[0] == '#' && sscanf(s + 1, "%2x%2x%2x", &r, &g, &b) == 3) style->color = (b << 16) | (g << 8) | r; + else if (s[0] != '#') + style->color = named_colour(s); free(s); } @@ -452,6 +467,8 @@ struct css_style * box_get_style(struct content ** stylesheet, unsigned int r, g, b; if (s[0] == '#' && sscanf(s + 1, "%2x%2x%2x", &r, &g, &b) == 3) style->color = (b << 16) | (g << 8) | r; + else if (s[0] != '#') + style->color = named_colour(s); free(s); } } diff --git a/render/html.c b/render/html.c index f3f547e88..9b38b7378 100644 --- a/render/html.c +++ b/render/html.c @@ -1,5 +1,5 @@ /** - * $Id: html.c,v 1.13 2003/04/11 21:06:51 bursa Exp $ + * $Id: html.c,v 1.14 2003/04/13 12:50:10 bursa Exp $ */ #include <assert.h> @@ -91,22 +91,10 @@ int html_convert(struct content *c, unsigned int width, unsigned int height) html_title(c, head); /* get stylesheets */ - html_find_stylesheets(c, head); - c->data.html.stylesheet_content = xcalloc(c->data.html.stylesheet_count, - sizeof(*c->data.html.stylesheet_content)); - c->error = 0; c->active = 0; - for (i = 0; i != c->data.html.stylesheet_count; i++) { - fetch_data = xcalloc(1, sizeof(*fetch_data)); - fetch_data->c = c; - fetch_data->i = i; - c->active++; - fetchcache(c->data.html.stylesheet_url[i], c->url, - html_convert_css_callback, - fetch_data, width, height, 1 << CONTENT_CSS); - } + html_find_stylesheets(c, head); while (c->active != 0) { if (c->status_callback != 0) { @@ -142,12 +130,11 @@ int html_convert(struct content *c, unsigned int width, unsigned int height) xmlFreeDoc(document); cache_free(c->data.html.stylesheet_content[0]); - for (i = 1; i != c->data.html.stylesheet_count; i++) { + if (c->data.html.stylesheet_content[1] != 0) + content_destroy(c->data.html.stylesheet_content[1]); + for (i = 2; i != c->data.html.stylesheet_count; i++) if (c->data.html.stylesheet_content[i] != 0) cache_free(c->data.html.stylesheet_content[i]); - xfree(c->data.html.stylesheet_url[i]); - } - xfree(c->data.html.stylesheet_url); xfree(c->data.html.stylesheet_content); c->status_callback(c->status_p, "Formatting document"); @@ -171,7 +158,7 @@ void html_convert_css_callback(fetchcache_msg msg, struct content *css, switch (msg) { case FETCHCACHE_OK: free(data); - LOG(("got stylesheet '%s'", c->data.html.stylesheet_url[i])); + LOG(("got stylesheet '%s'", css->url)); c->data.html.stylesheet_content[i] = css; /*css_dump_stylesheet(css->data.css);*/ c->active--; @@ -214,12 +201,22 @@ void html_title(struct content *c, xmlNode *head) void html_find_stylesheets(struct content *c, xmlNode *head) { xmlNode *node; - char *rel, *type, *media, *href; - unsigned int count = 1; + char *rel, *type, *media, *href, *data, *url; + unsigned int i = 2; + struct fetch_data *fetch_data; + + /* stylesheet 0 is the base style sheet, stylesheet 1 is any <style> elements */ + c->data.html.stylesheet_content = xcalloc(2, sizeof(*c->data.html.stylesheet_content)); + c->data.html.stylesheet_content[1] = 0; + c->data.html.stylesheet_count = 2; - c->data.html.stylesheet_url = xcalloc(1, sizeof(*c->data.html.stylesheet_url)); - c->data.html.stylesheet_url[0] = "file:///%3CNetSurf$Dir%3E/Resources/CSS"; - c->data.html.stylesheet_count = 1; + fetch_data = xcalloc(1, sizeof(*fetch_data)); + fetch_data->c = c; + fetch_data->i = 0; + c->active++; + fetchcache("file:///%3CNetSurf$Dir%3E/Resources/CSS", c->url, + html_convert_css_callback, + fetch_data, c->width, c->height, 1 << CONTENT_CSS); if (head == 0) return; @@ -258,16 +255,57 @@ void html_find_stylesheets(struct content *c, xmlNode *head) if (!(href = (char *) xmlGetProp(node, (const xmlChar *) "href"))) continue; - count++; - c->data.html.stylesheet_url = xrealloc(c->data.html.stylesheet_url, - count * sizeof(*c->data.html.stylesheet_url)); - c->data.html.stylesheet_url[count - 1] = url_join(href, c->url); - LOG(("linked stylesheet '%s'", c->data.html.stylesheet_url[count - 1])); - free(href); + url = url_join(href, c->url); + LOG(("linked stylesheet %i '%s'", i, url)); + free(href); + + /* start fetch */ + c->data.html.stylesheet_content = xrealloc(c->data.html.stylesheet_content, + (i + 1) * sizeof(*c->data.html.stylesheet_content)); + fetch_data = xcalloc(1, sizeof(*fetch_data)); + fetch_data->c = c; + fetch_data->i = i; + c->active++; + fetchcache(url, c->url, html_convert_css_callback, + fetch_data, c->width, c->height, 1 << CONTENT_CSS); + free(url); + i++; + + } else if (strcmp(node->name, "style") == 0) { + /* type='text/css' */ + if (!(type = (char *) xmlGetProp(node, (const xmlChar *) "type"))) + continue; + if (strcmp(type, "text/css") != 0) { + free(type); + continue; + } + free(type); + + /* media contains 'screen' or 'all' or not present */ + if ((media = (char *) xmlGetProp(node, (const xmlChar *) "media"))) { + if (strstr(media, "screen") == 0 && + strstr(media, "all") == 0) { + free(media); + continue; + } + free(media); + } + + /* create stylesheet */ + LOG(("style element")); + if (c->data.html.stylesheet_content[1] == 0) + c->data.html.stylesheet_content[1] = content_create(CONTENT_CSS, ""); + + data = xmlNodeGetContent(node); + content_process_data(c->data.html.stylesheet_content[1], data, strlen(data)); + free(data); } } - c->data.html.stylesheet_count = count; + c->data.html.stylesheet_count = i; + + if (c->data.html.stylesheet_content[1] != 0) + content_convert(c->data.html.stylesheet_content[1], c->width, c->height); } diff --git a/render/layout.c b/render/layout.c index 891d54f1f..7b1e40ba4 100644 --- a/render/layout.c +++ b/render/layout.c @@ -1,5 +1,5 @@ /** - * $Id: layout.c,v 1.38 2003/04/09 21:57:09 bursa Exp $ + * $Id: layout.c,v 1.39 2003/04/13 12:50:10 bursa Exp $ */ #include <assert.h> @@ -408,10 +408,22 @@ struct box * layout_line(struct box * first, unsigned long width, unsigned long move_y = 1; /* fprintf(stderr, "layout_line: '%.*s' %li %li\n", b->length, b->text, xp, x); */ } else { + /* float */ + unsigned long w = width; d = b->children; d->float_children = 0; /* css_dump_style(b->style); */ - layout_node(d, width, d, 0, 0); + if (d->style->width.width == CSS_WIDTH_AUTO) { + /* either a float with no width specified (contravenes standard) + * or we don't know the width for some reason, eg. image not loaded */ + calculate_widths(b); + w = width / 2; + if (d->max_width < w) + w = d->max_width; + else if (w < d->min_width) + w = d->min_width; + } + layout_node(d, w, d, 0, 0); d->x = d->y = 0; b->width = d->width; b->height = d->height; |