summaryrefslogtreecommitdiff
path: root/render/box.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/box.c')
-rw-r--r--render/box.c93
1 files changed, 68 insertions, 25 deletions
diff --git a/render/box.c b/render/box.c
index f857a3461..cb94fca36 100644
--- a/render/box.c
+++ b/render/box.c
@@ -1,5 +1,5 @@
/**
- * $Id: box.c,v 1.3 2002/05/11 15:22:24 bursa Exp $
+ * $Id: box.c,v 1.4 2002/05/21 21:32:35 bursa Exp $
*/
#include <assert.h>
@@ -18,6 +18,8 @@
*/
void box_add_child(struct box * parent, struct box * child);
+struct css_style * box_get_style(struct css_stylesheet * stylesheet, struct css_style * parent_style,
+ xmlNode * n, struct css_selector * selector, unsigned int depth);
/**
@@ -60,7 +62,6 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
struct box * inline_container_c;
struct css_style * style;
xmlNode * c;
- xmlChar * s;
if (n->type == XML_ELEMENT_NODE) {
/* work out the style for this element */
@@ -68,19 +69,34 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
(*selector)[depth].element = n->name;
(*selector)[depth].class = (*selector)[depth].id = 0;
- style = xcalloc(1, sizeof(struct css_style));
- memcpy(style, parent_style, sizeof(struct css_style));
- css_get_style(stylesheet, *selector, depth + 1, style);
-
- if ((s = xmlGetProp(n, "style"))) {
- struct css_style * astyle = xcalloc(1, sizeof(struct css_style));
- memcpy(astyle, &css_empty_style, sizeof(struct css_style));
- css_parse_property_list(astyle, s);
- css_cascade(style, astyle);
- free(astyle);
- free(s);
+ style = box_get_style(stylesheet, parent_style, n, *selector, depth + 1);
+ }
+
+ if (n->type == XML_TEXT_NODE ||
+ (n->type == XML_ELEMENT_NODE && (style->float_ == CSS_FLOAT_LEFT ||
+ style->float_ == CSS_FLOAT_RIGHT))) {
+ /* text nodes are converted to inline boxes, wrapped in an inline container block */
+ if (inline_container == 0) { /* this is the first inline node: make a container */
+ inline_container = xcalloc(1, sizeof(struct box));
+ inline_container->type = BOX_INLINE_CONTAINER;
+ box_add_child(parent, inline_container);
+ }
+ box = calloc(1, sizeof(struct box));
+ box->node = n;
+ box_add_child(inline_container, box);
+ if (n->type == XML_TEXT_NODE) {
+ box->type = BOX_INLINE;
+ box->text = squash_whitespace(n->content);
+ } else {
+ box->type = BOX_FLOAT;
+ box->style = style;
+ inline_container_c = 0;
+ for (c = n->children; c != 0; c = c->next)
+ inline_container_c = xml_to_box(c, style, stylesheet,
+ selector, depth + 1, box, inline_container_c);
}
+ } else if (n->type == XML_ELEMENT_NODE) {
switch (style->display) {
case CSS_DISPLAY_BLOCK: /* blocks get a node in the box tree */
box = xcalloc(1, sizeof(struct box));
@@ -111,6 +127,7 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
inline_container = 0;
break;
case CSS_DISPLAY_TABLE_ROW:
+ assert(parent->type == BOX_TABLE);
box = xcalloc(1, sizeof(struct box));
box->node = n;
box->type = BOX_TABLE_ROW;
@@ -122,6 +139,7 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
inline_container = 0;
break;
case CSS_DISPLAY_TABLE_CELL:
+ assert(parent->type == BOX_TABLE_ROW);
box = xcalloc(1, sizeof(struct box));
box->node = n;
box->type = BOX_TABLE_CELL;
@@ -136,18 +154,6 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
case CSS_DISPLAY_NONE:
default:
}
- } else if (n->type == XML_TEXT_NODE) {
- /* text nodes are converted to inline boxes, wrapped in an inline container block */
- if (inline_container == 0) { /* this is the first inline node: make a container */
- inline_container = xcalloc(1, sizeof(struct box));
- inline_container->type = BOX_INLINE_CONTAINER;
- box_add_child(parent, inline_container);
- }
- box = calloc(1, sizeof(struct box));
- box->node = n;
- box->type = BOX_INLINE;
- box->text = n->content;
- box_add_child(inline_container, box);
}
return inline_container;
@@ -155,6 +161,42 @@ struct box * xml_to_box(xmlNode * n, struct css_style * parent_style, struct css
/*
+ * get the style for an element
+ */
+
+struct css_style * box_get_style(struct css_stylesheet * stylesheet, struct css_style * parent_style,
+ xmlNode * n, struct css_selector * selector, unsigned int depth)
+{
+ struct css_style * style = xcalloc(1, sizeof(struct css_style));
+ xmlChar * s;
+
+ memcpy(style, parent_style, sizeof(struct css_style));
+ css_get_style(stylesheet, selector, depth, style);
+
+ if ((s = xmlGetProp(n, "width"))) {
+ if (strrchr(s, '%'))
+ style->width.width = CSS_WIDTH_PERCENT,
+ style->width.value.percent = atof(s);
+ else
+ style->width.width = CSS_WIDTH_LENGTH,
+ style->width.value.length.unit = CSS_UNIT_PX,
+ style->width.value.length.value = atof(s);
+ }
+
+ if ((s = xmlGetProp(n, "style"))) {
+ struct css_style * astyle = xcalloc(1, sizeof(struct css_style));
+ memcpy(astyle, &css_empty_style, sizeof(struct css_style));
+ css_parse_property_list(astyle, s);
+ css_cascade(style, astyle);
+ free(astyle);
+ free(s);
+ }
+
+ return style;
+}
+
+
+/*
* print a box tree to standard output
*/
@@ -175,6 +217,7 @@ void box_dump(struct box * box, unsigned int depth)
case BOX_TABLE: printf("BOX_TABLE <%s>\n", box->node->name); break;
case BOX_TABLE_ROW: printf("BOX_TABLE_ROW <%s>\n", box->node->name); break;
case BOX_TABLE_CELL: printf("BOX_TABLE_CELL <%s>\n", box->node->name); break;
+ case BOX_FLOAT: printf("BOX_FLOAT <%s>\n", box->node->name); break;
default: printf("Unknown box type\n");
}