css: border, margin, padding of <table> master
authoryu.dongliang <18588496441@163.com>
Sat, 25 Apr 2026 10:39:41 +0000 (18:39 +0800)
committeryu.dongliang <18588496441@163.com>
Sat, 25 Apr 2026 10:39:41 +0000 (18:39 +0800)
examples/table.html
html/Makefile
html/abc_css.c
html/abc_css_border.c [new file with mode: 0644]
html/abc_html.c
html/abc_html.h
html/abc_obj.h
ui/Makefile
ui/abc_layout_table.c
ui/abc_render_table.c

index 326065bc32f320adb15836e4900682cf2f5c2472..5c73bda6238871c8b6f2e6925330ee66932ed782 100644 (file)
@@ -2,9 +2,13 @@
 <html>
 <head>
 <style>
 <html>
 <head>
 <style>
+table
+{
+       border-collapse: collapse;
+}
 table,th,td
 {
 table,th,td
 {
-       border:1px solid black;
+       border:1px solid red;
 }
 </style>
 </head>
 }
 </style>
 </head>
index 7e047129abd6078a4c91855522a36f8a0fe8efcf..88b09729347d8ee128d91e5cf78b90bae924a6dc 100644 (file)
@@ -4,6 +4,7 @@ CFILES += abc_html.c
 CFILES += abc_css.c
 CFILES += abc_css_color.c
 CFILES += abc_css_position.c
 CFILES += abc_css.c
 CFILES += abc_css_color.c
 CFILES += abc_css_position.c
+CFILES += abc_css_border.c
 
 CFILES += abc_io_util.c
 CFILES += abc_io_file.c
 
 CFILES += abc_io_util.c
 CFILES += abc_io_file.c
index b00f26b131def7df2c380804c4f957b59d0299f1..fe9ca4226af15b114e31b02b9f8ebf502a7739ac 100644 (file)
@@ -56,6 +56,7 @@ static int __css_parse_value(abc_obj_t* css, abc_obj_t* attr)
 
        abc_char_t* c  = NULL;
        abc_char_t* c2 = NULL;
 
        abc_char_t* c  = NULL;
        abc_char_t* c2 = NULL;
+       int         c0 = ' ';
 
        while (1) {
                c = __io_pop_char(&css->io);
 
        while (1) {
                c = __io_pop_char(&css->io);
@@ -87,8 +88,17 @@ static int __css_parse_value(abc_obj_t* css, abc_obj_t* attr)
 
                if (';' == c->c || '}' == c->c || EOF == c->c)
                        break;
 
                if (';' == c->c || '}' == c->c || EOF == c->c)
                        break;
-               else
-                       scf_string_cat_cstr_len(value, c->utf8, c->len);
+
+               if (' ' == c0) {
+                       if (' ' == c->c || '\t' == c->c || '\r' == c->c || '\n' == c->c) {
+                               free(c);
+                               continue;
+                       }
+
+                       c0 = c->c;
+               }
+
+               scf_string_cat_cstr_len(value, c->utf8, c->len);
 
                free(c);
                c = NULL;
 
                free(c);
                c = NULL;
@@ -798,6 +808,37 @@ int abc_css_use(abc_html_t* html, abc_obj_t* obj)
                                        continue;
                        }
 
                                        continue;
                        }
 
+               } else if (ABC_CSS_COMMA == css->type) {
+                       int      c;
+                       int      c0 = ' ';
+                       uint8_t* p0 = NULL;
+                       uint8_t* p  = css->text->data;
+
+                       do {
+                               c = *p;
+
+                               if (!c || ' ' == c  || '\t' == c  || '\r' == c  || '\n' == c  || ',' == c) {
+                                       if  ( ' ' == c0 || '\t' == c0 || '\r' == c0 || '\n' == c0 || ',' == c0)
+                                               goto next;
+
+                                       if (__html_strncmp(obj->keys[0], p0, (size_t)(p - p0))) {
+                                               p0 = NULL;
+                                               goto next;
+                                       }
+
+                                       abc_obj_set_css(obj, css);
+                                       break;
+                               } else {
+                                       if (!p0)
+                                               p0 = p;
+                               }
+next:
+                               c0 = c;
+                               p++;
+                       } while (c);
+
+                       continue;
+
                } else if (ABC_CSS_LINK    == css->type
                                || ABC_CSS_VISITED == css->type
                                || ABC_CSS_HOVER   == css->type
                } else if (ABC_CSS_LINK    == css->type
                                || ABC_CSS_VISITED == css->type
                                || ABC_CSS_HOVER   == css->type
diff --git a/html/abc_css_border.c b/html/abc_css_border.c
new file mode 100644 (file)
index 0000000..f2ef57b
--- /dev/null
@@ -0,0 +1,154 @@
+#include"abc_html.h"
+
+typedef struct css_border_s
+{
+       char**  names;
+       int     type;
+} css_border_t;
+
+static char* css_solid [] = {"solid",  "实线", NULL};
+static char* css_dotted[] = {"dotted", "点线", NULL};
+static char* css_dashed[] = {"dashed", "虚线", NULL};
+
+static css_border_t  css_borders[] =
+{
+       {css_solid,   ABC_BORDER_SOLID},
+       {css_dotted,  ABC_BORDER_DOTTED},
+       {css_dashed,  ABC_BORDER_DASHED},
+};
+
+static void __css_border_type(int* type, const char* name, size_t name_len)
+{
+       int i;
+       for (i = 0; i < sizeof(css_borders) / sizeof(css_borders[0]); i++) {
+               css_border_t* b = &css_borders[i];
+
+               int j;
+               for (j = 0; b->names[j]; j++) {
+                       if (!__html_strncmp(b->names[j], name, name_len)) {
+                               *type = b->type;
+                               return;
+                       }
+               }
+       }
+}
+
+int abc_css_border(double* r, double* g, double* b, int* width, int* type, abc_obj_t* obj, const uint8_t* str)
+{
+       *r = 0.0;
+       *g = 0.0;
+       *b = 0.0;
+       *width = 1;
+       *type  = ABC_BORDER_SOLID;
+
+       const uint8_t* p    = str;
+       const uint8_t* unit = NULL;
+
+       double  value   = 0.0;
+       int     dot     = 0;
+       int     percent = 0;
+       int     prev    = 0;
+       int     i       = 0;
+       int     c       = 0;
+
+       do {
+               c = *str;
+
+               if ('.' == c)
+                       dot = 10;
+               else if ('%' == c)
+                       percent++;
+
+               else if ('#' == c) {
+                       if (' ' == prev || '\t' == prev || '\r' == prev || '\n' == prev)
+                               p = str;
+
+               } else if ('a' <= c && 'z' >= c) {
+
+                       if (' ' == prev || '\t' == prev || '\r' == prev || '\n' == prev)
+                               p = str;
+                       else if (!unit)
+                               unit = str;
+
+               } else if ('0' <= c && '9' >= c) {
+
+                       if (dot > 0) {
+                               value += (c - '0') / (double)dot;
+                               dot   *= 10;
+                       } else {
+                               value *= 10.0;
+                               value += c - '0';
+                       }
+
+               } else if ('\0' == c || ' ' == c || '\t' == c || '\r' == c || '\n' == c) {
+
+                       if (' ' == prev || '\t' == prev || '\r' == prev || '\n' == prev)
+                               goto next;
+
+                       if (percent) {
+                               value *= 0.01;
+
+                               if (0 == i)
+                                       *width = value;
+
+                       } else if ('a' <= *p && *p <= 'z') {
+                               if (1 == i)
+                                       __css_border_type(type, p, (size_t)(str - p));
+                               else if (i > 1)
+                                       abc_css_color(r, g, b, p);
+
+                       } else if ('#' == *p) {
+                               if (i > 1)
+                                       abc_css_color(r, g, b, p);
+
+                       } else if (unit) {
+                               // for other css units, ignore
+
+                               if (0 == i)
+                                       *width = value;
+                       }
+
+                       p       = str;
+                       unit    = NULL;
+                       value   = 0.0;
+                       dot     = 0;
+                       percent = 0;
+                       i++;
+
+                       if (i > 2)
+                               break;
+               }
+
+next:
+               prev = c;
+               str++;
+       } while (c);
+
+       return 0;
+}
+
+int abc_css_margin(abc_obj_t* obj)
+{
+       int type    = ABC_BORDER_SOLID;
+       int margin  = 2;
+       int border  = 0;
+       int padding = 2;
+
+       double r = 0.0;
+       double g = 0.0;
+       double b = 0.0;
+
+       abc_obj_t* attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_MARGIN);
+       if (attr)
+               margin = atoi(attr->value->data);
+
+       attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BORDER);
+       if (attr)
+               abc_css_border(&r, &g, &b, &border, &type, obj, attr->value->data);
+
+       attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_PADDING);
+       if (attr)
+               padding = atoi(attr->value->data);
+
+       return margin + border + padding;
+}
index c33a917e5b5b2ae95d85d8e0723aa3e35738ae15..1fc771a1ee16d37214758a55fe21ad278ef4332a 100644 (file)
@@ -32,6 +32,8 @@ static char* list_style_type_keys[]  = {"list-style-type",     "列表标记",
 static char* list_style_image_keys[] = {"list-style-image",    "列表标记图片", NULL};
 static char* list_style_pos_keys[]   = {"list-style-position", "列表标记位置", NULL};
 
 static char* list_style_image_keys[] = {"list-style-image",    "列表标记图片", NULL};
 static char* list_style_pos_keys[]   = {"list-style-position", "列表标记位置", NULL};
 
+static char* border_collapse_keys[]  = {"border-collapse",     "边框折叠",     NULL};
+
 static char* class_keys[]      = {"class",      "类名",     NULL};
 static char* type_keys[]       = {"type",       "类型",     NULL};
 static char* name_keys[]       = {"name",       "名字",     NULL};
 static char* class_keys[]      = {"class",      "类名",     NULL};
 static char* type_keys[]       = {"type",       "类型",     NULL};
 static char* name_keys[]       = {"name",       "名字",     NULL};
@@ -255,6 +257,10 @@ static html_attr_t  h6_attrs[] =
 
 static html_attr_t  p_attrs[] =
 {
 
 static html_attr_t  p_attrs[] =
 {
+       {margin_keys,      "",         ABC_HTML_ATTR_MARGIN,          ABC_HTML_FLAG_SHOW},
+       {border_keys,      "",         ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "",         ABC_HTML_ATTR_PADDING,         ABC_HTML_FLAG_SHOW},
+
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
@@ -273,6 +279,10 @@ static html_attr_t  p_attrs[] =
 
 static html_attr_t  css_id_attrs[] =
 {
 
 static html_attr_t  css_id_attrs[] =
 {
+       {margin_keys,      "2",        ABC_HTML_ATTR_MARGIN,          ABC_HTML_FLAG_SHOW},
+       {border_keys,      "1",        ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "4",        ABC_HTML_ATTR_PADDING,         ABC_HTML_FLAG_SHOW},
+
        {font_keys,         "SimSong",  ABC_HTML_ATTR_FONT,            0},
        {font_size_keys,    "16",       ABC_HTML_ATTR_FONT_SIZE,       0},
        {font_color_keys,   "black",    ABC_HTML_ATTR_FONT_COLOR,      ABC_HTML_FLAG_SHOW},
        {font_keys,         "SimSong",  ABC_HTML_ATTR_FONT,            0},
        {font_size_keys,    "16",       ABC_HTML_ATTR_FONT_SIZE,       0},
        {font_color_keys,   "black",    ABC_HTML_ATTR_FONT_COLOR,      ABC_HTML_FLAG_SHOW},
@@ -280,8 +290,6 @@ static html_attr_t  css_id_attrs[] =
 
        {bg_color_keys,     "",         ABC_HTML_ATTR_BG_COLOR,        ABC_HTML_FLAG_SHOW},
 
 
        {bg_color_keys,     "",         ABC_HTML_ATTR_BG_COLOR,        ABC_HTML_FLAG_SHOW},
 
-       {border_keys,       "",         ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
-
        {text_align_keys,       "left", ABC_HTML_ATTR_TEXT_ALIGN,      ABC_HTML_FLAG_SHOW},
        {text_decoration_keys,  "",     ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
        {text_transform_keys,   "",     ABC_HTML_ATTR_TEXT_TRANSFORM,  ABC_HTML_FLAG_SHOW},
        {text_align_keys,       "left", ABC_HTML_ATTR_TEXT_ALIGN,      ABC_HTML_FLAG_SHOW},
        {text_decoration_keys,  "",     ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
        {text_transform_keys,   "",     ABC_HTML_ATTR_TEXT_TRANSFORM,  ABC_HTML_FLAG_SHOW},
@@ -352,13 +360,21 @@ static html_attr_t  link_attrs[] =
 
 static html_attr_t  img_attrs[] =
 {
 
 static html_attr_t  img_attrs[] =
 {
-       {src_keys,         "",           ABC_HTML_ATTR_SRC,        ABC_HTML_FLAG_SHOW},
-       {width_keys,       "100",        ABC_HTML_ATTR_WIDTH,      ABC_HTML_FLAG_SHOW},
-       {height_keys,      "100",        ABC_HTML_ATTR_HEIGHT,     ABC_HTML_FLAG_SHOW},
+       {margin_keys,      "",         ABC_HTML_ATTR_MARGIN,       ABC_HTML_FLAG_SHOW},
+       {border_keys,      "",         ABC_HTML_ATTR_BORDER,       ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "",         ABC_HTML_ATTR_PADDING,      ABC_HTML_FLAG_SHOW},
+
+       {src_keys,         "",         ABC_HTML_ATTR_SRC,          ABC_HTML_FLAG_SHOW},
+       {width_keys,       "100",      ABC_HTML_ATTR_WIDTH,        ABC_HTML_FLAG_SHOW},
+       {height_keys,      "100",      ABC_HTML_ATTR_HEIGHT,       ABC_HTML_FLAG_SHOW},
 };
 
 static html_attr_t  video_attrs[] =
 {
 };
 
 static html_attr_t  video_attrs[] =
 {
+       {margin_keys,      "",         ABC_HTML_ATTR_MARGIN,       ABC_HTML_FLAG_SHOW},
+       {border_keys,      "",         ABC_HTML_ATTR_BORDER,       ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "",         ABC_HTML_ATTR_PADDING,      ABC_HTML_FLAG_SHOW},
+
        {width_keys,       "100",        ABC_HTML_ATTR_WIDTH,      ABC_HTML_FLAG_SHOW},
        {height_keys,      "100",        ABC_HTML_ATTR_HEIGHT,     ABC_HTML_FLAG_SHOW},
        {control_keys,     "",           ABC_HTML_ATTR_CONTROLS,   0},
        {width_keys,       "100",        ABC_HTML_ATTR_WIDTH,      ABC_HTML_FLAG_SHOW},
        {height_keys,      "100",        ABC_HTML_ATTR_HEIGHT,     ABC_HTML_FLAG_SHOW},
        {control_keys,     "",           ABC_HTML_ATTR_CONTROLS,   0},
@@ -424,6 +440,10 @@ static html_attr_t  ol_attrs[] =
 
 static html_attr_t  table_attrs[] =
 {
 
 static html_attr_t  table_attrs[] =
 {
+       {margin_keys,      "2",        ABC_HTML_ATTR_MARGIN,          ABC_HTML_FLAG_SHOW},
+       {border_keys,      "1",        ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "4",        ABC_HTML_ATTR_PADDING,         ABC_HTML_FLAG_SHOW},
+
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
@@ -434,18 +454,20 @@ static html_attr_t  table_attrs[] =
 
        {bg_color_keys,    "",         ABC_HTML_ATTR_BG_COLOR,        ABC_HTML_FLAG_SHOW},
 
 
        {bg_color_keys,    "",         ABC_HTML_ATTR_BG_COLOR,        ABC_HTML_FLAG_SHOW},
 
-       {margin_keys,      "2",        ABC_HTML_ATTR_MARGIN,          ABC_HTML_FLAG_SHOW},
-       {border_keys,      "1",        ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
-       {padding_keys,     "4",        ABC_HTML_ATTR_PADDING,         ABC_HTML_FLAG_SHOW},
+       {border_collapse_keys, "",     ABC_CSS_BORDER_COLLAPSE,       ABC_HTML_FLAG_SHOW},
 };
 
 static html_attr_t  th_attrs[] =
 {
 };
 
 static html_attr_t  th_attrs[] =
 {
+       {margin_keys,      "2",        ABC_HTML_ATTR_MARGIN,          ABC_HTML_FLAG_SHOW},
+       {border_keys,      "1",        ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "4",        ABC_HTML_ATTR_PADDING,         ABC_HTML_FLAG_SHOW},
+
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
        {font_keys,        "SimHei",   ABC_HTML_ATTR_FONT,            0},
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
        {font_keys,        "SimHei",   ABC_HTML_ATTR_FONT,            0},
-       {font_size_keys,   "16",       ABC_HTML_ATTR_FONT_SIZE,       0},
+       {font_size_keys,   "18",       ABC_HTML_ATTR_FONT_SIZE,       0},
        {font_color_keys,  "black",    ABC_HTML_ATTR_FONT_COLOR,      ABC_HTML_FLAG_SHOW},
        {font_style_keys,  "",         ABC_HTML_ATTR_FONT_STYLE,      0},
 
        {font_color_keys,  "black",    ABC_HTML_ATTR_FONT_COLOR,      ABC_HTML_FLAG_SHOW},
        {font_style_keys,  "",         ABC_HTML_ATTR_FONT_STYLE,      0},
 
@@ -454,6 +476,10 @@ static html_attr_t  th_attrs[] =
 
 static html_attr_t  td_attrs[] =
 {
 
 static html_attr_t  td_attrs[] =
 {
+       {margin_keys,      "2",        ABC_HTML_ATTR_MARGIN,          ABC_HTML_FLAG_SHOW},
+       {border_keys,      "1",        ABC_HTML_ATTR_BORDER,          ABC_HTML_FLAG_SHOW},
+       {padding_keys,     "4",        ABC_HTML_ATTR_PADDING,         ABC_HTML_FLAG_SHOW},
+
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
        {class_keys,       "",         ABC_HTML_ATTR_CLASS,           ABC_HTML_FLAG_SHOW},
        {style_keys,       "",         ABC_HTML_ATTR_STYLE,           ABC_HTML_FLAG_SHOW},
        {id_keys,          "",         ABC_HTML_ATTR_ID,              ABC_HTML_FLAG_SHOW},
index 4f59ebe5d41609fcdd3d960f786e6657a11f52ba..2058468122eb4dca814e9ee66ab2959d3d4de0cf 100644 (file)
@@ -57,4 +57,7 @@ int  abc_css_use   (abc_html_t* html, abc_obj_t* obj);
 int  abc_css_color   (double* r, double* g, double* b, const uint8_t* str);
 int  abc_css_position(float*  x, float*  y, float   w, float h, abc_obj_t* obj, const uint8_t* str);
 
 int  abc_css_color   (double* r, double* g, double* b, const uint8_t* str);
 int  abc_css_position(float*  x, float*  y, float   w, float h, abc_obj_t* obj, const uint8_t* str);
 
+int  abc_css_border(double* r, double* g, double* b, int* width, int* type, abc_obj_t* obj, const uint8_t* str);
+int  abc_css_margin(abc_obj_t* obj);
+
 #endif
 #endif
index f157ec8f05620243473b8708af6ec7e77b477ae1..816fa7b64252b3c8076fe78f9951ca12e21c895c 100644 (file)
@@ -131,6 +131,8 @@ enum abc_objs
        ABC_CSS_LIST_STYLE_IMAGE,
        ABC_CSS_LIST_STYLE_POSITION,
 
        ABC_CSS_LIST_STYLE_IMAGE,
        ABC_CSS_LIST_STYLE_POSITION,
 
+       ABC_CSS_BORDER_COLLAPSE,
+
        ABC_CSS_COMMA,
 
        // ... new css add here
        ABC_CSS_COMMA,
 
        // ... new css add here
@@ -140,6 +142,13 @@ enum abc_objs
        ABC_CSS_CLASS = ABC_HTML_ATTR_CLASS,
 };
 
        ABC_CSS_CLASS = ABC_HTML_ATTR_CLASS,
 };
 
+enum abc_border_style
+{
+       ABC_BORDER_SOLID,
+       ABC_BORDER_DOTTED,
+       ABC_BORDER_DASHED,
+};
+
 struct abc_obj_s
 {
        scf_list_t      list;
 struct abc_obj_s
 {
        scf_list_t      list;
index 7962f38066dd9c248875945cc4a899f67c6531a7..7ca2beada88c5ab578bb7a7b38f3f5eee1b9dc7a 100644 (file)
@@ -49,6 +49,7 @@ CFILES += ../html/abc_obj.c
 CFILES += ../html/abc_css.c
 CFILES += ../html/abc_css_color.c
 CFILES += ../html/abc_css_position.c
 CFILES += ../html/abc_css.c
 CFILES += ../html/abc_css_color.c
 CFILES += ../html/abc_css_position.c
+CFILES += ../html/abc_css_border.c
 
 CFILES += ../html/abc_io_util.c
 CFILES += ../html/abc_io_file.c
 
 CFILES += ../html/abc_io_util.c
 CFILES += ../html/abc_io_file.c
index 41da2214995a49a549c92318982eed4dce52605f..8c4124d1da05186a286f928a7fd5a91707161225 100644 (file)
@@ -8,36 +8,37 @@ int abc_layout_table(abc_layout_t* layout, abc_obj_t* obj, int width, int height
        abc_obj_t*   td;
        abc_obj_t*   attr;
 
        abc_obj_t*   td;
        abc_obj_t*   attr;
 
-       int margin  = 0;
-       int border  = 1;
-       int padding = 4;
+       int collapse = 0;
 
 
-       attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_MARGIN);
-       if (attr)
-               margin = atoi(attr->value->data);
-
-       attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BORDER);
-       if (attr)
-               border = atoi(attr->value->data);
-
-       attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_PADDING);
-       if (attr)
-               padding = atoi(attr->value->data);
+       attr = abc_obj_find_attr(obj, ABC_CSS_BORDER_COLLAPSE);
+       if (attr) {
+               if (!__html_strcmp(attr->value->data, "collapse")) {
+                       collapse = 1;
+                       abc_obj_set_attr(obj, ABC_HTML_ATTR_PADDING, "0", 1);
+               }
+       }
 
 
-       int d = margin + border + padding;
+       int d = abc_css_margin(obj);
        int x = obj->x + d;
        int y = obj->y + d;
 
        for (l = scf_list_head(&obj->childs); l != scf_list_sentinel(&obj->childs); l = scf_list_next(l)) {
                tr = scf_list_data(l, abc_obj_t, list);
 
        int x = obj->x + d;
        int y = obj->y + d;
 
        for (l = scf_list_head(&obj->childs); l != scf_list_sentinel(&obj->childs); l = scf_list_next(l)) {
                tr = scf_list_data(l, abc_obj_t, list);
 
+               int d2 = d;
+
                for (l2 = scf_list_head(&tr->childs); l2 != scf_list_sentinel(&tr->childs); l2 = scf_list_next(l2)) {
                        td  = scf_list_data(l2, abc_obj_t, list);
 
                for (l2 = scf_list_head(&tr->childs); l2 != scf_list_sentinel(&tr->childs); l2 = scf_list_next(l2)) {
                        td  = scf_list_data(l2, abc_obj_t, list);
 
+                       if (collapse)
+                               abc_obj_set_attr(td, ABC_HTML_ATTR_MARGIN, "0", 1);
+
+                       d2 = abc_css_margin(td);
+
                        td->x = x;
                        td->y = y;
                        td->x = x;
                        td->y = y;
-                       td->w = obj->td_width  + d * 2;
-                       td->h = obj->td_height + d * 2;
+                       td->w = obj->td_width  + d2 * 2;
+                       td->h = obj->td_height + d2 * 2;
 
                        x += td->w;
                }
 
                        x += td->w;
                }
@@ -45,7 +46,7 @@ int abc_layout_table(abc_layout_t* layout, abc_obj_t* obj, int width, int height
                obj->w = x + d - obj->x;
 
                x  = obj->x         + d;
                obj->w = x + d - obj->x;
 
                x  = obj->x         + d;
-               y += obj->td_height + d * 2;
+               y += obj->td_height + d2 * 2;
        }
 
        obj->h = y + d - obj->y;
        }
 
        obj->h = y + d - obj->y;
index 295ddf07c893149d89ec6a9004a5fc1fe5a5cd22..732d3f7fc96b1f33a13d4581fe82131850f41443 100644 (file)
@@ -63,8 +63,9 @@ static int _render_draw_table(abc_render_t* render, abc_obj_t* obj, int width, i
        if (0 == vao)
                __init_buffers(&vao, buffers);
 
        if (0 == vao)
                __init_buffers(&vao, buffers);
 
-       double margin = 0.0;
-       double border = 1.0;
+       int margin = 0;
+       int border = 1;
+       int border_type = ABC_BORDER_SOLID;
 
        double r0 = 0.0;
        double g0 = 0.0;
 
        double r0 = 0.0;
        double g0 = 0.0;
@@ -74,21 +75,22 @@ static int _render_draw_table(abc_render_t* render, abc_obj_t* obj, int width, i
        double g1 = 0.0;
        double b1 = 0.0;
 
        double g1 = 0.0;
        double b1 = 0.0;
 
-       abc_obj_t* attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_COLOR);
-       if (attr)
-               abc_css_color(&r0, &g0, &b0, attr->value->data);
-
-       attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BG_COLOR);
+       abc_obj_t* attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BG_COLOR);
        if (attr)
                abc_css_color(&r1, &g1, &b1, attr->value->data);
 
        attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_MARGIN);
        if (attr)
        if (attr)
                abc_css_color(&r1, &g1, &b1, attr->value->data);
 
        attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_MARGIN);
        if (attr)
-               margin = atof(attr->value->data);
+               margin = atoi(attr->value->data);
 
        attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BORDER);
        if (attr)
 
        attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BORDER);
        if (attr)
-               border = atof(attr->value->data);
+               abc_css_border(&r0, &g0, &b0, &border, &border_type, obj, attr->value->data);
+       else {
+               attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_COLOR);
+               if (attr)
+                       abc_css_color(&r0, &g0, &b0, attr->value->data);
+       }
 
        float mvp[16];
        __compute_mvp(mvp, 0, 0, 0);
 
        float mvp[16];
        __compute_mvp(mvp, 0, 0, 0);