summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2003-04-13 12:50:10 +0000
committerJames Bursa <james@netsurf-browser.org>2003-04-13 12:50:10 +0000
commit63b6455f7365507ce502369b738ecc09e54e25ed (patch)
tree52b677856ffad0793f0f3b7d1ab46d9768d30e8a /render
parent120ef825e08eac5ac274449a2df53812073b560d (diff)
downloadnetsurf-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.c41
-rw-r--r--render/html.c100
-rw-r--r--render/layout.c16
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;