From 05b2c5a749dcad013cd288532d6980bc1303a29b Mon Sep 17 00:00:00 2001 From: Christopher Chedeau Date: Sat, 19 Apr 2014 12:11:45 -0700 Subject: [PATCH] transpiling all the attributes (rough pass) --- src/__tests__/Layout-test.c | 738 +++++++++++++++++++++++++++++++++++- src/transpile.html | 61 +++ 2 files changed, 783 insertions(+), 16 deletions(-) diff --git a/src/__tests__/Layout-test.c b/src/__tests__/Layout-test.c index 9b1c9054..548c0677 100644 --- a/src/__tests__/Layout-test.c +++ b/src/__tests__/Layout-test.c @@ -6,10 +6,110 @@ int main() { { - printf("%s", "should layout node with alignItems: flex-start\n"); + printf("%s", "should layout a single node with width and height\n"); css_node_t *root_node = new_css_node(); css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with children\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 3); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + node = &outer_node->children[2]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with nested children\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + node->style.dimensions[CSS_WIDTH] = 500; + node->style.dimensions[CSS_HEIGHT] = 500; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with several children\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + node->style.margin[CSS_LEFT] = 10; + node->style.margin[CSS_TOP] = 10; + node->style.margin[CSS_RIGHT] = 10; + node->style.margin[CSS_BOTTOM] = 10; + init_css_node_children(node, 3); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + node = &outer_node->children[2]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with row flex direction\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.flex_direction = CSS_FLEX_DIRECTION_ROW; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; init_css_node_children(node, 2); css_node_t *outer_node = node; { @@ -22,33 +122,639 @@ int main() print_layout(root_node, 0); free_css_node(root_node); } + { + printf("%s", "should layout node based on children main dimensions\n"); css_node_t *root_node = new_css_node(); css_node_t *node = root_node; - node->style.flex_direction = CSS_FLEX_DIRECTION_ROW; - node->style.dimensions[CSS_WIDTH] = 100; - - init_css_node_children(node, 3); + node->style.dimensions[CSS_WIDTH] = 300; + init_css_node_children(node, 2); css_node_t *outer_node = node; { - css_node_t *node = &outer_node->children[0]; - node->style.dimensions[CSS_HEIGHT] = 50; - node->style.align_items = CSS_ALIGN_STRETCH; - init_css_node_children(node, 3); - css_node_t *outer_node = node; - { - css_node_t *node = &outer_node->children[0]; - node->style.dimensions[CSS_WIDTH] = 50; - } - + css_node_t *node; node = &outer_node->children[0]; + node = &outer_node->children[1]; } - layoutNode(root_node); print_style(root_node, 0); print_layout(root_node, 0); + free_css_node(root_node); + } + { + printf("%s", "should layout node with flex\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with flex recursively\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node->style.flex = CSS_FLEX_ONE; + node->style.dimensions[CSS_WIDTH] = 1000; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node->style.flex = CSS_FLEX_ONE; + node->style.dimensions[CSS_WIDTH] = 1000; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + } + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with targeted margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + node->style.margin[CSS_LEFT] = 5; + node->style.margin[CSS_TOP] = 10; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with justifyContent: flex-start\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_FLEX_START; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with justifyContent: flex-end\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_FLEX_END; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with justifyContent: space-between\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_SPACE_AROUND; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with justifyContent: space-around\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_SPACE_BETWEEN; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with justifyContent: center\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_CENTER; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with flex override height\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with alignItems: flex-start\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.align_items = CSS_ALIGN_FLEX_START; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with alignItems: center\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.align_items = CSS_ALIGN_CENTER; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with alignItems: flex-end\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.align_items = CSS_ALIGN_FLEX_END; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with alignSelf overrides alignItems\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.align_items = CSS_ALIGN_FLEX_END; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with alignItem: stretch\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.align_items = CSS_ALIGN_STRETCH; + node->style.dimensions[CSS_WIDTH] = 1000; + node->style.dimensions[CSS_HEIGHT] = 1000; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout empty node\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout child with margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should not shrink children if not enough space\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.dimensions[CSS_HEIGHT] = 100; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout for center\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout flex-end taking into account margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_FLEX_END; + node->style.dimensions[CSS_HEIGHT] = 100; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout alignItems with margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node->style.align_items = CSS_ALIGN_FLEX_END; + init_css_node_children(node, 2); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node = &outer_node->children[1]; + } + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout flex inside of an empty element\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout alignItems stretch and margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.align_items = CSS_ALIGN_STRETCH; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with padding\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with padding and a child\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.padding[CSS_LEFT] = 5; + node->style.padding[CSS_TOP] = 5; + node->style.padding[CSS_RIGHT] = 5; + node->style.padding[CSS_BOTTOM] = 5; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with padding and a child with margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.padding[CSS_LEFT] = 5; + node->style.padding[CSS_TOP] = 5; + node->style.padding[CSS_RIGHT] = 5; + node->style.padding[CSS_BOTTOM] = 5; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with padding and stretch\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with inner & outer padding and stretch\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.padding[CSS_LEFT] = 50; + node->style.padding[CSS_TOP] = 50; + node->style.padding[CSS_RIGHT] = 50; + node->style.padding[CSS_BOTTOM] = 50; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with stretch and child with margin\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + node->style.align_self = CSS_ALIGN_STRETCH; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with top and left\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with height, padding and space-around\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + node->style.justify_content = CSS_JUSTIFY_SPACE_BETWEEN; + node->style.dimensions[CSS_HEIGHT] = 10; + node->style.padding[CSS_TOP] = 5; + init_css_node_children(node, 1); + css_node_t *outer_node = node; + { + css_node_t *node; + node = &outer_node->children[0]; + } + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with bottom\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); + free_css_node(root_node); + } + + { + printf("%s", "should layout node with both top and bottom\n"); + css_node_t *root_node = new_css_node(); + + css_node_t *node = root_node; + layoutNode(root_node); + print_style(root_node, 0); + print_layout(root_node, 0); free_css_node(root_node); } } diff --git a/src/transpile.html b/src/transpile.html index 079dbb73..4e8d19d4 100644 --- a/src/transpile.html +++ b/src/transpile.html @@ -60,8 +60,69 @@ function printLayout(test) { } return result; } + + function addEnum(node, js_key, c_key, dict) { + if (js_key in node.style) { + add('node->style' + '.' + c_key + ' = ' + dict[node.style[js_key]] + ';'); + } + } + + function addFloat(node, js_key, c_key) { + if (js_key in node.style) { + add('node->style' + '.' + c_key + ' = ' + node.style[js_key] + ';'); + } + } + + function addSpacing(node, spacing) { + addFloat(node, spacing, spacing + '[CSS_LEFT]'); + addFloat(node, spacing, spacing + '[CSS_TOP]'); + addFloat(node, spacing, spacing + '[CSS_RIGHT]'); + addFloat(node, spacing, spacing + '[CSS_BOTTOM]'); + + addFloat(node, spacing + 'Left', spacing + '[CSS_LEFT]'); + addFloat(node, spacing + 'Top', spacing + '[CSS_TOP]'); + addFloat(node, spacing + 'Right', spacing + '[CSS_RIGHT]'); + addFloat(node, spacing + 'Bottom', spacing + '[CSS_BOTTOM]'); + } + function rec(node) { if (node.children) { + addEnum(node, 'flexDirection', 'flex_direction', { + 'row': 'CSS_FLEX_DIRECTION_ROW', + 'column': 'CSS_FLEX_DIRECTION_COLUMN' + }); + addEnum(node, 'justifyContent', 'justify_content', { + 'flex-start': 'CSS_JUSTIFY_FLEX_START', + 'center': 'CSS_JUSTIFY_CENTER', + 'flex-end': 'CSS_JUSTIFY_FLEX_END', + 'space-between': 'CSS_JUSTIFY_SPACE_AROUND', + 'space-around': 'CSS_JUSTIFY_SPACE_BETWEEN' + }); + addEnum(node, 'alignItems', 'align_items', { + 'flex-start': 'CSS_ALIGN_FLEX_START', + 'center': 'CSS_ALIGN_CENTER', + 'flex-end': 'CSS_ALIGN_FLEX_END', + 'stretch': 'CSS_ALIGN_STRETCH' + }); + addEnum(node, 'alignSelf', 'align_self', { + 'flex-start': 'CSS_ALIGN_FLEX_START', + 'center': 'CSS_ALIGN_CENTER', + 'flex-end': 'CSS_ALIGN_FLEX_END', + 'stretch': 'CSS_ALIGN_STRETCH' + }); + addEnum(node, 'flex', 'flex', { + 'none': 'CSS_FLEX_NONE', + '1': 'CSS_FLEX_ONE' + }); + addFloat(node, 'width', 'dimensions[CSS_WIDTH]'); + addFloat(node, 'height', 'dimensions[CSS_HEIGHT]'); + addSpacing(node, 'margin'); + addSpacing(node, 'padding'); + addFloat(node, 'left', 'position[CSS_LEFT]'); + addFloat(node, 'top', 'position[CSS_TOP]'); + addFloat(node, 'right', 'position[CSS_RIGHT]'); + addFloat(node, 'bottom', 'position[CSS_BOTTOM]'); + add('init_css_node_children(node, ' + node.children.length + ');'); add('css_node_t *outer_node = node;'); add('{');