diff --git a/src/liborcus/xls_xml_context.cpp b/src/liborcus/xls_xml_context.cpp index 85916fc7..739678ee 100644 --- a/src/liborcus/xls_xml_context.cpp +++ b/src/liborcus/xls_xml_context.cpp @@ -1292,7 +1292,7 @@ void xls_xml_context::start_element_border(const xml_token_attrs_t& attrs) { ss::border_direction_t dir = ss::border_direction_t::unknown; ss::border_style_t style = ss::border_style_t::unknown; - ss::color_rgb_t color; + std::optional color; long weight = 0; for (const xml_token_attr_t& attr : attrs) @@ -1950,8 +1950,14 @@ void xls_xml_context::commit_default_style() { for (const border_style_type& b : m_default_style->borders) { - border_style->set_style(b.dir, b.style); - border_style->set_color(b.dir, 255, b.color.red, b.color.green, b.color.blue); + if (b.dir == ss::border_direction_t::unknown) + continue; + + if (b.style != ss::border_style_t::unknown) + border_style->set_style(b.dir, b.style); + + if (b.color) + border_style->set_color(b.dir, 255, b.color->red, b.color->green, b.color->blue); } } @@ -2109,8 +2115,14 @@ void xls_xml_context::commit_styles() for (const border_style_type& b : style->borders) { - border_style->set_style(b.dir, b.style); - border_style->set_color(b.dir, 255, b.color.red, b.color.green, b.color.blue); + if (b.dir == ss::border_direction_t::unknown) + continue; + + if (b.style != ss::border_style_t::unknown) + border_style->set_style(b.dir, b.style); + + if (b.color) + border_style->set_color(b.dir, 255, b.color->red, b.color->green, b.color->blue); } size_t border_id = border_style->commit(); diff --git a/src/liborcus/xls_xml_context.hpp b/src/liborcus/xls_xml_context.hpp index 9f00bb07..d7377e42 100644 --- a/src/liborcus/xls_xml_context.hpp +++ b/src/liborcus/xls_xml_context.hpp @@ -127,7 +127,7 @@ class xls_xml_context : public xml_context_base { spreadsheet::border_direction_t dir = spreadsheet::border_direction_t::unknown; spreadsheet::border_style_t style = spreadsheet::border_style_t::unknown; - spreadsheet::color_rgb_t color; + std::optional color; }; struct font_style_type diff --git a/src/orcus_test_xls_xml.cpp b/src/orcus_test_xls_xml.cpp index 627c957d..f20603c6 100644 --- a/src/orcus_test_xls_xml.cpp +++ b/src/orcus_test_xls_xml.cpp @@ -756,73 +756,171 @@ void test_xls_xml_cell_borders_directions() case ss::border_direction_t::top: assert(border->top.style); assert(*border->top.style == ss::border_style_t::thin); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(!border->bottom.style); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(!border->left.style); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(!border->right.style); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(!border->diagonal_bl_tr.style); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(!border->diagonal_tl_br.style); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; case ss::border_direction_t::left: assert(!border->top.style); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(!border->bottom.style); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(border->left.style); assert(*border->left.style == ss::border_style_t::thin); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(!border->right.style); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(!border->diagonal_bl_tr.style); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(!border->diagonal_tl_br.style); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; case ss::border_direction_t::right: assert(!border->top.style); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(!border->bottom.style); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(!border->left.style); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(border->right.style); assert(*border->right.style == ss::border_style_t::thin); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(!border->diagonal_bl_tr.style); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(!border->diagonal_tl_br.style); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; case ss::border_direction_t::bottom: assert(!border->top.style); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(border->bottom.style); assert(*border->bottom.style == ss::border_style_t::thin); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(!border->left.style); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(!border->right.style); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(!border->diagonal_bl_tr.style); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(!border->diagonal_tl_br.style); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; case spreadsheet::border_direction_t::diagonal: assert(!border->top.style); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(!border->bottom.style); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(!border->left.style); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(!border->right.style); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(border->diagonal_bl_tr.style); assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(border->diagonal_tl_br.style); assert(*border->diagonal_tl_br.style == ss::border_style_t::thin); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; case spreadsheet::border_direction_t::diagonal_tl_br: assert(!border->top.style); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(!border->bottom.style); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(!border->left.style); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(!border->right.style); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(!border->diagonal_bl_tr.style); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(border->diagonal_tl_br.style); assert(*border->diagonal_tl_br.style == ss::border_style_t::thin); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; case spreadsheet::border_direction_t::diagonal_bl_tr: assert(!border->top.style); + assert(!border->top.border_color); + assert(!border->top.border_width); assert(!border->bottom.style); + assert(!border->bottom.border_color); + assert(!border->bottom.border_width); assert(!border->left.style); + assert(!border->left.border_color); + assert(!border->left.border_width); assert(!border->right.style); + assert(!border->right.border_color); + assert(!border->right.border_width); assert(!border->diagonal.style); + assert(!border->diagonal.border_color); + assert(!border->diagonal.border_width); assert(border->diagonal_bl_tr.style); assert(*border->diagonal_bl_tr.style == ss::border_style_t::thin); + assert(!border->diagonal_bl_tr.border_color); + assert(!border->diagonal_bl_tr.border_width); assert(!border->diagonal_tl_br.style); + assert(!border->diagonal_tl_br.border_color); + assert(!border->diagonal_tl_br.border_width); break; default: assert(!"unhandled direction!");