Hello community, here is the log from the commit of package liborcus for openSUSE:Factory checked in at 2018-02-03 15:36:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/liborcus (Old) and /work/SRC/openSUSE:Factory/.liborcus.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "liborcus" Sat Feb 3 15:36:28 2018 rev:23 rq:571125 version:0.13.2 Changes: -------- --- /work/SRC/openSUSE:Factory/liborcus/liborcus.changes 2018-01-09 14:50:44.278708570 +0100 +++ /work/SRC/openSUSE:Factory/.liborcus.new/liborcus.changes 2018-02-03 15:36:29.634210179 +0100 @@ -1,0 +2,7 @@ +Tue Jan 30 14:57:03 UTC 2018 - [email protected] + +- Version update to 0.13.2: + * Various small fixes + * Improvements in Excel 2003 XML import iflter + +------------------------------------------------------------------- Old: ---- liborcus-0.13.1.tar.xz New: ---- liborcus-0.13.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ liborcus.spec ++++++ --- /var/tmp/diff_new_pack.hLbh4a/_old 2018-02-03 15:36:30.522168703 +0100 +++ /var/tmp/diff_new_pack.hLbh4a/_new 2018-02-03 15:36:30.526168516 +0100 @@ -18,7 +18,7 @@ %define libname liborcus-0_13-0 Name: liborcus -Version: 0.13.1 +Version: 0.13.2 Release: 0 Summary: Spreadsheet file processing library License: MPL-2.0 ++++++ liborcus-0.13.1.tar.xz -> liborcus-0.13.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/ChangeLog new/liborcus-0.13.2/ChangeLog --- old/liborcus-0.13.1/ChangeLog 2017-11-16 01:56:52.000000000 +0100 +++ new/liborcus-0.13.2/ChangeLog 2018-01-27 03:08:17.000000000 +0100 @@ -1,3 +1,88 @@ +2018-01-26 Kohei Yoshida <[email protected]> [dadc490ce903a9ccd9688f25af5e848b78bf8f23] + + Revert "fix automake warning" + + This reverts commit e4e1e3eb41755a4520a22b904a638da0770836f1. + +2018-01-26 Kohei Yoshida <[email protected]> [d26cfd097e33f2ab05182bc63a54599667d1fc34] + + Up the version to 0.13.2. + + +2018-01-25 Kohei Yoshida <[email protected]> [cc8bb3cc0318a639b300a49984fa98644655a14e] + + xls-xml: import cell borders. + + We'll just map these cell borders to xlsx's cell border styles. + + (cherry picked from commit 83f7fb42f5280f1732dfb135e3aa41adc29f29b2) + +2018-01-24 Kohei Yoshida <[email protected]> [bd048dcf365b0b16fe5d188915ea30f2040d8828] + + xlsx: pick up diagonal borders. + + (cherry picked from commit 6f4ff977fb912f389cb5f066c136f758e8431f78) + +2018-01-23 Kohei Yoshida <[email protected]> [e0b65787e3bb1b264002a183790265cdadde7312] + + xlsx: fix exception being thrown when diagonal element is encountered. + + (cherry picked from commit b5d3809c70ef7531e2891d8ac0b04873a4573480) + +2018-01-23 David Tardon <[email protected]> [679a6229d4838f0a162c5c9938d5bc1c1cfbaa9b] + + fix build failure in Rawhide + + (cherry picked from commit 658e77a9fc43853cb25a9511e01772dd1bef3c36) + +2018-01-23 David Tardon <[email protected]> [e4e1e3eb41755a4520a22b904a638da0770836f1] + + fix automake warning + + (cherry picked from commit 719ab1789710a32c034f85b826025c71808a5eb5) + +2018-01-13 Kohei Yoshida <[email protected]> [491ba8e21c639842fa82d93950062ef638e87103] + + xls-xml: pick up text alignment properties. + + (cherry picked from commit caece95470f4ba5cf4aaca513f493d6a94b4dfa7) + +2018-01-10 Kohei Yoshida <[email protected]> [804eec72736d51aae15d5a1a823f6f3332c1118e] + + xlsx: pick up justified and distributed alignment types as well. + + (cherry picked from commit a138b970085b2ff1f43888d39f1e891f46c7e2b1) + +2018-01-04 Kohei Yoshida <[email protected]> [19a2294a2d89adf0a83363452c7d4c6546ada118] + + xls-xml: alpha value must be 255 for being fully opaque. + + (cherry picked from commit 62e49b9297c4c3417524d960bd0cd3e4fa4f9885) + +2018-01-04 Kohei Yoshida <[email protected]> [68089a402044c7e5e127f9fbaeccda0af56d1808] + + xls-xml: pick up solid fill colors. + + (cherry picked from commit f3c8707042914b1c771dd643983d773f9fcf217b) + +2017-12-30 Kohei Yoshida <[email protected]> [1dac2d68e5993d1e3f64a6f047e761db4074f36f] + + Pick up row height properties. + + (cherry picked from commit 0b9323fc39e4f4cc0f7b063f55fd8443feedf21c) + +2017-12-30 Kohei Yoshida <[email protected]> [76438dea4b8315041a988aac0b0aabd45205675d] + + Pick up column width properties. + + (cherry picked from commit 057d65f7db30f58fca880aa2952d9536e5d2a5ac) + +2017-11-27 Caolán McNamara <[email protected]> [25f6ad315418ba5beab70e7fd53c7cde6b519998] + + Silence an assert. + + (cherry picked from commit 0a5014ae282f7a3bd2dae0cf6425d7b61d06b034) + 2017-11-15 Kohei Yoshida <[email protected]> [8d9fa37666f313871b90382b4a6c495f199d22d7] Update the changelog. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/configure new/liborcus-0.13.2/configure --- old/liborcus-0.13.1/configure 2017-11-16 01:51:42.000000000 +0100 +++ new/liborcus-0.13.2/configure 2018-01-27 03:07:29.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for liborcus 0.13.1. +# Generated by GNU Autoconf 2.69 for liborcus 0.13.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -587,8 +587,8 @@ # Identity of this package. PACKAGE_NAME='liborcus' PACKAGE_TARNAME='liborcus' -PACKAGE_VERSION='0.13.1' -PACKAGE_STRING='liborcus 0.13.1' +PACKAGE_VERSION='0.13.2' +PACKAGE_STRING='liborcus 0.13.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1420,7 +1420,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures liborcus 0.13.1 to adapt to many kinds of systems. +\`configure' configures liborcus 0.13.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1491,7 +1491,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of liborcus 0.13.1:";; + short | recursive ) echo "Configuration of liborcus 0.13.2:";; esac cat <<\_ACEOF @@ -1642,7 +1642,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -liborcus configure 0.13.1 +liborcus configure 0.13.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2291,7 +2291,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by liborcus $as_me 0.13.1, which was +It was created by liborcus $as_me 0.13.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3158,7 +3158,7 @@ # Define the identity of the package. PACKAGE='liborcus' - VERSION='0.13.1' + VERSION='0.13.2' cat >>confdefs.h <<_ACEOF @@ -17532,7 +17532,7 @@ ORCUS_API_VERSION=0.13 ORCUS_MAJOR_VERSION=0 ORCUS_MINOR_VERSION=13 -ORCUS_MICRO_VERSION=1 +ORCUS_MICRO_VERSION=2 @@ -21423,7 +21423,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by liborcus $as_me 0.13.1, which was +This file was extended by liborcus $as_me 0.13.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -21489,7 +21489,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -liborcus config.status 0.13.1 +liborcus config.status 0.13.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/configure.ac new/liborcus-0.13.2/configure.ac --- old/liborcus-0.13.1/configure.ac 2017-11-16 01:38:45.000000000 +0100 +++ new/liborcus-0.13.2/configure.ac 2018-01-27 03:07:20.000000000 +0100 @@ -8,7 +8,7 @@ # =================== m4_define([orcus_major_version], [0]) m4_define([orcus_minor_version], [13]) -m4_define([orcus_micro_version], [1]) +m4_define([orcus_micro_version], [2]) m4_define([orcus_version], [orcus_major_version.orcus_minor_version.orcus_micro_version]) # =============== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/liborcus/measurement.cpp new/liborcus-0.13.2/src/liborcus/measurement.cpp --- old/liborcus-0.13.1/src/liborcus/measurement.cpp 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/liborcus/measurement.cpp 2017-12-30 22:16:45.000000000 +0100 @@ -148,6 +148,9 @@ case length_unit_t::inch: // twips to inches : 1 twip = 1/1440 inches return value / 1440.0; + case length_unit_t::point: + // 1 twip = 1/1440 inches = 72/1440 points = 1/20 points + return value / 20.0; default: ; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/liborcus/xls_xml_context.cpp new/liborcus-0.13.2/src/liborcus/xls_xml_context.cpp --- old/liborcus-0.13.1/src/liborcus/xls_xml_context.cpp 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/liborcus/xls_xml_context.cpp 2018-01-26 03:52:07.000000000 +0100 @@ -12,6 +12,8 @@ #include "orcus/spreadsheet/import_interface_view.hpp" #include "orcus/measurement.hpp" +#include <mdds/sorted_string_map.hpp> + #include <iostream> using namespace std; @@ -399,37 +401,97 @@ pstring get_name() const { return m_name; } }; -class row_attr_parser : public unary_function<xml_token_attr_t, void> +namespace border_dir { + +typedef mdds::sorted_string_map<spreadsheet::border_direction_t> map_type; + +// Keys must be sorted. +const std::vector<map_type::entry> entries = { - long m_row_index; -public: - row_attr_parser() : m_row_index(-1) {} + { ORCUS_ASCII("Bottom"), spreadsheet::border_direction_t::bottom }, + { ORCUS_ASCII("DiagonalLeft"), spreadsheet::border_direction_t::diagonal_tl_br }, + { ORCUS_ASCII("DiagonalRight"), spreadsheet::border_direction_t::diagonal_bl_tr }, + { ORCUS_ASCII("Left"), spreadsheet::border_direction_t::left }, + { ORCUS_ASCII("Right"), spreadsheet::border_direction_t::right }, + { ORCUS_ASCII("Top"), spreadsheet::border_direction_t::top }, +}; - void operator() (const xml_token_attr_t& attr) - { - if (attr.value.empty()) - return; +const map_type& get() +{ + static map_type mt(entries.data(), entries.size(), spreadsheet::border_direction_t::unknown); + return mt; +} - if (attr.ns == NS_xls_xml_ss) - { - switch (attr.name) - { - case XML_Index: - { - const char* p = attr.value.get(); - const char* p_end = p + attr.value.size(); - m_row_index = to_long(p, p_end); - } - break; - default: - ; - } - } - } +} + +namespace border_style { + +typedef mdds::sorted_string_map<spreadsheet::border_style_t> map_type; - long get_row_index() const { return m_row_index; } +// Keys must be sorted. +const std::vector<map_type::entry> entries = +{ + { ORCUS_ASCII("Continuous"), spreadsheet::border_style_t::solid }, + { ORCUS_ASCII("Dash"), spreadsheet::border_style_t::dashed }, + { ORCUS_ASCII("DashDot"), spreadsheet::border_style_t::dash_dot }, + { ORCUS_ASCII("DashDotDot"), spreadsheet::border_style_t::dash_dot_dot }, + { ORCUS_ASCII("Dot"), spreadsheet::border_style_t::dotted }, + { ORCUS_ASCII("Double"), spreadsheet::border_style_t::double_border }, + { ORCUS_ASCII("SlantDashDot"), spreadsheet::border_style_t::slant_dash_dot }, }; +const map_type& get() +{ + static map_type mt(entries.data(), entries.size(), spreadsheet::border_style_t::unknown); + return mt; +} + +} + +namespace hor_align { + +typedef mdds::sorted_string_map<spreadsheet::hor_alignment_t> map_type; + +// Keys must be sorted. +const std::vector<map_type::entry> entries = +{ + { ORCUS_ASCII("Center"), spreadsheet::hor_alignment_t::center }, + { ORCUS_ASCII("Distributed"), spreadsheet::hor_alignment_t::distributed }, + { ORCUS_ASCII("Justify"), spreadsheet::hor_alignment_t::justified }, + { ORCUS_ASCII("Left"), spreadsheet::hor_alignment_t::left }, + { ORCUS_ASCII("Right"), spreadsheet::hor_alignment_t::right }, +}; + +const map_type& get() +{ + static map_type mt(entries.data(), entries.size(), spreadsheet::hor_alignment_t::unknown); + return mt; +} + +} + +namespace ver_align { + +typedef mdds::sorted_string_map<spreadsheet::ver_alignment_t> map_type; + +// Keys must be sorted. +const std::vector<map_type::entry> entries = +{ + { ORCUS_ASCII("Bottom"), spreadsheet::ver_alignment_t::bottom }, + { ORCUS_ASCII("Center"), spreadsheet::ver_alignment_t::middle }, + { ORCUS_ASCII("Distributed"), spreadsheet::ver_alignment_t::distributed }, + { ORCUS_ASCII("Justify"), spreadsheet::ver_alignment_t::justified }, + { ORCUS_ASCII("Top"), spreadsheet::ver_alignment_t::top }, +}; + +const map_type& get() +{ + static map_type mt(entries.data(), entries.size(), spreadsheet::ver_alignment_t::unknown); + return mt; +} + +} + } xls_xml_context::named_exp::named_exp(const pstring& _name, const pstring& _expression, spreadsheet::sheet_t _scope) : @@ -501,6 +563,7 @@ mp_sheet_props(nullptr), m_cur_sheet(-1), m_cur_row(0), m_cur_col(0), + m_cur_prop_col(0), m_cur_merge_down(0), m_cur_merge_across(0), m_cc_data(session_cxt, tokens, factory) { @@ -583,20 +646,14 @@ xml_element_expected(parent, NS_xls_xml_ss, XML_Worksheet); break; case XML_Row: - { - xml_element_expected(parent, NS_xls_xml_ss, XML_Table); - m_cur_col = 0; - long row_index = for_each(attrs.begin(), attrs.end(), row_attr_parser()).get_row_index(); - if (row_index > 0) - { - // 1-based row index. Convert it to a 0-based one. - m_cur_row = row_index - 1; - } + start_element_row(parent, attrs); break; - } case XML_Cell: start_element_cell(parent, attrs); break; + case XML_Column: + start_element_column(parent, attrs); + break; case XML_Names: { xml_elem_stack_t expected_parents; @@ -681,6 +738,12 @@ break; } + case XML_Borders: + start_element_borders(parent, attrs); + break; + case XML_Border: + start_element_border(parent, attrs); + break; case XML_Font: { xml_element_expected(parent, NS_xls_xml_ss, XML_Style); @@ -714,6 +777,69 @@ } break; } + case XML_Interior: + { + xml_element_expected(parent, NS_xls_xml_ss, XML_Style); + + for (const xml_token_attr_t& attr : attrs) + { + if (attr.ns != NS_xls_xml_ss) + continue; + + switch (attr.name) + { + case XML_Color: + { + m_current_style->fill.color = + spreadsheet::to_color_rgb(attr.value.data(), attr.value.size()); + break; + } + case XML_Pattern: + { + // TODO : support fill types other than 'solid'. + m_current_style->fill.solid = (attr.value == "Solid"); + break; + } + default: + ; + } + } + break; + } + case XML_Alignment: + { + xml_element_expected(parent, NS_xls_xml_ss, XML_Style); + + for (const xml_token_attr_t& attr : attrs) + { + if (attr.ns != NS_xls_xml_ss) + continue; + + switch (attr.name) + { + case XML_Horizontal: + { + m_current_style->text_alignment.hor = + hor_align::get().find(attr.value.data(), attr.value.size()); + break; + } + case XML_Vertical: + { + m_current_style->text_alignment.ver = + ver_align::get().find(attr.value.data(), attr.value.size()); + break; + } + case XML_Indent: + { + m_current_style->text_alignment.indent = to_long(attr.value); + break; + } + default: + ; + } + } + break; + } default: warn_unhandled(); } @@ -799,12 +925,21 @@ { switch (name) { + case XML_Borders: + end_element_borders(); + break; + case XML_Border: + end_element_border(); + break; case XML_Row: - ++m_cur_row; + end_element_row(); break; case XML_Cell: end_element_cell(); break; + case XML_Column: + end_element_column(); + break; case XML_Workbook: end_element_workbook(); break; @@ -922,6 +1057,95 @@ } } +void xls_xml_context::start_element_borders(const xml_token_pair_t& parent, const xml_attrs_t& attrs) +{ + xml_element_expected(parent, NS_xls_xml_ss, XML_Style); + m_current_style->borders.clear(); +} + +void xls_xml_context::start_element_border(const xml_token_pair_t& parent, const xml_attrs_t& attrs) +{ + xml_element_expected(parent, NS_xls_xml_ss, XML_Borders); + + spreadsheet::border_direction_t dir = spreadsheet::border_direction_t::unknown; + spreadsheet::border_style_t style = spreadsheet::border_style_t::unknown; + long weight = 0; + + for (const xml_token_attr_t& attr : attrs) + { + if (attr.ns != NS_xls_xml_ss) + continue; + + switch (attr.name) + { + case XML_Position: + { + dir = border_dir::get().find(attr.value.data(), attr.value.size()); + break; + } + case XML_LineStyle: + { + style = border_style::get().find(attr.value.data(), attr.value.size()); + break; + } + case XML_Weight: + { + weight = to_long(attr.value); + break; + } + default: + ; + } + } + + if (dir == spreadsheet::border_direction_t::unknown || style == spreadsheet::border_style_t::unknown) + return; + + m_current_style->borders.emplace_back(); + border_style_type& bs = m_current_style->borders.back(); + bs.dir = dir; + bs.style = style; + + switch (bs.style) + { + case spreadsheet::border_style_t::solid: + { + switch (weight) + { + case 0: + bs.style = spreadsheet::border_style_t::hair; + break; + case 1: + bs.style = spreadsheet::border_style_t::thin; + break; + case 2: + bs.style = spreadsheet::border_style_t::medium; + break; + case 3: + bs.style = spreadsheet::border_style_t::thick; + break; + default: + ; + } + break; + } + case spreadsheet::border_style_t::dashed: + if (weight > 1) + bs.style = spreadsheet::border_style_t::medium_dashed; + break; + case spreadsheet::border_style_t::dash_dot: + if (weight > 1) + bs.style = spreadsheet::border_style_t::medium_dash_dot; + break; + case spreadsheet::border_style_t::dash_dot_dot: + if (weight > 1) + bs.style = spreadsheet::border_style_t::medium_dash_dot_dot; + break; + default: + ; + } +} + void xls_xml_context::start_element_cell(const xml_token_pair_t& parent, const xml_attrs_t& attrs) { xml_element_expected(parent, NS_xls_xml_ss, XML_Row); @@ -981,6 +1205,99 @@ } } +void xls_xml_context::start_element_column(const xml_token_pair_t& parent, const xml_attrs_t& attrs) +{ + xml_element_expected(parent, NS_xls_xml_ss, XML_Table); + + if (!mp_sheet_props) + return; + + spreadsheet::col_t col_index = m_cur_prop_col; + spreadsheet::col_t span = 0; + double width = 0.0; + + std::for_each(attrs.begin(), attrs.end(), + [&](const xml_token_attr_t& attr) + { + if (attr.value.empty()) + return; + + if (attr.ns != NS_xls_xml_ss) + return; + + switch (attr.name) + { + case XML_Index: + // Convert from 1-based to 0-based. + col_index = to_long(attr.value) - 1; + break; + case XML_Width: + width = to_double(attr.value); + break; + case XML_Span: + span = to_long(attr.value); + break; + default: + ; + } + } + ); + + for (; span >= 0; --span, ++col_index) + // Column widths are stored as points. + mp_sheet_props->set_column_width(col_index, width, orcus::length_unit_t::point); + + m_cur_prop_col = col_index; +} + +void xls_xml_context::start_element_row(const xml_token_pair_t& parent, const xml_attrs_t& attrs) +{ + xml_element_expected(parent, NS_xls_xml_ss, XML_Table); + m_cur_col = 0; + spreadsheet::row_t row_index = -1; + bool has_height = false; + double height = 0.0; + + for (const xml_token_attr_t& attr : attrs) + { + if (attr.value.empty()) + return; + + if (attr.ns == NS_xls_xml_ss) + { + switch (attr.name) + { + case XML_Index: + row_index = to_long(attr.value); + break; + case XML_Height: + has_height = true; + height = to_double(attr.value); + break; + default: + ; + } + } + } + + if (row_index > 0) + { + // 1-based row index. Convert it to a 0-based one. + m_cur_row = row_index - 1; + } + + if (mp_sheet_props && has_height) + mp_sheet_props->set_row_height(m_cur_row, height, length_unit_t::point); +} + +void xls_xml_context::end_element_borders() +{ +} + +void xls_xml_context::end_element_border() +{ +} + void xls_xml_context::end_element_cell() { if (mp_sheet_props && (m_cur_merge_across > 0 || m_cur_merge_down > 0)) @@ -1009,6 +1326,15 @@ m_cur_col += m_cur_merge_across; } +void xls_xml_context::end_element_column() +{ +} + +void xls_xml_context::end_element_row() +{ + ++m_cur_row; +} + void xls_xml_context::end_element_workbook() { spreadsheet::iface::import_named_expression* ne_global = mp_factory->get_named_expression(); @@ -1172,7 +1498,7 @@ { styles->set_font_bold(style->font.bold); styles->set_font_italic(style->font.italic); - styles->set_font_color(0, + styles->set_font_color(255, style->font.color.red, style->font.color.green, style->font.color.blue); @@ -1181,6 +1507,40 @@ styles->set_xf_font(font_id); + if (style->fill.solid) + { + // TODO : add support for fill types other than 'solid'. + styles->set_fill_pattern_type(ORCUS_ASCII("solid")); + styles->set_fill_fg_color(255, + style->fill.color.red, + style->fill.color.green, + style->fill.color.blue); + + size_t fill_id = styles->commit_fill(); + styles->set_xf_fill(fill_id); + } + + if (!style->borders.empty()) + { + styles->set_border_count(style->borders.size()); + + for (const border_style_type& b : style->borders) + styles->set_border_style(b.dir, b.style); + + size_t border_id = styles->commit_border(); + styles->set_xf_border(border_id); + } + + bool apply_alignment = + style->text_alignment.hor != spreadsheet::hor_alignment_t::unknown || + style->text_alignment.ver != spreadsheet::ver_alignment_t::unknown; + + styles->set_xf_apply_alignment(apply_alignment); + styles->set_xf_horizontal_alignment(style->text_alignment.hor); + styles->set_xf_vertical_alignment(style->text_alignment.ver); + + // TODO : handle text indent level. + size_t xf_id = styles->commit_cell_xf(); m_style_map.insert({style->id, xf_id}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/liborcus/xls_xml_context.hpp new/liborcus-0.13.2/src/liborcus/xls_xml_context.hpp --- old/liborcus-0.13.1/src/liborcus/xls_xml_context.hpp 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/liborcus/xls_xml_context.hpp 2018-01-26 03:52:07.000000000 +0100 @@ -103,6 +103,12 @@ class xls_xml_context : public xml_context_base { + struct border_style_type + { + spreadsheet::border_direction_t dir = spreadsheet::border_direction_t::unknown; + spreadsheet::border_style_t style = spreadsheet::border_style_t::unknown; + }; + struct font_style_type { bool bold = false; @@ -111,12 +117,32 @@ spreadsheet::color_rgb_t color; }; + /** + * TODO: we only support solid fill for now. More fill types to be added + * later. + */ + struct fill_style_type + { + bool solid = false; + spreadsheet::color_rgb_t color; + }; + + struct text_alignment_type + { + spreadsheet::hor_alignment_t hor = spreadsheet::hor_alignment_t::unknown; + spreadsheet::ver_alignment_t ver = spreadsheet::ver_alignment_t::unknown; + int8_t indent = 0; + }; + struct style_type { pstring id; pstring name; font_style_type font; + fill_style_type fill; + text_alignment_type text_alignment; + std::vector<border_style_type> borders; }; struct named_exp @@ -173,8 +199,17 @@ virtual void characters(const pstring& str, bool transient); private: + void start_element_borders(const xml_token_pair_t& parent, const xml_attrs_t& attrs); + void start_element_border(const xml_token_pair_t& parent, const xml_attrs_t& attrs); void start_element_cell(const xml_token_pair_t& parent, const xml_attrs_t& attrs); + void start_element_column(const xml_token_pair_t& parent, const xml_attrs_t& attrs); + void start_element_row(const xml_token_pair_t& parent, const xml_attrs_t& attrs); + + void end_element_borders(); + void end_element_border(); void end_element_cell(); + void end_element_column(); + void end_element_row(); void end_element_workbook(); void end_element_styles(); @@ -195,6 +230,7 @@ spreadsheet::sheet_t m_cur_sheet; spreadsheet::row_t m_cur_row; spreadsheet::col_t m_cur_col; + spreadsheet::col_t m_cur_prop_col; /// current column position for column properties. spreadsheet::row_t m_cur_merge_down; spreadsheet::col_t m_cur_merge_across; pstring m_cur_cell_formula; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/liborcus/xlsx_context.cpp new/liborcus-0.13.2/src/liborcus/xlsx_context.cpp --- old/liborcus-0.13.1/src/liborcus/xlsx_context.cpp 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/liborcus/xlsx_context.cpp 2018-01-25 02:48:48.000000000 +0100 @@ -471,6 +471,10 @@ m_hor_align = spreadsheet::hor_alignment_t::right; else if (attr.value == "left") m_hor_align = spreadsheet::hor_alignment_t::left; + else if (attr.value == "justify") + m_hor_align = spreadsheet::hor_alignment_t::justified; + else if (attr.value == "distributed") + m_hor_align = spreadsheet::hor_alignment_t::distributed; } break; case XML_vertical: @@ -481,6 +485,10 @@ m_ver_align = spreadsheet::ver_alignment_t::middle; else if (attr.value == "bottom") m_ver_align = spreadsheet::ver_alignment_t::bottom; + else if (attr.value == "justify") + m_ver_align = spreadsheet::ver_alignment_t::justified; + else if (attr.value == "distributed") + m_ver_align = spreadsheet::ver_alignment_t::distributed; } break; default: @@ -504,6 +512,7 @@ xlsx_styles_context::xlsx_styles_context(session_context& session_cxt, const tokens& tokens, spreadsheet::iface::import_styles* styles) : xml_context_base(session_cxt, tokens), mp_styles(styles), + m_diagonal_up(false), m_diagonal_down(false), m_cur_border_dir(spreadsheet::border_direction_t::unknown), m_cell_style_xf(false) {} @@ -591,6 +600,7 @@ allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_bottom)); allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_left)); allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_right)); + allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_diagonal)); allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_mruColors)); xml_element_expected(parent, allowed); @@ -679,12 +689,9 @@ break; case XML_border: { - xml_elem_stack_t expected_elements; - expected_elements.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_borders)); - expected_elements.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_dxf)); - xml_element_expected(parent, expected_elements); + start_element_border(parent, attrs); + break; } - break; case XML_top: { xml_element_expected(parent, NS_ooxml_xlsx, XML_border); @@ -719,12 +726,9 @@ break; case XML_diagonal: { - xml_element_expected(parent, NS_ooxml_xlsx, XML_border); - m_cur_border_dir = spreadsheet::border_direction_t::diagonal; - border_attr_parser func(spreadsheet::border_direction_t::diagonal, *mp_styles); - for_each(attrs.begin(), attrs.end(), func); + start_element_diagonal(parent, attrs); + break; } - break; case XML_cellStyleXfs: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); @@ -871,6 +875,68 @@ // not used in the styles.xml part. } +void xlsx_styles_context::start_element_border(const xml_token_pair_t& parent, const xml_attrs_t& attrs) +{ + xml_elem_stack_t expected_elements; + expected_elements.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_borders)); + expected_elements.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_dxf)); + xml_element_expected(parent, expected_elements); + + bool diagonal_up = false; + bool diagonal_down = false; + + std::for_each(attrs.begin(), attrs.end(), + [&diagonal_up,&diagonal_down](const xml_token_attr_t& attr) + { + if (attr.ns != NS_ooxml_xlsx) + return; + + switch (attr.name) + { + case XML_diagonalDown: + // top-left to bottom-right. + diagonal_down = to_long(attr.value) != 0; + break; + case XML_diagonalUp: + // bottom-left to top-right. + diagonal_up = to_long(attr.value) != 0; + break; + default: + ; + } + } + ); + + m_diagonal_up = diagonal_up; + m_diagonal_down = diagonal_down; +} + +void xlsx_styles_context::start_element_diagonal(const xml_token_pair_t& parent, const xml_attrs_t& attrs) +{ + xml_element_expected(parent, NS_ooxml_xlsx, XML_border); + + m_cur_border_dir = spreadsheet::border_direction_t::unknown; + + if (m_diagonal_up) + { + m_cur_border_dir = m_diagonal_down ? + spreadsheet::border_direction_t::diagonal : + spreadsheet::border_direction_t::diagonal_bl_tr; + } + else + { + m_cur_border_dir = m_diagonal_down ? + spreadsheet::border_direction_t::diagonal_tl_br : + spreadsheet::border_direction_t::unknown; + } + + if (m_cur_border_dir == spreadsheet::border_direction_t::unknown) + return; + + border_attr_parser func(m_cur_border_dir, *mp_styles); + for_each(attrs.begin(), attrs.end(), func); +} + void xlsx_styles_context::start_border_color(const xml_attrs_t& attrs) { color_attr_parser func; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/liborcus/xlsx_context.hpp new/liborcus-0.13.2/src/liborcus/xlsx_context.hpp --- old/liborcus-0.13.1/src/liborcus/xlsx_context.hpp 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/liborcus/xlsx_context.hpp 2018-01-25 02:48:47.000000000 +0100 @@ -65,12 +65,16 @@ virtual void characters(const pstring& str, bool transient); private: + void start_element_border(const xml_token_pair_t& parent, const xml_attrs_t& attrs); + void start_element_diagonal(const xml_token_pair_t& parent, const xml_attrs_t& attrs); void start_border_color(const xml_attrs_t& attrs); void start_font_color(const xml_attrs_t& attrs); private: spreadsheet::iface::import_styles* mp_styles; string_pool m_pool; + bool m_diagonal_up; + bool m_diagonal_down; spreadsheet::border_direction_t m_cur_border_dir; bool m_cell_style_xf; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/parser/sax_parser_base.cpp new/liborcus-0.13.2/src/parser/sax_parser_base.cpp --- old/liborcus-0.13.1/src/parser/sax_parser_base.cpp 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/parser/sax_parser_base.cpp 2017-11-28 01:34:32.000000000 +0100 @@ -296,7 +296,7 @@ str = pstring(buf.get(), buf.size()); // Skip the closing quote. - assert(cur_char() == '"'); + assert(!has_char() || cur_char() == '"'); next(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/python/Makefile.am new/liborcus-0.13.2/src/python/Makefile.am --- old/liborcus-0.13.1/src/python/Makefile.am 2017-11-16 01:38:32.000000000 +0100 +++ new/liborcus-0.13.2/src/python/Makefile.am 2018-01-23 23:42:28.000000000 +0100 @@ -29,7 +29,8 @@ sheet_rows.cpp _orcus_la_LIBADD += \ - ../spreadsheet/liborcus-spreadsheet-model-@[email protected] + ../spreadsheet/liborcus-spreadsheet-model-@[email protected] \ + $(LIBIXION_LIBS) endif # BUILD_SPREADSHEET_MODEL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liborcus-0.13.1/src/python/Makefile.in new/liborcus-0.13.2/src/python/Makefile.in --- old/liborcus-0.13.1/src/python/Makefile.in 2017-11-16 01:51:41.000000000 +0100 +++ new/liborcus-0.13.2/src/python/Makefile.in 2018-01-27 03:07:31.000000000 +0100 @@ -98,7 +98,8 @@ @BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ sheet_rows.cpp @BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@am__append_2 = \ -@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ ../spreadsheet/liborcus-spreadsheet-model-@[email protected] +@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ ../spreadsheet/liborcus-spreadsheet-model-@[email protected] \ +@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ $(LIBIXION_LIBS) @BUILD_PYTHON_TRUE@@WITH_PYTHON_XLSX_TRUE@am__append_3 = ../../test/python/xlsx.py subdir = src/python @@ -145,9 +146,11 @@ am__installdirs = "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(orcusdir)" LTLIBRARIES = $(pyexec_LTLIBRARIES) am__DEPENDENCIES_1 = +@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@am__DEPENDENCIES_2 = ../spreadsheet/liborcus-spreadsheet-model-@[email protected] \ +@BUILD_PYTHON_TRUE@@BUILD_SPREADSHEET_MODEL_TRUE@ $(am__DEPENDENCIES_1) @BUILD_PYTHON_TRUE@_orcus_la_DEPENDENCIES = ../liborcus/liborcus-@[email protected] \ @BUILD_PYTHON_TRUE@ ../parser/liborcus-parser-@[email protected] \ -@BUILD_PYTHON_TRUE@ $(am__DEPENDENCIES_1) $(am__append_2) +@BUILD_PYTHON_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am___orcus_la_SOURCES_DIST = python.cpp root.hpp root.cpp xlsx.hpp \ xlsx.cpp document.hpp document.cpp sheet.hpp sheet.cpp \ sheet_rows.hpp sheet_rows.cpp
