void xls_xml_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_attrs_t& attrs) { xml_token_pair_t parent = push_stack(ns, name); if (ns == NS_xls_xml_ss) { switch (name) { case XML_Workbook: // Do nothing. break; case XML_Worksheet: { xml_element_expected(parent, NS_xls_xml_ss, XML_Workbook); pstring sheet_name = for_each(attrs.begin(), attrs.end(), sheet_attr_parser()).get_name(); mp_cur_sheet = mp_factory->append_sheet(sheet_name.get(), sheet_name.size()); m_cur_row = 0; m_cur_col = 0; } break; case XML_Table: 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; } } break; case XML_Cell: { xml_element_expected(parent, NS_xls_xml_ss, XML_Row); long col_index = for_each(attrs.begin(), attrs.end(), cell_attr_parser()).get_col_index(); if (col_index > 0) { // 1-based column index. Convert it to a 0-based one. m_cur_col = col_index - 1; } } break; case XML_Data: xml_element_expected(parent, NS_xls_xml_ss, XML_Cell); m_cur_cell_type = for_each(attrs.begin(), attrs.end(), data_attr_parser()).get_cell_type(); m_cur_cell_string.clear(); break; default: warn_unhandled(); } } else warn_unhandled(); }
void text_para_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_attrs_t& attrs) { xml_token_pair_t parent = push_stack(ns, name); if (ns == NS_odf_text) { switch (name) { case XML_p: // paragraph xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); break; case XML_span: { // text span. xml_element_expected(parent, NS_odf_text, XML_p); flush_segment(); pstring style_name = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_odf_text, XML_style_name)).get_value(); m_span_stack.push_back(style_name); } break; case XML_s: // control character. ignored for now. break; default: warn_unhandled(); } } else warn_unhandled(); }
void xlsx_workbook_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_attrs_t& attrs) { xml_token_pair_t parent = push_stack(ns, name); switch (name) { case XML_workbook: { xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); print_attrs(get_tokens(), attrs); } break; case XML_sheets: xml_element_expected(parent, NS_ooxml_xlsx, XML_workbook); break; case XML_sheet: { xml_element_expected(parent, NS_ooxml_xlsx, XML_sheets); workbook_sheet_attr_parser func(&get_session_context()); func = for_each(attrs.begin(), attrs.end(), func); m_sheets.push_back(new xlsx_rel_sheet_info(func.get_sheet())); const xlsx_rel_sheet_info& info = m_sheets.back(); m_sheet_info.insert( opc_rel_extras_t::value_type(func.get_rid(), &info)); } break; default: warn_unhandled(); } }
void xlsx_styles_context::start_font_color(const xml_attrs_t& attrs) { color_attr_parser func; func = for_each(attrs.begin(), attrs.end(), func); spreadsheet::color_elem_t alpha; spreadsheet::color_elem_t red; spreadsheet::color_elem_t green; spreadsheet::color_elem_t blue; if (to_rgb(func.get_rgb(), alpha, red, green, blue)) mp_styles->set_font_color(alpha, red, green, blue); }
void xlsx_styles_context::start_border_color(const xml_attrs_t& attrs) { pstring ps = for_each( attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_rgb)).get_value(); spreadsheet::color_elem_t alpha; spreadsheet::color_elem_t red; spreadsheet::color_elem_t green; spreadsheet::color_elem_t blue; if (to_rgb(ps, alpha, red, green, blue)) mp_styles->set_border_color(m_cur_border_dir, alpha, red, green, blue); }
void print_attrs(const tokens& tokens, const xml_attrs_t& attrs) { for_each(attrs.begin(), attrs.end(), attr_printer(tokens)); }
void xlsx_styles_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_attrs_t& attrs) { xml_token_pair_t parent = push_stack(ns, name); switch (name) { case XML_styleSheet: { // root element xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); if (get_config().debug) print_attrs(get_tokens(), attrs); } break; case XML_fonts: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t font_count = to_long(ps); mp_styles->set_font_count(font_count); } break; case XML_font: xml_element_expected(parent, NS_ooxml_xlsx, XML_fonts); break; case XML_b: xml_element_expected(parent, NS_ooxml_xlsx, XML_font); mp_styles->set_font_bold(true); break; case XML_i: xml_element_expected(parent, NS_ooxml_xlsx, XML_font); mp_styles->set_font_italic(true); break; case XML_u: { xml_element_expected(parent, NS_ooxml_xlsx, XML_font); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value(); if (ps == "double") mp_styles->set_font_underline(spreadsheet::underline_double); else if (ps == "single") mp_styles->set_font_underline(spreadsheet::underline_single); else if (ps == "singleAccounting") mp_styles->set_font_underline(spreadsheet::underline_single_accounting); else if (ps == "doubleAccounting") mp_styles->set_font_underline(spreadsheet::underline_double_accounting); } break; case XML_sz: { xml_element_expected(parent, NS_ooxml_xlsx, XML_font); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value(); double font_size = to_double(ps); mp_styles->set_font_size(font_size); } break; case XML_color: { // The color element can occur under various parent elements. xml_elem_stack_t allowed; allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_font)); allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_top)); 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_mruColors)); xml_element_expected(parent, allowed); if (parent.first == NS_ooxml_xlsx) { switch (parent.second) { case XML_top: case XML_bottom: case XML_left: case XML_right: // This color is for a border. start_border_color(attrs); break; case XML_font: start_font_color(attrs); default: ; } } } break; case XML_name: { xml_element_expected(parent, NS_ooxml_xlsx, XML_font); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value(); mp_styles->set_font_name(ps.get(), ps.size()); } break; case XML_family: xml_element_expected(parent, NS_ooxml_xlsx, XML_font); break; case XML_scheme: xml_element_expected(parent, NS_ooxml_xlsx, XML_font); break; case XML_fills: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t fill_count = to_long(ps); mp_styles->set_fill_count(fill_count); } break; case XML_fill: xml_element_expected(parent, NS_ooxml_xlsx, XML_fills); break; case XML_patternFill: { xml_element_expected(parent, NS_ooxml_xlsx, XML_fill); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_patternType)).get_value(); mp_styles->set_fill_pattern_type(ps.get(), ps.size()); } break; case XML_fgColor: { xml_element_expected(parent, NS_ooxml_xlsx, XML_patternFill); for_each(attrs.begin(), attrs.end(), fill_color_attr_parser(*mp_styles, get_tokens(), true)); } break; case XML_bgColor: { xml_element_expected(parent, NS_ooxml_xlsx, XML_patternFill); for_each(attrs.begin(), attrs.end(), fill_color_attr_parser(*mp_styles, get_tokens(), false)); } break; case XML_borders: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring ps = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t border_count = to_long(ps); mp_styles->set_border_count(border_count); } break; case XML_border: xml_element_expected(parent, NS_ooxml_xlsx, XML_borders); break; case XML_top: { xml_element_expected(parent, NS_ooxml_xlsx, XML_border); m_cur_border_dir = spreadsheet::border_top; border_attr_parser func(spreadsheet::border_top, *mp_styles); for_each(attrs.begin(), attrs.end(), func); } break; case XML_bottom: { xml_element_expected(parent, NS_ooxml_xlsx, XML_border); m_cur_border_dir = spreadsheet::border_bottom; border_attr_parser func(spreadsheet::border_bottom, *mp_styles); for_each(attrs.begin(), attrs.end(), func); } break; case XML_left: { xml_element_expected(parent, NS_ooxml_xlsx, XML_border); m_cur_border_dir = spreadsheet::border_left; border_attr_parser func(spreadsheet::border_left, *mp_styles); for_each(attrs.begin(), attrs.end(), func); } break; case XML_right: { xml_element_expected(parent, NS_ooxml_xlsx, XML_border); m_cur_border_dir = spreadsheet::border_right; border_attr_parser func(spreadsheet::border_right, *mp_styles); for_each(attrs.begin(), attrs.end(), func); } break; case XML_diagonal: { xml_element_expected(parent, NS_ooxml_xlsx, XML_border); m_cur_border_dir = spreadsheet::border_diagonal; border_attr_parser func(spreadsheet::border_diagonal, *mp_styles); for_each(attrs.begin(), attrs.end(), func); } break; case XML_cellStyleXfs: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring ps = for_each( attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t n = strtoul(ps.get(), NULL, 10); mp_styles->set_cell_style_xf_count(n); m_cell_style_xf = true; } break; case XML_cellXfs: { // Collection of un-named cell formats used in the document. xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring ps = for_each( attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t n = strtoul(ps.get(), NULL, 10); mp_styles->set_cell_xf_count(n); m_cell_style_xf = false; } break; case XML_cellStyles: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring ps = for_each( attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t n = strtoul(ps.get(), NULL, 10); mp_styles->set_cell_style_count(n); } break; case XML_cellStyle: { // named cell style, some of which are built-in such as 'Normal'. xml_element_expected(parent, NS_ooxml_xlsx, XML_cellStyles); for_each(attrs.begin(), attrs.end(), cell_style_attr_parser(*mp_styles)); } break; case XML_xf: { // Actual cell format attributes (for some reason) abbreviated to // 'xf'. Used both by cells and cell styles. xml_elem_stack_t allowed; allowed.push_back(xml_elem_stack_t::value_type(NS_ooxml_xlsx, XML_cellXfs)); allowed.push_back(xml_elem_stack_t::value_type(NS_ooxml_xlsx, XML_cellStyleXfs)); xml_element_expected(parent, allowed); for_each(attrs.begin(), attrs.end(), xf_attr_parser(*mp_styles)); } break; case XML_protection: { xml_element_expected(parent, NS_ooxml_xlsx, XML_xf); for_each(attrs.begin(), attrs.end(), cell_protection_attr_parser(*mp_styles)); } break; case XML_alignment: { xml_element_expected(parent, NS_ooxml_xlsx, XML_xf); cell_alignment_attr_parser func; func = for_each(attrs.begin(), attrs.end(), func); mp_styles->set_xf_horizontal_alignment(func.get_hor_align()); mp_styles->set_xf_vertical_alignment(func.get_ver_align()); } break; case XML_numFmts: { xml_element_expected(parent, NS_ooxml_xlsx, XML_styleSheet); pstring val = for_each( attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_count)).get_value(); size_t n = to_long(val); mp_styles->set_number_format_count(n); } break; case XML_numFmt: { xml_element_expected(parent, NS_ooxml_xlsx, XML_numFmts); } break; default: warn_unhandled(); } }
void xlsx_shared_strings_context::start_element(xmlns_id_t ns, xml_token_t name, const xml_attrs_t& attrs) { xml_token_pair_t parent = push_stack(ns, name); switch (name) { case XML_sst: { // root element for the shared string part. xml_element_expected(parent, XMLNS_UNKNOWN_ID, XML_UNKNOWN_TOKEN); if (get_config().debug) print_attrs(get_tokens(), attrs); shared_strings_root_attr_parser func; func = for_each(attrs.begin(), attrs.end(), func); if (get_config().debug) cout << "count: " << func.get_count() << " unique count: " << func.get_unique_count() << endl; } break; case XML_si: // single shared string entry. m_in_segments = false; xml_element_expected(parent, NS_ooxml_xlsx, XML_sst); break; case XML_r: // rich text run m_in_segments = true; xml_element_expected(parent, NS_ooxml_xlsx, XML_si); break; case XML_rPr: // rich text run property xml_element_expected(parent, NS_ooxml_xlsx, XML_r); break; case XML_b: // bold xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); break; case XML_i: // italic xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); break; case XML_sz: { // font size xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); pstring s = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value(); double point = to_double(s); mp_strings->set_segment_font_size(point); } break; case XML_color: { // font color xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); color_attr_parser func; func = for_each(attrs.begin(), attrs.end(), func); spreadsheet::color_elem_t alpha; spreadsheet::color_elem_t red; spreadsheet::color_elem_t green; spreadsheet::color_elem_t blue; if (to_rgb(func.get_rgb(), alpha, red, green, blue)) mp_strings->set_segment_font_color(alpha, red, green, blue); } break; case XML_rFont: { // font xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); pstring font = for_each(attrs.begin(), attrs.end(), single_attr_getter(m_pool, NS_ooxml_xlsx, XML_val)).get_value(); mp_strings->set_segment_font_name(font.get(), font.size()); } break; case XML_family: // font family xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); break; case XML_scheme: // font scheme xml_element_expected(parent, NS_ooxml_xlsx, XML_rPr); break; case XML_t: { // actual text stored as its content. xml_elem_stack_t allowed; allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_si)); allowed.push_back(xml_token_pair_t(NS_ooxml_xlsx, XML_r)); xml_element_expected(parent, allowed); } break; default: warn_unhandled(); } }
void gnumeric_cell_context::start_cell(const xml_attrs_t& attrs) { mp_cell_data.reset(new gnumeric_cell_data); cell_attr_parser parser = for_each(attrs.begin(), attrs.end(), cell_attr_parser()); *mp_cell_data = parser.get_cell_data(); }