From 2e22646c34e7ba242ae97c25c08f7cdf05e7d1a3 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Sun, 12 Nov 2023 21:15:40 +0500 Subject: [PATCH 01/88] Convert table templates --- .../Reader/Converter/pptx_table_context.cpp | 37 +++- OdfFile/Reader/Converter/pptx_table_context.h | 188 +++++++++++++++++- OdfFile/Reader/Format/table.cpp | 11 +- OdfFile/Reader/Format/table.h | 2 + OdfFile/Reader/Format/table_pptx.cpp | 77 ++++++- 5 files changed, 301 insertions(+), 14 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_table_context.cpp b/OdfFile/Reader/Converter/pptx_table_context.cpp index 67202bf10e..c835d04511 100644 --- a/OdfFile/Reader/Converter/pptx_table_context.cpp +++ b/OdfFile/Reader/Converter/pptx_table_context.cpp @@ -53,7 +53,10 @@ pptx_table_state::pptx_table_state(pptx_conversion_context & Context, const std::wstring & StyleName) : context_(Context), table_style_(StyleName), current_table_column_(-1), - columns_spanned_num_(0) + columns_spanned_num_(0), + rows_(0), + current_row_(0), + total_columns_(0) { } @@ -75,13 +78,13 @@ std::wstring pptx_table_state::get_default_cell_style_row() return default_row_cell_style_name_; } - void pptx_table_state::start_row(const std::wstring & StyleName, const std::wstring & defaultCellStyleName) { current_table_column_ = -1; columns_spanned_style_ = L""; table_row_style_stack_.push_back(StyleName); default_row_cell_style_name_ = defaultCellStyleName; + current_row_++; } void pptx_table_state::end_row() @@ -225,6 +228,36 @@ unsigned int pptx_table_state::current_rows_spanned(unsigned int Column) const } } +void pptx_table_state::set_rows(int rows) +{ + rows_ = rows; +} + +int pptx_table_state::get_rows() const +{ + return rows_; +} + +int pptx_table_state::get_current_row() const +{ + return current_row_; +} + +void pptx_table_state::set_columns(int cols) +{ + total_columns_ = cols; +} + +int pptx_table_state::get_columns() const +{ + return total_columns_; +} + +void pptx_table_state::set_is_row_template(bool is_row_template) +{ + is_row_template_ = is_row_template; +} + struct pptx_border_edge { bool present = false; diff --git a/OdfFile/Reader/Converter/pptx_table_context.h b/OdfFile/Reader/Converter/pptx_table_context.h index 67e289dc2f..113b5728a7 100644 --- a/OdfFile/Reader/Converter/pptx_table_context.h +++ b/OdfFile/Reader/Converter/pptx_table_context.h @@ -74,9 +74,25 @@ public: void set_rows_spanned(unsigned int Column, unsigned int Val, unsigned int ColumnsSpanned, const std::wstring & Style); unsigned int current_rows_spanned(unsigned int Column) const; + + void set_rows(int rows); + int get_rows() const; + int get_current_row() const; + void set_columns(int cols); + int get_columns() const; + void set_is_row_template(bool is_row_template); std::wstring default_cell_style_name_; + + _CP_OPT(std::wstring) first_row_style_name_; + _CP_OPT(std::wstring) last_row_style_name_; + _CP_OPT(std::wstring) odd_rows_style_name_; + + _CP_OPT(std::wstring) first_column_style_name_; + _CP_OPT(std::wstring) last_column_style_name_; + _CP_OPT(std::wstring) odd_columns_style_name; + bool is_row_template_ = false; private: pptx_conversion_context & context_; @@ -94,7 +110,10 @@ private: std::vector columns_; std::vector columnsDefaultCellStyleName_; - + + unsigned int rows_; + unsigned int current_row_; + unsigned int total_columns_; }; class pptx_table_context : boost::noncopyable @@ -116,10 +135,10 @@ public: table_states_.pop_back(); } - std::wstring current_style() const - { - return table_states_.back().current_style(); - } + std::wstring current_style() const + { + return table_states_.back().current_style(); + } size_t in_table() const { @@ -205,14 +224,173 @@ public: { table_states_.back().default_cell_style_name_ = style_name; } + + void set_table_rows(int rows) + { + table_states_.back().set_rows(rows); + } + + int get_table_rows() const + { + return table_states_.back().get_rows(); + } + + void set_table_columns(int cols) + { + return table_states_.back().set_columns(cols); + } + + int get_table_columns() const + { + return table_states_.back().get_columns(); + } + + void set_first_row_style_name(std::wstring style_name) + { + table_states_.back().first_row_style_name_ = style_name; + } + + void set_last_row_style_name(std::wstring style_name) + { + table_states_.back().last_row_style_name_ = style_name; + } + + void set_odd_rows_style_name(std::wstring style_name) + { + table_states_.back().odd_rows_style_name_ = style_name; + } + + void set_first_column_style_name(std::wstring style_name) + { + table_states_.back().first_column_style_name_ = style_name; + } + + void set_last_column_style_name(std::wstring style_name) + { + table_states_.back().last_column_style_name_ = style_name; + } + + void set_odd_columns_style_name(std::wstring style_name) + { + table_states_.back().odd_columns_style_name = style_name; + } + + std::wstring get_first_row_style_name() + { + return table_states_.back().first_row_style_name_.get_value_or(L""); + } + + std::wstring get_last_row_style_name() + { + return table_states_.back().last_row_style_name_.get_value_or(L""); + } + + std::wstring get_odd_rows_style_name() + { + return table_states_.back().odd_rows_style_name_.get_value_or(L""); + } + + std::wstring get_first_column_style_name() + { + return table_states_.back().first_column_style_name_.get_value_or(L""); + } + + std::wstring get_last_column_style_name() + { + return table_states_.back().last_column_style_name_.get_value_or(L""); + } + + std::wstring get_odd_column_style_name() + { + return table_states_.back().odd_columns_style_name.get_value_or(L""); + } + std::wstring get_default_cell_style() { return table_states_.back().default_cell_style_name_; } + + void set_is_row_template(bool is_row_template) + { + table_states_.back().set_is_row_template(is_row_template); + } + + bool get_is_row_template() const + { + return table_states_.back().is_row_template_; + } + + void set_template_use_styles( + bool use_first_row_styles, + bool use_last_row_styles, + bool use_banding_rows_styles, + bool use_first_column_styles, + bool use_last_column_styles, + bool use_banding_columns_styles) + { + template_use_styles_.use_first_row_styles = use_first_row_styles; + template_use_styles_.use_last_row_styles = use_last_row_styles; + template_use_styles_.use_banding_rows_styles = use_banding_rows_styles; + + template_use_styles_.use_first_column_styles = use_first_column_styles; + template_use_styles_.use_last_column_styles = use_last_column_styles; + template_use_styles_.use_banding_columns_styles = use_banding_columns_styles; + } + + bool template_is_first_row() + { + return table_states_.back().get_current_row() == 0 && template_use_styles_.use_first_row_styles; + } + + bool template_is_last_row() + { + return + table_states_.back().get_current_row() == table_states_.back().get_rows() - 1 && + template_use_styles_.use_last_row_styles; + } + + bool template_is_odd_row() + { + return + table_states_.back().get_current_row() % 2 == 1 && + template_use_styles_.use_banding_rows_styles; + } + + bool template_is_first_column() + { + return table_states_.back().current_column() == 0 && + template_use_styles_.use_first_column_styles; + } + + bool template_is_last_column() + { + return + table_states_.back().current_column() == table_states_.back().get_columns() - 1 && + template_use_styles_.use_last_column_styles; + } + + bool template_is_odd_column() + { + return + table_states_.back().current_column() % 2 == 1 && + template_use_styles_.use_banding_columns_styles; + } + private: std::wstringstream output_stream_; pptx_conversion_context & context_; std::vector table_states_; + + struct template_use_styles + { + bool use_first_row_styles = false; + bool use_last_row_styles = false; + bool use_banding_rows_styles = false; + + bool use_first_column_styles = false; + bool use_last_column_styles = false; + bool use_banding_columns_styles = false; + } template_use_styles_; }; void oox_serialize_tcPr(std::wostream & strm, std::vector & style_inst, oox::pptx_conversion_context & Context); diff --git a/OdfFile/Reader/Format/table.cpp b/OdfFile/Reader/Format/table.cpp index b32801a212..7155a07744 100644 --- a/OdfFile/Reader/Format/table.cpp +++ b/OdfFile/Reader/Format/table.cpp @@ -61,10 +61,13 @@ void table_table_attlist::add_attributes( const xml::attributes_wc_ptr & Attribu CP_APPLY_ATTR(L"table:print", table_print_, true); CP_APPLY_ATTR(L"table:print-ranges", table_print_ranges_); - CP_APPLY_ATTR(L"table:use-first-row-styles", table_use_first_row_styles_,false); - CP_APPLY_ATTR(L"table:use-banding-rows-styles", table_use_banding_rows_styles_,false); - CP_APPLY_ATTR(L"table:use-banding-columns-styles", table_use_banding_columns_styles_,false); - CP_APPLY_ATTR(L"table:use-first-column-styles", table_use_first_column_styles_,false); + + CP_APPLY_ATTR(L"table:use-first-row-styles", table_use_first_row_styles_, false); + CP_APPLY_ATTR(L"table:use-last-row-styles", table_use_last_row_styles_, false); + CP_APPLY_ATTR(L"table:use-banding-rows-styles", table_use_banding_rows_styles_, false); + CP_APPLY_ATTR(L"table:use-last-column-styles", table_use_last_column_styles_, false); + CP_APPLY_ATTR(L"table:use-banding-columns-styles", table_use_banding_columns_styles_, false); + CP_APPLY_ATTR(L"table:use-first-column-styles", table_use_first_column_styles_, false); CP_APPLY_ATTR(L"table:is-sub-table", table_is_sub_table_); } diff --git a/OdfFile/Reader/Format/table.h b/OdfFile/Reader/Format/table.h index 5987f7da4d..783cb4707a 100644 --- a/OdfFile/Reader/Format/table.h +++ b/OdfFile/Reader/Format/table.h @@ -67,7 +67,9 @@ public: _CP_OPT(std::wstring) table_print_ranges_; bool table_use_first_row_styles_; // default false; + bool table_use_last_row_styles_; // default false; bool table_use_banding_rows_styles_; // defualt false; + bool table_use_last_column_styles_; // default false; bool table_use_first_column_styles_; // defualt false; bool table_use_banding_columns_styles_; // defualt false; diff --git a/OdfFile/Reader/Format/table_pptx.cpp b/OdfFile/Reader/Format/table_pptx.cpp index b172bbac96..9ee772b6d3 100644 --- a/OdfFile/Reader/Format/table_pptx.cpp +++ b/OdfFile/Reader/Format/table_pptx.cpp @@ -67,8 +67,28 @@ void table_table_row::pptx_convert(oox::pptx_conversion_context & Context) { std::wostream & _Wostream = Context.get_table_context().tableData(); - const std::wstring styleName = attlist_.table_style_name_.get_value_or(L""); - const std::wstring defaultCellStyle = attlist_.table_default_cell_style_name_.get_value_or(L""); + const std::wstring styleName = attlist_.table_style_name_.get_value_or(L""); + const std::wstring defaultCellStyle = attlist_.table_default_cell_style_name_.get_value_or(L""); + std::wstring cellStyle = attlist_.table_default_cell_style_name_.get_value_or(L""); + + bool template_is_first_or_last_row = false; + + if (Context.get_table_context().template_is_first_row()) + { + cellStyle = Context.get_table_context().get_first_row_style_name(); + template_is_first_or_last_row = true; + } + else if (Context.get_table_context().template_is_last_row()) + { + cellStyle = Context.get_table_context().get_last_row_style_name(); + template_is_first_or_last_row = true; + } + else if (Context.get_table_context().template_is_odd_row()) + { + cellStyle = Context.get_table_context().get_odd_rows_style_name(); + } + + Context.get_table_context().set_is_row_template(template_is_first_or_last_row); for (unsigned int i = 0; i < attlist_.table_number_rows_repeated_; ++i) { @@ -92,8 +112,9 @@ void table_table_row::pptx_convert(oox::pptx_conversion_context & Context) _Wostream << L""; - Context.get_table_context().start_row(styleName, defaultCellStyle); + Context.get_table_context().start_row(styleName, cellStyle); + Context.get_table_context().set_table_columns(content_.size()); for (size_t i = 0; i < content_.size(); i++) { content_[i]->pptx_convert(Context); @@ -127,6 +148,7 @@ void table_rows::pptx_convert(oox::pptx_conversion_context & Context) table_table_rows_->pptx_convert(Context); else { + Context.get_table_context().set_table_rows(table_table_row_.size()); for (size_t i = 0; i < table_table_row_.size(); i++) { table_table_row_[i]->pptx_convert(Context); @@ -174,6 +196,45 @@ void table_table::pptx_convert(oox::pptx_conversion_context & Context) table_body_template* body_ = dynamic_cast(template_->table_body_.get()); Context.get_table_context().set_default_cell_style(body_->table_style_name_); } + if (template_->table_first_row_) + { + table_first_row_template* first_row_ = dynamic_cast(template_->table_first_row_.get()); + Context.get_table_context().set_first_row_style_name(first_row_->table_style_name_); + } + if (template_->table_last_row_) + { + table_last_row_template* last_row_ = dynamic_cast(template_->table_last_row_.get()); + Context.get_table_context().set_last_row_style_name(last_row_->table_style_name_); + } + if (template_->table_odd_rows_) + { + table_odd_rows_template* odd_rows_ = dynamic_cast(template_->table_odd_rows_.get()); + Context.get_table_context().set_odd_rows_style_name(odd_rows_->table_style_name_); + } + if (template_->table_first_column_) + { + table_first_column_template* first_column_ = dynamic_cast(template_->table_first_column_.get()); + Context.get_table_context().set_first_column_style_name(first_column_->table_style_name_); + } + if (template_->table_last_column_) + { + table_last_column_template* last_column = dynamic_cast(template_->table_last_column_.get()); + Context.get_table_context().set_last_column_style_name(last_column->table_style_name_); + } + if (template_->table_odd_columns_) + { + table_odd_columns_template* odd_columns = dynamic_cast(template_->table_odd_columns_.get()); + Context.get_table_context().set_odd_columns_style_name(odd_columns->table_style_name_); + } + + Context.get_table_context().set_template_use_styles( + attlist_.table_use_first_row_styles_, + attlist_.table_use_last_row_styles_, + attlist_.table_use_banding_rows_styles_, + attlist_.table_use_first_column_styles_, + attlist_.table_use_last_column_styles_, + attlist_.table_use_banding_columns_styles_); + } } } @@ -348,7 +409,17 @@ void table_table_cell::pptx_convert(oox::pptx_conversion_context & Context) style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); if (style_inst) style_instances.push_back(style_inst); } + + bool is_row_template = Context.get_table_context().get_is_row_template(); + style_name = attlist_.table_style_name_.get_value_or(L""); + if (Context.get_table_context().template_is_first_column() && !is_row_template) + style_name = Context.get_table_context().get_first_column_style_name(); + else if (Context.get_table_context().template_is_last_column() && !is_row_template) + style_name = Context.get_table_context().get_last_column_style_name(); + else if (Context.get_table_context().template_is_odd_column() && !is_row_template) + style_name = Context.get_table_context().get_odd_column_style_name(); + if (!style_name.empty()) { style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); From ee0ab7f0425b11fb87e687f972dad3a7d6f78286 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Mon, 13 Nov 2023 15:49:29 +0500 Subject: [PATCH 02/88] Fix gradient path conversion --- OdfFile/Reader/Format/draw_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OdfFile/Reader/Format/draw_common.cpp b/OdfFile/Reader/Format/draw_common.cpp index 768bac78f9..d802fe754f 100644 --- a/OdfFile/Reader/Format/draw_common.cpp +++ b/OdfFile/Reader/Format/draw_common.cpp @@ -381,7 +381,7 @@ void Compute_GradientFill(draw_gradient* gradient_style, oox::oox_gradient_fill_ } } - if (fill->style > 1) + if (fill->style >= 1) { fill->rect[0] = fill->rect[1] = 0; fill->rect[2] = fill->rect[3] = 100; From 92663a7ae39e175f64d408f5a9c6a7f429765b16 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 14 Nov 2023 02:34:31 +0500 Subject: [PATCH 03/88] Fix bug #62568 --- .../Reader/Converter/pptx_table_context.cpp | 22 ++++++- OdfFile/Reader/Converter/pptx_table_context.h | 23 +++++--- OdfFile/Reader/Format/draw_common.cpp | 4 +- OdfFile/Reader/Format/table_pptx.cpp | 57 ++++++++++--------- 4 files changed, 68 insertions(+), 38 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_table_context.cpp b/OdfFile/Reader/Converter/pptx_table_context.cpp index c835d04511..bee8535bdb 100644 --- a/OdfFile/Reader/Converter/pptx_table_context.cpp +++ b/OdfFile/Reader/Converter/pptx_table_context.cpp @@ -78,6 +78,19 @@ std::wstring pptx_table_state::get_default_cell_style_row() return default_row_cell_style_name_; } +void pptx_table_state::set_default_cell_style_row(const std::wstring& style_name) +{ + default_row_cell_style_name_ = style_name; +} + +void pptx_table_state::set_default_cell_style_col(unsigned int column, const std::wstring style_name) +{ + if (column >= columnsDefaultCellStyleName_.size()) + return; + + columnsDefaultCellStyleName_[column] = style_name; +} + void pptx_table_state::start_row(const std::wstring & StyleName, const std::wstring & defaultCellStyleName) { current_table_column_ = -1; @@ -253,9 +266,14 @@ int pptx_table_state::get_columns() const return total_columns_; } -void pptx_table_state::set_is_row_template(bool is_row_template) +void pptx_table_state::set_template_row_style_name(const std::wstring style_name) { - is_row_template_ = is_row_template; + template_row_style_name_ = style_name; +} + +std::wstring pptx_table_state::get_template_row_style_name() const +{ + return template_row_style_name_; } struct pptx_border_edge diff --git a/OdfFile/Reader/Converter/pptx_table_context.h b/OdfFile/Reader/Converter/pptx_table_context.h index 113b5728a7..af6bff6ee9 100644 --- a/OdfFile/Reader/Converter/pptx_table_context.h +++ b/OdfFile/Reader/Converter/pptx_table_context.h @@ -56,6 +56,8 @@ public: void start_column(unsigned int repeated, const std::wstring & defaultCellStyleName); std::wstring get_default_cell_style_col(unsigned int column); std::wstring get_default_cell_style_row(); + void set_default_cell_style_row(const std::wstring& style_name); + void set_default_cell_style_col(unsigned int column, const std::wstring style_name); void start_row(const std::wstring & StyleName, const std::wstring & defaultCellStyleName); void end_row(); @@ -80,9 +82,11 @@ public: int get_current_row() const; void set_columns(int cols); int get_columns() const; - void set_is_row_template(bool is_row_template); - + void set_template_row_style_name(const std::wstring style_name); + std::wstring get_template_row_style_name() const; + std::wstring default_cell_style_name_; + std::wstring template_row_style_name_; _CP_OPT(std::wstring) first_row_style_name_; _CP_OPT(std::wstring) last_row_style_name_; @@ -91,8 +95,6 @@ public: _CP_OPT(std::wstring) first_column_style_name_; _CP_OPT(std::wstring) last_column_style_name_; _CP_OPT(std::wstring) odd_columns_style_name; - - bool is_row_template_ = false; private: pptx_conversion_context & context_; @@ -210,6 +212,11 @@ public: return table_states_.back().current_rows_spanned(Column); } + void set_default_cell_style_col(unsigned int column, std::wstring style_name) + { + table_states_.back().set_default_cell_style_col(column, style_name); + } + std::wstring get_default_cell_style_col(unsigned int column) { return table_states_.back().get_default_cell_style_col(column); @@ -310,14 +317,14 @@ public: return table_states_.back().default_cell_style_name_; } - void set_is_row_template(bool is_row_template) + void set_template_row_style_name(const std::wstring& style_name) { - table_states_.back().set_is_row_template(is_row_template); + table_states_.back().set_template_row_style_name(style_name); } - bool get_is_row_template() const + std::wstring get_template_row_style_name() { - return table_states_.back().is_row_template_; + return table_states_.back().get_template_row_style_name(); } void set_template_use_styles( diff --git a/OdfFile/Reader/Format/draw_common.cpp b/OdfFile/Reader/Format/draw_common.cpp index d802fe754f..2f1eb619d7 100644 --- a/OdfFile/Reader/Format/draw_common.cpp +++ b/OdfFile/Reader/Format/draw_common.cpp @@ -592,7 +592,9 @@ void Compute_GraphicFill(const common_draw_fill_attlist & props, const office_el } if ((fill.hatch) && (props.draw_fill_color_)) { - fill.hatch->color_back_ref = props.draw_fill_color_->get_hex_value(); + // NOTE: Do not use draw:fill-color for hatch + // fill.hatch->color_back_ref = props.draw_fill_color_->get_hex_value(); + fill.hatch->color_back_ref = L"FFFFFF"; } } if (props.draw_fill_) diff --git a/OdfFile/Reader/Format/table_pptx.cpp b/OdfFile/Reader/Format/table_pptx.cpp index 9ee772b6d3..20df34a1d6 100644 --- a/OdfFile/Reader/Format/table_pptx.cpp +++ b/OdfFile/Reader/Format/table_pptx.cpp @@ -69,26 +69,17 @@ void table_table_row::pptx_convert(oox::pptx_conversion_context & Context) const std::wstring styleName = attlist_.table_style_name_.get_value_or(L""); const std::wstring defaultCellStyle = attlist_.table_default_cell_style_name_.get_value_or(L""); - std::wstring cellStyle = attlist_.table_default_cell_style_name_.get_value_or(L""); - bool template_is_first_or_last_row = false; + std::wstring template_style_name = L""; if (Context.get_table_context().template_is_first_row()) - { - cellStyle = Context.get_table_context().get_first_row_style_name(); - template_is_first_or_last_row = true; - } + template_style_name = Context.get_table_context().get_first_row_style_name(); else if (Context.get_table_context().template_is_last_row()) - { - cellStyle = Context.get_table_context().get_last_row_style_name(); - template_is_first_or_last_row = true; - } + template_style_name = Context.get_table_context().get_last_row_style_name(); else if (Context.get_table_context().template_is_odd_row()) - { - cellStyle = Context.get_table_context().get_odd_rows_style_name(); - } - - Context.get_table_context().set_is_row_template(template_is_first_or_last_row); + template_style_name = Context.get_table_context().get_odd_rows_style_name(); + + Context.get_table_context().set_template_row_style_name(template_style_name); for (unsigned int i = 0; i < attlist_.table_number_rows_repeated_; ++i) { @@ -112,7 +103,7 @@ void table_table_row::pptx_convert(oox::pptx_conversion_context & Context) _Wostream << L""; - Context.get_table_context().start_row(styleName, cellStyle); + Context.get_table_context().start_row(styleName, defaultCellStyle); Context.get_table_context().set_table_columns(content_.size()); for (size_t i = 0; i < content_.size(); i++) @@ -383,6 +374,16 @@ void table_table_cell::pptx_convert(oox::pptx_conversion_context & Context) for (unsigned int r = 0; r < attlist_.table_number_columns_repeated_; ++r) { Context.get_table_context().start_cell(); + + unsigned int current_col = Context.get_table_context().current_column(); + + if (Context.get_table_context().template_is_first_column()) + Context.get_table_context().set_default_cell_style_col(current_col, Context.get_table_context().get_first_column_style_name()); + else if(Context.get_table_context().template_is_last_column()) + Context.get_table_context().set_default_cell_style_col(current_col, Context.get_table_context().get_last_column_style_name()); + else if (Context.get_table_context().template_is_odd_column()) + Context.get_table_context().set_default_cell_style_col(current_col, Context.get_table_context().get_odd_column_style_name()); + CP_XML_NODE(L"a:tc") { std::vector style_instances; @@ -397,29 +398,31 @@ void table_table_cell::pptx_convert(oox::pptx_conversion_context & Context) style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); if (style_inst) style_instances.push_back(style_inst); } + style_name = Context.get_table_context().get_default_cell_style_col(Context.get_table_context().current_column()); if (!style_name.empty()) { style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); if (style_inst)style_instances.push_back(style_inst); } - style_name = Context.get_table_context().get_default_cell_style_row(); - if (!style_name.empty()) + style_name = Context.get_table_context().get_template_row_style_name(); + if (!style_name.empty() && !Context.get_table_context().template_is_first_column() && !Context.get_table_context().template_is_last_column()) { style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); - if (style_inst) style_instances.push_back(style_inst); + if (style_inst)style_instances.push_back(style_inst); } - bool is_row_template = Context.get_table_context().get_is_row_template(); + if (!attlist_.table_style_name_.has_value()) + { + style_name = Context.get_table_context().get_default_cell_style_row(); + if (!style_name.empty()) + { + style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); + if (style_inst) style_instances.push_back(style_inst); + } + } style_name = attlist_.table_style_name_.get_value_or(L""); - if (Context.get_table_context().template_is_first_column() && !is_row_template) - style_name = Context.get_table_context().get_first_column_style_name(); - else if (Context.get_table_context().template_is_last_column() && !is_row_template) - style_name = Context.get_table_context().get_last_column_style_name(); - else if (Context.get_table_context().template_is_odd_column() && !is_row_template) - style_name = Context.get_table_context().get_odd_column_style_name(); - if (!style_name.empty()) { style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::TableCell, false); From 078e9afcc2653de2ebcc5e93360518bdfaffdb86 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 3 Apr 2024 21:31:09 +0600 Subject: [PATCH 04/88] Fix conditional formatting conversion --- OOXML/XlsxFormat/Styles/rPr.cpp | 3 + .../Worksheets/ConditionalFormatting.cpp | 70 +++++++++++++------ 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 63be11df16..9a73cea573 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -520,6 +520,7 @@ namespace OOX ptr->bAlpha = 0; ptr->bAlpha = 0; ptr->bAlpha = 0; + ptr->fValidRGB = false; if(m_oAuto.IsInit()) { @@ -542,6 +543,8 @@ namespace OOX ptr->bBlue = m_oRgb->Get_B(); ptr->bGreen = m_oRgb->Get_G(); ptr->bRed = m_oRgb->Get_R(); + ptr->xColorType = 2; + ptr->fValidRGB = true; } if ( m_oTint.IsInit()) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 169bac34e4..443370e794 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -247,6 +247,7 @@ XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() auto ptr1(new XLSB::CFVO); ptr->m_BrtCFVO = XLS::BaseObjectPtr{ptr1}; + ptr1->fSaveGTE = 0; if(m_oGte.IsInit()) ptr1->fGTE = m_oGte->GetValue(); else @@ -266,10 +267,19 @@ XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() if(m_oVal.IsInit()) ptr1->numParam.data.value = std::stod(m_oVal.get()); + else if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMIN) + ptr1->numParam.data.value = 0; + else if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMAX) + ptr1->numParam.data.value = 0; if(m_oFormula.IsInit()) { ptr1->formula = m_oFormula->m_sText; + ptr1->cbFmla = ptr1->formula.cce; + } + else + { + ptr1->cbFmla = 0; } return objectPtr; @@ -659,6 +669,8 @@ XLS::BaseObjectPtr CColorScale::toBin() XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrValues) ptr->m_arCFVO.push_back(i->toBin()); + for(auto i:m_arrColors) + ptr->m_arBrtColor.push_back(i->toBin()); return objectPtr; } EElementType CColorScale::getType () const @@ -893,7 +905,7 @@ XLS::BaseObjectPtr CDataBar::toBin() if(m_oMaxLength.IsInit()) ptr1->bLenMax = m_oMaxLength->GetValue(); else - m_oMaxLength = 100; + ptr1->bLenMax = 100; if(m_oMinLength.IsInit()) ptr1->bLenMin = m_oMinLength->GetValue(); else @@ -1737,6 +1749,15 @@ XLS::BaseObjectPtr CConditionalFormattingRule::toBin(const XLS::CellRef &cellRe { ptr->m_source = m_oIconSet->toBin(); } + if(m_oExtId.IsInit()) + { + auto extPtr(new XLSB::FRTCFRULE); + auto beginExt(new XLSB::CFRuleExt); + extPtr->m_BrtCFRuleExt = XLS::BaseObjectPtr{beginExt}; + ptr->m_FRTCFRULE = XLS::BaseObjectPtr{extPtr}; + + beginExt->guid = m_oExtId.get(); + } return objPtr; } @@ -1750,6 +1771,8 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes(const XLS::CellR { ptr->dxfId = m_oDxfId->GetValue(); } + else + ptr->dxfId = 0; if(m_oPriority.IsInit()) ptr->iPri = m_oPriority->GetValue(); if(m_oStopIfTrue.IsInit()) @@ -1771,7 +1794,7 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes(const XLS::CellR if(m_oText.IsInit()) ptr->strParam = m_oText.get(); else - ptr->strParam = L""; + ptr->strParam.setSize(0xFFFFFFFF); if(!m_arrFormula.empty()) { @@ -1941,11 +1964,13 @@ else if (m_oType == SimpleTypes::Spreadsheet::ECfType::colorScale) { ptr->iType = XLSB::CFType::CF_TYPE_GRADIENT; ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_GRADIENT; + ptr->dxfId = 0xFFFFFFFF; } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::dataBar) { ptr->iType = XLSB::CFType::CF_TYPE_DATABAR; ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_DATABAR; + ptr->dxfId = 0xFFFFFFFF; } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::iconSet) { @@ -2636,28 +2661,29 @@ XLS::BaseObjectPtr CConditionalFormatting::toBin() { return objectPtr; } + auto ptr(new XLSB::CONDITIONALFORMATTING); + objectPtr = XLS::BaseObjectPtr{ptr}; + XLS::CellRef formatingfirstCell; - auto ptr(new XLSB::CONDITIONALFORMATTING); - objectPtr = XLS::BaseObjectPtr{ptr}; - XLS::CellRef formatingfirstCell; - if(m_oSqRef.IsInit()) - { - auto conditionPtr(new XLSB::BeginConditionalFormatting); - ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; - conditionPtr->ccf = m_arrItems.size(); - conditionPtr->sqrfx.strValue = m_oSqRef.get(); - if(m_oPivot.IsInit()) - conditionPtr->fPivot = m_oPivot->GetValue(); - else - conditionPtr->fPivot = false; - formatingfirstCell = conditionPtr->sqrfx.getLocationFirstCell(); - - } - for(auto i: m_arrItems) - { - ptr->m_arCFRULE.push_back(i->toBin(formatingfirstCell)); - } + auto conditionPtr(new XLSB::BeginConditionalFormatting); + ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; + conditionPtr->ccf = m_arrItems.size(); + if(m_oSqRef.IsInit()) + { + conditionPtr->sqrfx.strValue = m_oSqRef.get(); + } + else + conditionPtr->sqrfx.crfx = 0; + if(m_oPivot.IsInit()) + conditionPtr->fPivot = m_oPivot->GetValue(); + else + conditionPtr->fPivot = false; + formatingfirstCell = conditionPtr->sqrfx.getLocationFirstCell(); + for(auto i: m_arrItems) + { + ptr->m_arCFRULE.push_back(i->toBin(formatingfirstCell)); + } return objectPtr; } bool CConditionalFormatting::IsUsage() From 12fd3bd3cef633f1be4f37d934462182831a0b38 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 4 Apr 2024 17:20:59 +0600 Subject: [PATCH 05/88] Comment conditional formattings ext --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index a8a2bfb952..68dd8c8386 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -881,12 +881,12 @@ namespace OOX { if(i->m_sUri == L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}") { - auto formatPtr(new XLSB::CONDITIONALFORMATTINGS); + /*auto formatPtr(new XLSB::CONDITIONALFORMATTINGS); ptr->m_CONDITIONALFORMATTINGS = XLS::BaseObjectPtr{formatPtr}; for(auto j:i->m_arrConditionalFormatting) { formatPtr->m_arCONDITIONALFORMATTING14.push_back(j->toBin()); - } + }*/ } else if(i->m_sUri == L"{CCE6A557-97BC-4B89-ADB6-D9C93CAAB3DF}") { From 10c6def10ec20e2bb88277ba3f918a729ced37e4 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 5 Apr 2024 15:54:31 +0300 Subject: [PATCH 06/88] Bug fixed. Editing sqrt and nroot, dropping parentheses. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 270 +++++++++--------- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 41 +-- .../StarMath2OOXML/cconversionsmtoooxml.h | 1 + .../StarMath2OOXML/cstarmathpars.cpp | 205 +++++++------ .../Converter/StarMath2OOXML/cstarmathpars.h | 33 ++- OdfFile/Reader/Format/math_elements.cpp | 8 +- 6 files changed, 303 insertions(+), 255 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 75ec83fbc7..f87f79e7e4 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -10,7 +10,7 @@ TEST(SMConvectorTest, BinOperatorPlus) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"2+3"; + std::wstring XmlString = L"2+3"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -20,7 +20,7 @@ TEST(SMConvectorTest,BinOperatorOver) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"23"; + std::wstring XmlString = L"23"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -30,7 +30,7 @@ TEST(SMConvectorTest,BinOperatorCdot) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"5\u00B78"; + std::wstring XmlString = L"5\u00B78"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -40,7 +40,7 @@ TEST(SMConvectorTest,BinOperatorTimes) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"5\u00D78"; + std::wstring XmlString = L"5\u00D78"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -50,7 +50,7 @@ TEST(SMConvectorTest,BinOperatorMultipl) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"4*2"; + std::wstring XmlString = L"4*2"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -60,7 +60,7 @@ TEST(SMConvectorTest,BinOperatorDiv) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"4\u00F72"; + std::wstring XmlString = L"4\u00F72"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -70,7 +70,7 @@ TEST(SMConvectorTest,BinOperatorDivision) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"42"; + std::wstring XmlString = L"42"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -80,7 +80,7 @@ TEST(SMConvectorTest,BinOperatorOplus) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"226\u2295179"; + std::wstring XmlString = L"226\u2295179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -90,7 +90,7 @@ TEST(SMConvectorTest,BinOperatorOdot) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"226\u2299179"; + std::wstring XmlString = L"226\u2299179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -100,7 +100,7 @@ TEST(SMConvectorTest,BinOperatorOtimes) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"226\u2297179"; + std::wstring XmlString = L"226\u2297179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -110,7 +110,7 @@ TEST(SMConvectorTest,OperatorSum) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"5"; + std::wstring XmlString = L"5"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -120,7 +120,7 @@ TEST(SMConvectorTest,OperatorSumFrom) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"105"; + std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -130,7 +130,7 @@ TEST(SMConvectorTest,OperatorSumTo) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"105"; + std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -140,7 +140,7 @@ TEST(SMConvectorTest,OperatorSumFromTo) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"666777567"; + std::wstring XmlString = L"666777567"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -150,7 +150,7 @@ TEST(SMConvectorTest,SetOperationUnion) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23\u22C345"; + std::wstring wsXmlString = L"23\u22C345"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -160,7 +160,7 @@ TEST(SMConvectorTest,SetOperationIntersection) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"15\u22C21234"; + std::wstring wsXmlString = L"15\u22C21234"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -170,7 +170,7 @@ TEST(SMConvectorTest,SetOperationSetminus) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"7\u221615745"; + std::wstring wsXmlString = L"7\u221615745"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -180,7 +180,7 @@ TEST(SMConvectorTest,SetOperationSetquotient) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"91\u221545"; + std::wstring wsXmlString = L"91\u221545"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -190,7 +190,7 @@ TEST(SMConvectorTest,SetOperationSubset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22822"; + std::wstring wsXmlString = L"1\u22822"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -200,7 +200,7 @@ TEST(SMConvectorTest,SetOperationSubseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"77\u228666"; + std::wstring wsXmlString = L"77\u228666"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -210,7 +210,7 @@ TEST(SMConvectorTest,SetOperationSupset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"11\u228322"; + std::wstring wsXmlString = L"11\u228322"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -220,7 +220,7 @@ TEST(SMConvectorTest,SetOperationSupseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22872"; + std::wstring wsXmlString = L"1\u22872"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -230,7 +230,7 @@ TEST(SMConvectorTest,SetOperationNsubset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"21\u22842"; + std::wstring wsXmlString = L"21\u22842"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -240,7 +240,7 @@ TEST(SMConvectorTest,SetOperationNsubseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"782\u2288250"; + std::wstring wsXmlString = L"782\u2288250"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -250,7 +250,7 @@ TEST(SMConvectorTest,SetOperationNsupset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22852"; + std::wstring wsXmlString = L"1\u22852"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -260,7 +260,7 @@ TEST(SMConvectorTest,SetOperationNsupseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22892"; + std::wstring wsXmlString = L"1\u22892"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -270,7 +270,7 @@ TEST(SMConvectorTest,SetOperationIn) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22082"; + std::wstring wsXmlString = L"1\u22082"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -280,7 +280,7 @@ TEST(SMConvectorTest,SetOperationNotin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3\u22094"; + std::wstring wsXmlString = L"3\u22094"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -290,7 +290,7 @@ TEST(SMConvectorTest,SetOperationOwns) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"5\u220B6"; + std::wstring wsXmlString = L"5\u220B6"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -300,7 +300,7 @@ TEST(SMConvectorTest,ConnectionDlarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"7\u21D08"; + std::wstring wsXmlString = L"7\u21D08"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -310,7 +310,7 @@ TEST(SMConvectorTest,ConnectionDlrarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"9\u21D410"; + std::wstring wsXmlString = L"9\u21D410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -320,7 +320,7 @@ TEST(SMConvectorTest,ConnectionDrarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"11\u21D212"; + std::wstring wsXmlString = L"11\u21D212"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -330,7 +330,7 @@ TEST(SMConvectorTest,ConnectionEquals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"13=14"; + std::wstring wsXmlString = L"13=14"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -340,7 +340,7 @@ TEST(SMConvectorTest,ConnectionNotequals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"15\u226016"; + std::wstring wsXmlString = L"15\u226016"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -350,7 +350,7 @@ TEST(SMConvectorTest,ConnectionLearrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"17<18"; + std::wstring wsXmlString = L"17<18"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -360,7 +360,7 @@ TEST(SMConvectorTest,ConnectionLearrowequals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"19\u226420"; + std::wstring wsXmlString = L"19\u226420"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -370,7 +370,7 @@ TEST(SMConvectorTest,ConnectionRiarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"21>22"; + std::wstring wsXmlString = L"21>22"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -380,7 +380,7 @@ TEST(SMConvectorTest,ConnectionRiarrowequals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23\u226524"; + std::wstring wsXmlString = L"23\u226524"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -390,7 +390,7 @@ TEST(SMConvectorTest,ConnectionDllearrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"25\u226A26"; + std::wstring wsXmlString = L"25\u226A26"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -400,7 +400,7 @@ TEST(SMConvectorTest,ConnectionDlriarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"27\u226B28"; + std::wstring wsXmlString = L"27\u226B28"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -410,7 +410,7 @@ TEST(SMConvectorTest,ConnectionApprox) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"29\u224830"; + std::wstring wsXmlString = L"29\u224830"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -420,7 +420,7 @@ TEST(SMConvectorTest,ConnectionSim) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"31\u223C32"; + std::wstring wsXmlString = L"31\u223C32"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -430,7 +430,7 @@ TEST(SMConvectorTest,ConnectionSimeq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"33\u224334"; + std::wstring wsXmlString = L"33\u224334"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -440,7 +440,7 @@ TEST(SMConvectorTest,ConnectionEquiv) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"35\u226136"; + std::wstring wsXmlString = L"35\u226136"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -450,17 +450,17 @@ TEST(SMConvectorTest,ConnectionProp) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"37\u221D38"; + std::wstring wsXmlString = L"37\u221D38"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } TEST(SMConvectorTest,ConnectionParallel) { - std::wstring wsString = L"39 parallel 40"; + std::wstring wsString = L"39 parallel 30"; StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"39\u222540"; + std::wstring wsXmlString = L"39\u222530"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -470,7 +470,7 @@ TEST(SMConvectorTest,ConnectionOrtho) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"41\u22A542"; + std::wstring wsXmlString = L"41\u22A542"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -480,7 +480,7 @@ TEST(SMConvectorTest,ConnectionDivides) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"43\u222344"; + std::wstring wsXmlString = L"43\u222344"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -490,7 +490,7 @@ TEST(SMConvectorTest,ConnectionNdivides) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"45\u222446"; + std::wstring wsXmlString = L"45\u222446"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -500,7 +500,7 @@ TEST(SMConvectorTest,ConnectionToward) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"47\u219248"; + std::wstring wsXmlString = L"47\u219248"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -510,7 +510,7 @@ TEST(SMConvectorTest,ConnectionTransl) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"49\u22B750"; + std::wstring wsXmlString = L"49\u22B750"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -520,7 +520,7 @@ TEST(SMConvectorTest,ConnectionTransr) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"51\u22B652"; + std::wstring wsXmlString = L"51\u22B652"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -530,7 +530,7 @@ TEST(SMConvectorTest,ConnectionDef) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"53\u225D54"; + std::wstring wsXmlString = L"53\u225D54"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -540,7 +540,7 @@ TEST(SMConvectorTest,ConnectionPrec) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"55\u227A56"; + std::wstring wsXmlString = L"55\u227A56"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -550,7 +550,7 @@ TEST(SMConvectorTest,ConnectionSucc) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"57\u227B58"; + std::wstring wsXmlString = L"57\u227B58"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -560,7 +560,7 @@ TEST(SMConvectorTest,ConnectionPreccurlyeq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"59\u227C60"; + std::wstring wsXmlString = L"59\u227C60"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -570,7 +570,7 @@ TEST(SMConvectorTest,ConnectionSucccurlyeq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"61\u227D62"; + std::wstring wsXmlString = L"61\u227D62"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -580,7 +580,7 @@ TEST(SMConvectorTest,ConnectionPrecsim) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"63\u227E64"; + std::wstring wsXmlString = L"63\u227E64"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -590,7 +590,7 @@ TEST(SMConvectorTest,ConnectionSuccsim) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"65\u227F66"; + std::wstring wsXmlString = L"65\u227F66"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -600,7 +600,7 @@ TEST(SMConvectorTest,ConnectionNprec) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"67\u228068"; + std::wstring wsXmlString = L"67\u228068"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -610,7 +610,7 @@ TEST(SMConvectorTest,ConnectionNsucc) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"69\u228170"; + std::wstring wsXmlString = L"69\u228170"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -620,7 +620,7 @@ TEST(SMConvectorTest,BracketRound) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+3"; + std::wstring wsXmlString = L"2+3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -630,7 +630,7 @@ TEST(SMConvectorTest,BracketSquare) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"4-5"; + std::wstring wsXmlString = L"4-5"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -640,7 +640,7 @@ TEST(SMConvectorTest,BracketLdbracket) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"6+7"; + std::wstring wsXmlString = L"6+7"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -650,7 +650,7 @@ TEST(SMConvectorTest,BracketLbrace) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"8-9"; + std::wstring wsXmlString = L"8-9"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -660,7 +660,7 @@ TEST(SMConvectorTest,BracketLangle) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1011"; + std::wstring wsXmlString = L"1011"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -670,7 +670,7 @@ TEST(SMConvectorTest,BracketLceil) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"12\u229613"; + std::wstring wsXmlString = L"12\u229613"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -680,7 +680,7 @@ TEST(SMConvectorTest,BracketLfloor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"14\u22C315"; + std::wstring wsXmlString = L"14\u22C315"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -690,7 +690,7 @@ TEST(SMConvectorTest,BracketLline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1617"; + std::wstring wsXmlString = L"1617"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -700,7 +700,7 @@ TEST(SMConvectorTest,BracketLdline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"18\u229519"; + std::wstring wsXmlString = L"18\u229519"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -710,7 +710,7 @@ TEST(SMConvectorTest,FunctionCos) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cos2+3"; + std::wstring wsXmlString = L"cos2+3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -720,7 +720,7 @@ TEST(SMConvectorTest,FunctionSin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"sin45"; + std::wstring wsXmlString = L"sin45"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -730,7 +730,7 @@ TEST(SMConvectorTest,FunctionTan) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"tan67"; + std::wstring wsXmlString = L"tan67"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -740,7 +740,7 @@ TEST(SMConvectorTest,FunctionCot) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cot89"; + std::wstring wsXmlString = L"cot89"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -750,7 +750,7 @@ TEST(SMConvectorTest,FunctionSinh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"sinh2\u22833"; + std::wstring wsXmlString = L"sinh2\u22833"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -760,7 +760,7 @@ TEST(SMConvectorTest,FunctionCosh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cosh2+3"; + std::wstring wsXmlString = L"cosh2+3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -770,7 +770,7 @@ TEST(SMConvectorTest,FunctionTanh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"tanh11\u229712"; + std::wstring wsXmlString = L"tanh11\u229712"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -780,7 +780,7 @@ TEST(SMConvectorTest,FunctionCoth222) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"coth222"; + std::wstring wsXmlString = L"coth222"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -790,7 +790,7 @@ TEST(SMConvectorTest,FunctionArcsin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arcsin13\u229614"; + std::wstring wsXmlString = L"arcsin13\u229614"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -800,7 +800,7 @@ TEST(SMConvectorTest,FunctionArccos) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arccos15-16"; + std::wstring wsXmlString = L"arccos15-16"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -810,7 +810,7 @@ TEST(SMConvectorTest,FunctionArctan) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arctan1718"; + std::wstring wsXmlString = L"arctan1718"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -820,7 +820,7 @@ TEST(SMConvectorTest,FunctionArccot) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arccot20+30"; + std::wstring wsXmlString = L"arccot20+30"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -830,7 +830,7 @@ TEST(SMConvectorTest,FunctionArsinh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arsinh231510"; + std::wstring wsXmlString = L"arsinh231510"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -840,7 +840,7 @@ TEST(SMConvectorTest,FunctionArcosh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"35+27arcosh2378"; + std::wstring wsXmlString = L"35+27arcosh2378"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -850,7 +850,7 @@ TEST(SMConvectorTest,FunctionArtanhArcoth) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arcoth30\u2282artanh27"; + std::wstring wsXmlString = L"arcoth30\u2282artanh27"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -860,7 +860,7 @@ TEST(SMConvectorTest,MatrixBinom) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"27\u2283277arcoth89"; + std::wstring wsXmlString = L"27\u2283277arcoth89"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -870,7 +870,7 @@ TEST(SMConvectorTest,MatrixMatrix) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; + std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -880,7 +880,7 @@ TEST(SMConvectorTest,MatrixStack) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"210231234"; + std::wstring wsXmlString = L"210231234"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -890,7 +890,7 @@ TEST(SMConvectorTest,IndexLower) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2512"; + std::wstring wsXmlString = L"2512"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -900,7 +900,7 @@ TEST(SMConvectorTest,IndexUpper) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cos52410"; + std::wstring wsXmlString = L"cos52410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -910,7 +910,7 @@ TEST(SMConvectorTest,IndexLsup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+3cos1527"; + std::wstring wsXmlString = L"2+3cos1527"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -920,7 +920,7 @@ TEST(SMConvectorTest,IndexLsub) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"22222103"; + std::wstring wsXmlString = L"22222103"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -930,7 +930,7 @@ TEST(SMConvectorTest,BracketWithIndexOverbrace) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"231010010"; + std::wstring wsXmlString = L"231010010"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -940,7 +940,7 @@ TEST(SMConvectorTest,OperatorLllint) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2102+3100"; + std::wstring wsXmlString = L"2102+3100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -950,7 +950,7 @@ TEST(SMConvectorTest,BracketLdlineAttribute) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"10100+3+10"; + std::wstring wsXmlString = L"10100+3+10"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -960,7 +960,7 @@ TEST(SMConvectorTest,Example11) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"fx=n=0\u221Efnx0n\u0021x-x0n"; + std::wstring wsXmlString = L"fx=n=0\u221Efnx0n\u0021x-x0n"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -970,7 +970,7 @@ TEST(SMConvectorTest,AttributeGrade) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"E=mc2ba\u221E"; + std::wstring wsXmlString = L"E=mc2ba\u221E"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -980,7 +980,7 @@ TEST(SMConvectorTest,Example2) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"C=\u03C0\u00B7d=2\u00B7\u03C0\u00B7r"; + std::wstring wsXmlString =L"C=\u03C0\u00B7d=2\u00B7\u03C0\u00B7r"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -990,7 +990,7 @@ TEST(SMConvectorTest,Example3) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"c=a2+b2"; + std::wstring wsXmlString =L"c=a2+b2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1000,7 +1000,7 @@ TEST(SMConvectorTest,Example4) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"F=m\u00D7a"; + std::wstring wsXmlString =L"F=m\u00D7a"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1010,7 +1010,7 @@ TEST(SMConvectorTest,Example5) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"E=mc2"; + std::wstring wsXmlString =L"E=mc2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1020,7 +1020,7 @@ TEST(SMConvectorTest,Example6) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"G\u03BC\u03BD+\u039Bg\u03BC\u03BD=8\u03C0Gc4T\u03BC\u03BD"; + std::wstring wsXmlString =L"G\u03BC\u03BD+\u039Bg\u03BC\u03BD=8\u03C0Gc4T\u03BC\u03BD"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1030,7 +1030,7 @@ TEST(SMConvectorTest,Example8) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"ddt\u2202L\u2202q=\u2202L\u2202q"; + std::wstring wsXmlString =L"ddt\u2202L\u2202q=\u2202L\u2202q"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1040,7 +1040,7 @@ TEST(SMConvectorTest,Example9) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"abf'xdx=fb-fa"; + std::wstring wsXmlString =L"abf'xdx=fb-fa"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1050,7 +1050,7 @@ TEST(SMConvectorTest,Example10) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"\u03B4rt\u2248e\u03BBt\u03B4r0"; + std::wstring wsXmlString =L"\u03B4rt\u2248e\u03BBt\u03B4r0"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1060,7 +1060,7 @@ TEST(SMConvectorTest,LimAndCsub) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"lim21015244"; + std::wstring wsXmlString =L"lim21015244"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1070,7 +1070,7 @@ TEST(SMConvectorTest,LimSupAndCsup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"lim sup10210100"; + std::wstring wsXmlString =L"lim sup10210100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1080,7 +1080,7 @@ TEST(SMConvectorTest,OverWithoutLeft) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"\u00B12105"; + std::wstring wsXmlString =L"\u00B12105"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1090,7 +1090,7 @@ TEST(SMConvectorTest,Newline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23102"; + std::wstring wsXmlString = L"23102"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1100,7 +1100,7 @@ TEST(SMConvectorTest,IndexAndBinOp) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2\u22C33410"; + std::wstring wsXmlString = L"2\u22C33410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1110,7 +1110,7 @@ TEST(SMConvectorTest,Example7) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"\u0394t'=\u0394t1-v2c2"; + std::wstring wsXmlString = L"\u0394t'=\u0394t1-v2c2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1120,7 +1120,7 @@ TEST(SMConvectorTest,UnarySign) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3+69\u2213510"; + std::wstring wsXmlString = L"3+69\u2213510"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1130,7 +1130,7 @@ TEST(SMConvectorTest,Example13) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3x3-7x2+14x-8+78+49+378+49"; + std::wstring wsXmlString = L"3x3-7x2+14x-8+78+49+378+49"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1140,7 +1140,7 @@ TEST(SMConvectorTest,Example14) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"i=0\u221E-1i2i+1x2i+1=sinx"; + std::wstring wsXmlString = L"i=0\u221E-1i2i+1x2i+1=sinx"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1150,7 +1150,7 @@ TEST(SMConvectorTest,Example15) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"limx->0sinxx=1"; + std::wstring wsXmlString = L"limx->0sinxx=1"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1160,7 +1160,7 @@ TEST(SMConvectorTest,Example16) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"0\u221Ex2e-xdx=2"; + std::wstring wsXmlString = L"0\u221Ex2e-xdx=2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1170,7 +1170,7 @@ TEST(SMConvectorTest,Example17) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"a2b+b2a\u22652ab"; + std::wstring wsXmlString = L"a2b+b2a\u22652ab"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1180,7 +1180,7 @@ TEST(SMConvectorTest,Example18) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"541021"; + std::wstring wsXmlString = L"541021"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1190,7 +1190,7 @@ TEST(SMConvectorTest,IndexWithColor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"5867243"; + std::wstring wsXmlString = L"5867243"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1200,7 +1200,7 @@ TEST(SMConvectorTest,FunctionWithColor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"10e2723"; + std::wstring wsXmlString = L"10e2723"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1210,7 +1210,7 @@ TEST(SMConvectorTest,IncorrectSizeAndFontInput) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"bolt2"; + std::wstring wsXmlString = L"bolt2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1220,7 +1220,7 @@ TEST(SMConvectorTest,IncorrectRGBColorInput) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2550257210"; + std::wstring wsXmlString = L"2550257210"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1230,7 +1230,7 @@ TEST(SMConvectorTest,IncorrectHexColorInput) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"RGBRGBRGBRGBRGB"; + std::wstring wsXmlString = L"RGBRGBRGBRGBRGB"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1240,7 +1240,7 @@ TEST(SMConvectorTest,IndexWithoutElement) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23"; + std::wstring wsXmlString = L"23"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1250,7 +1250,7 @@ TEST(SMConvectorTest,Neg) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"-1\u00AC105\u22287"; + std::wstring wsXmlString = L"-1\u00AC105\u22287"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1260,7 +1260,7 @@ TEST(SMConvectorTest,Frac) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"n=1\u221E1n2+1n3=pi26+zeta3"; + std::wstring wsXmlString = L"n=1\u221E1n2+1n3=pi26+zeta3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1270,7 +1270,7 @@ TEST(SMConvectorTest,BracketIndexOnTopAndOperationOnSet) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3+105\u221612"; + std::wstring wsXmlString = L"3+105\u221612"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1280,7 +1280,7 @@ TEST(SMConvectorTest,SqrtWithIndex) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2log28=4"; + std::wstring wsXmlString = L"2log28=4"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1290,7 +1290,17 @@ TEST(SMConvectorTest,Binom) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2=432+1abc5"; + std::wstring wsXmlString = L"2=432+1abc5"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,UnarySignWithColor) +{ + std::wstring wsString = L"color green [color red 2 color blue + 10 setminus color red 5 over 9 underbrace 3 ]"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2+10\u2216593"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index e056cbb293..721cb59104 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -36,36 +36,14 @@ namespace StarMath { CConversionSMtoOOXML::CConversionSMtoOOXML(): m_pXmlWrite(nullptr) { } + CConversionSMtoOOXML::~CConversionSMtoOOXML() + { + delete m_pXmlWrite; + } //check XMLWrite(if not nullptr == delete) void CConversionSMtoOOXML::StartConversion(std::vector arPars, const unsigned int& iAlignment) { m_pXmlWrite = new XmlUtils::CXmlWriter; -// m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); -// if(iAlignment>= 0 && iAlignment <= 2) -// { -// std::wstring wsAlignment; -// switch(iAlignment) -// { -// case 0: -// wsAlignment = L"center"; -// break; -// case 1: -// wsAlignment = L"left"; -// break; -// case 2: -// wsAlignment = L"right"; -// break; -// default: -// wsAlignment = L"center"; -// break; -// } -// m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); -// m_pXmlWrite->WriteNodeBegin(L"m:jc",true); -// m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); -// m_pXmlWrite->WriteNodeEnd(L"",true,true); -// m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); -// } -// m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); for(CElement* oTempElement:arPars) { if(oTempElement != nullptr) @@ -83,13 +61,11 @@ namespace StarMath { oTempElement->ConversionToOOXML(m_pXmlWrite); } } -// EndConversion(); } void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { if(pAttribute == nullptr) { - //тут должны быть базовые свойства шрифта, задаваемые выше pXmlWrite->WriteNodeBegin(L"w:rPr",false); pXmlWrite->WriteNodeBegin(L"w:rFonts",true); @@ -97,10 +73,10 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteAttribute(L"w:val",L"30"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteAttribute(L"w:val",L"30"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); } @@ -122,12 +98,11 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"w",true,true); if(pAttribute->GetSize() == 0) { - //тут должны быть базовые свойства шрифта, задаваемые выше - далее везде где не задано - аналогично pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteAttribute(L"w:val",L"30"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteAttribute(L"w:val",L"30"); pXmlWrite->WriteNodeEnd(L"w",true,true); } else if(pAttribute->GetSize() != 0) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 05d61d0b83..e6cb1bf5e5 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -41,6 +41,7 @@ namespace StarMath { { public: CConversionSMtoOOXML(); + ~CConversionSMtoOOXML(); void StartConversion(std::vector arPars, const unsigned int& iAlignment = -1); static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesMFPR(bool bType,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 5836af722c..f31356253c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -35,13 +35,17 @@ namespace StarMath { //class methods CParsStarMath - std::vector CParserStarMathString::Parse(std::wstring& wsParseString,const TBaseAttribute* pBaseAttribute) + CParserStarMathString::CParserStarMathString():m_iAlignment(0){} + CParserStarMathString::~CParserStarMathString() + { + for(CElement* pElement:m_arEquation) + delete pElement; + } + std::vector CParserStarMathString::Parse(std::wstring& wsParseString) { std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); CStarMathReader* pReader = new CStarMathReader(itStart,itEnd); - pReader->SetBaseAttribute(pBaseAttribute); - if(pBaseAttribute != nullptr && (pBaseAttribute->base_alignment >= 0 && pBaseAttribute->base_alignment <= 2)) - SetAlignment(pBaseAttribute->base_alignment); + pReader->SetBaseAttribute(m_stBaseAttribute); while(pReader->CheckIteratorPosition()) { if(!m_arEquation.empty()) @@ -73,7 +77,7 @@ namespace StarMath if(pReader->GetAttribute() != nullptr && !CheckForLeftArgument(pReader->GetGlobalType())) pElement->SetBaseAttribute(pReader->GetAttribute()); - else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType())) + else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType() || TypeElement::frac == pReader->GetLocalType() || TypeElement::neg == pReader->GetLocalType())) pElement->SetBaseAttribute(pReader->GetAttribute()); pReader->ClearReader(); pElement->Parse(pReader); @@ -115,7 +119,7 @@ namespace StarMath case TypeElement::BinOperator: { CElementBinOperator* pBinOp = dynamic_cast(pElementWhichAdd); - if(pBinOp->GetType() == TypeElement::neg) + if(pBinOp->GetType() == TypeElement::neg || (pBinOp->GetAttribute()!= nullptr && pBinOp->MixedOperators(pBinOp->GetType()))) return false; else return SetLeft(pLeftArg, pElementWhichAdd); @@ -134,7 +138,10 @@ namespace StarMath } case TypeElement::Index: { - return SetLeft(pLeftArg,pElementWhichAdd); + CElementIndex * pIndex = dynamic_cast(pElementWhichAdd); + if(pIndex->GetType() != TypeElement::sqrt && pIndex->GetType() != TypeElement::nroot) + return SetLeft(pLeftArg,pElementWhichAdd); + else return false; } default: break; @@ -147,7 +154,7 @@ namespace StarMath { CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while(CheckForLeftArgument(pReader->GetGlobalType(),bConnection) && (pReader->GetLocalType() != TypeElement::frac && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt)) + while(CheckForLeftArgument(pReader->GetGlobalType(),bConnection) && (pReader->GetLocalType() != TypeElement::neg && pReader->GetLocalType() != TypeElement::frac && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt)) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pFirstTempElement); } @@ -228,8 +235,30 @@ namespace StarMath { return m_iAlignment; } + void CParserStarMathString::SetBaseFont(const std::wstring &wsNameFont) + { + m_stBaseAttribute.base_font_name = wsNameFont; + } + void CParserStarMathString::SetBaseSize(const unsigned int &iSize) + { + if(iSize < 130) + m_stBaseAttribute.base_font_size = iSize; + } + void CParserStarMathString::SetBaseAlignment(const unsigned int &iAlignment) + { + if(iAlignment > 0 && iAlignment < 3) + m_stBaseAttribute.base_alignment = iAlignment; + } + void CParserStarMathString::SetBaseBold(const bool &bBold) + { + m_stBaseAttribute.base_font_bold = bBold; + } + void CParserStarMathString::SetBaseItalic(const bool &bItal) + { + m_stBaseAttribute.base_font_italic = bItal; + } //class methods CAttribute - CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(0) + CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(0),m_unCount(0) { } CAttribute::~CAttribute() @@ -267,7 +296,7 @@ namespace StarMath m_wsColor = L"000000"; return true; case TypeElement::blue: - m_wsColor = L"0400ff"; + m_wsColor = L"0000ff"; return true; case TypeElement::green: m_wsColor =L"00FF00"; @@ -462,32 +491,6 @@ namespace StarMath RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); return false; } -// std::wstring wsColorNumber = pReader->GetElement(); -// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) -// iRed = std::stoi(wsColorNumber); -// else -// { -// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); -// return false; -// } -// if(iRed > 255 || iRed < 0) -// return false; -// wsColorNumber = pReader->GetElement(); -// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) -// iGreen = std::stoi(wsColorNumber); -// else -// { -// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); -// return false; -// } -// wsColorNumber = pReader->GetElement(); -// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) -// iBlue = std::stoi(wsColorNumber); -// else -// { -// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); -// return false; -// } if(iRed > 255 || iGreen > 255 || iBlue > 255) m_wsColor = L"000000"; else @@ -623,10 +626,38 @@ namespace StarMath wsSum += std::to_wstring(iBlue); pReader->SetString(wsSum); } + bool CAttribute::CheckingForEmptiness() + { + if(!m_wsNameFont.empty()) + return true; + if(!m_wsColor.empty()) + return true; + if(m_bBold) + return true; + if(m_bItal) + return true; + if(m_iAlignment > 0 && m_iAlignment<=2) + return true; + if(m_iSize > 0) + return true; + return false; + } + void CAttribute::AddRef() + { + m_unCount++; + } + void CAttribute::Release() + { + m_unCount--; + if(m_unCount == 0) + delete this; + } //class methods CElement CElement::~CElement() { - delete m_pAttribute; +// delete m_pAttribute; + if(m_pAttribute != nullptr) + m_pAttribute->Release(); } CElement::CElement(): m_pAttribute(nullptr) {} @@ -693,7 +724,10 @@ namespace StarMath void CElement::SetBaseAttribute(CAttribute *pAttribute) { if(m_pAttribute == nullptr && pAttribute != nullptr) + { m_pAttribute = pAttribute; + m_pAttribute->AddRef(); + } else if(pAttribute != nullptr && pAttribute != m_pAttribute) { if(!m_pAttribute->GetBold() && pAttribute->GetBold()) @@ -790,10 +824,16 @@ namespace StarMath { SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader,false)); SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + if(GetAttribute() != nullptr) + SetAttribute(GetAttribute()); } else if(m_enTypeBinOp == TypeElement::neg) + { SetRightArg(CParserStarMathString::ParseElement(pReader)); - else if(pReader->GetMarkForUnar() && MixedOperators(m_enTypeBinOp)) + if(GetAttribute()!= nullptr) + SetAttribute(GetAttribute()); + } + else if((pReader->GetMarkForUnar() || GetAttribute()!=nullptr)&& MixedOperators(m_enTypeBinOp)) { SetRightArg(CParserStarMathString::ParseElement(pReader)); } @@ -1613,7 +1653,7 @@ namespace StarMath { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || (pReader->GetGlobalType() == TypeElement::BracketWithIndex && !(TypeElement::intersection == m_enTypeSet || TypeElement::setminus == m_enTypeSet || TypeElement::setquotient == m_enTypeSet)) || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) + while(TypeElement::intersection != m_enTypeSet && TypeElement::setminus != m_enTypeSet && TypeElement::setquotient != m_enTypeSet && ((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac && pReader->GetLocalType()!= TypeElement::neg) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } @@ -1762,13 +1802,13 @@ namespace StarMath pXmlWrite->WriteString(L"\u2260"); break; case TypeElement::learrow: - pXmlWrite->WriteString(L"<"); + pXmlWrite->WriteString(L"<"); break; case TypeElement::learrowequals: pXmlWrite->WriteString(L"\u2264"); break; case TypeElement::riarrow: - pXmlWrite->WriteString(L">"); + pXmlWrite->WriteString(L">"); break; case TypeElement::riarrowequals: pXmlWrite->WriteString(L"\u2265"); @@ -2008,7 +2048,7 @@ namespace StarMath CParserStarMathString::AddLeftArgument(m_pValueIndex,pElement); m_pValueIndex = pElement; } - m_pLeftArg = m_pValueIndex; +// m_pLeftArg = m_pValueIndex; } else { @@ -2543,10 +2583,14 @@ namespace StarMath m_pValueFrom->SetAttribute(pAttribute); if(m_pValueTo!=nullptr) m_pValueTo->SetAttribute(pAttribute); + if(m_pLowerIndex!=nullptr) + m_pLowerIndex->SetAttribute(pAttribute); + if(m_pUpperIndex!=nullptr) + m_pUpperIndex->SetAttribute(pAttribute); } // class methods CStarMathReader CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) - : m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr),m_bMarkForUnar(true) + : m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr),m_bMarkForUnar(true),m_pBaseAttribute(nullptr) { m_itStart = itStart; m_itEnd = itEnd; @@ -2723,23 +2767,20 @@ namespace StarMath { return m_pAttribute; } - void CStarMathReader::SetBaseAttribute(const TBaseAttribute* pAttribute) + void CStarMathReader::SetBaseAttribute(const TBaseAttribute& pAttribute) { - if(pAttribute!=nullptr) - { - m_pBaseAttribute = new CAttribute; - if(pAttribute->base_font_italic) - m_pBaseAttribute->SetItal(); - if(pAttribute->base_font_bold) - m_pBaseAttribute->SetBold(); - if(!pAttribute->base_font_name.empty()) - m_pBaseAttribute->SetFontName(pAttribute->base_font_name); - if(pAttribute->base_font_size != 0) - m_pBaseAttribute->SetSize(pAttribute->base_font_size); - if(pAttribute->base_alignment >= 0 && pAttribute->base_alignment <=2) - m_pBaseAttribute->SetAlignment(pAttribute->base_alignment); - } - else + m_pBaseAttribute = new CAttribute; + if(pAttribute.base_font_italic) + m_pBaseAttribute->SetItal(); + if(pAttribute.base_font_bold) + m_pBaseAttribute->SetBold(); + if(!pAttribute.base_font_name.empty()) + m_pBaseAttribute->SetFontName(pAttribute.base_font_name); + if(pAttribute.base_font_size != 0) + m_pBaseAttribute->SetSize(pAttribute.base_font_size); + if(pAttribute.base_alignment >= 0 && pAttribute.base_alignment <=2) + m_pBaseAttribute->SetAlignment(pAttribute.base_alignment); + if(!m_pBaseAttribute->CheckingForEmptiness()) m_pBaseAttribute = nullptr; } CAttribute* CStarMathReader::GetBaseAttribute() @@ -2969,32 +3010,34 @@ namespace StarMath CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:groupChrPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - switch(m_enTypeBracketWithIndex) - { - case TypeElement::overbrace: - CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); - break; - case TypeElement::underbrace: - CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); - break; - default: - break; - } +// switch(m_enTypeBracketWithIndex) +// { +// case TypeElement::overbrace: +// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); +// break; +// case TypeElement::underbrace: +// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); +// break; +// default: +// break; +// } + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeEnd(L"m:groupChr",false,false); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeBegin(L"m:lim",false); - switch(m_enTypeBracketWithIndex) - { - case TypeElement::overbrace: - CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); - break; - case TypeElement::underbrace: - CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); - break; - default: - break; - } +// switch(m_enTypeBracketWithIndex) +// { +// case TypeElement::overbrace: +// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); +// break; +// case TypeElement::underbrace: +// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); +// break; +// default: +// break; +// } + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); pXmlWrite->WriteNodeEnd(L"m:lim",false,false); pXmlWrite->WriteNodeEnd(wsNameNode,false,false); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 38393a1e26..48d66f721e 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -46,11 +46,12 @@ namespace StarMath struct TBaseAttribute { - unsigned int base_font_size = 12; - std::wstring base_font_name = L"Arial"; - unsigned int base_alignment = 1;//(0 - center,1 - left,2 - right) - bool base_font_bold = false; - bool base_font_italic = false; + TBaseAttribute():base_font_size(0),base_alignment(0),base_font_bold(false),base_font_italic(false){}; + unsigned int base_font_size; + std::wstring base_font_name; + unsigned int base_alignment; + bool base_font_bold; + bool base_font_italic; }; class CAttribute @@ -84,11 +85,15 @@ namespace StarMath bool CheckAttribute(); //checking an element for a number from 1 to 9 or from the letter A to F static bool CheckHexPosition(const wchar_t& cToken); + bool CheckingForEmptiness(); + void AddRef(); + void Release(); private: void RefundOfTheAmountRGB(CStarMathReader* pReader,const int& iRed, const int& iGreen, const int& iBlue); std::wstring m_wsColor,m_wsNameFont; bool m_bBold,m_bItal,m_bPhantom,m_bStrike; unsigned int m_iSize,m_iAlignment; + unsigned int m_unCount; }; //Сlass for working with tokens (reading, defining types, passing) class CStarMathReader @@ -109,13 +114,13 @@ namespace StarMath bool EmptyString(); void SetAttribute(CAttribute* pAttribute); CAttribute* GetAttribute(); - void SetBaseAttribute(const TBaseAttribute* pAttribute); + void SetBaseAttribute(const TBaseAttribute& pAttribute); CAttribute* GetBaseAttribute(); //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); - // + //taking a token for a color in hex form std::wstring TakingElementForHex(); - // + //taking a token for a color in rgb form int TakingElementForRGB(); void SetString(const std::wstring& wsToken); void FindingTheEndOfParentheses(); @@ -214,9 +219,9 @@ namespace StarMath static TypeElement GetBinOperator(const std::wstring& wsToken); static void UnaryCheck(CStarMathReader* pReader,CElement* pLastElement); const TypeElement& GetType(); - private: //checking for signs such as -,+,-+,+-. static bool MixedOperators(const TypeElement& enType); + private: void SetAttribute(CAttribute* pAttribute) override; bool IsBinOperatorLowPrior(); void Parse(CStarMathReader* pReader) override; @@ -422,7 +427,9 @@ namespace StarMath class CParserStarMathString { public: - std::vector Parse(std::wstring& wsParseString, const TBaseAttribute* pBaseAttribute = nullptr); + CParserStarMathString(); + ~CParserStarMathString(); + std::vector Parse(std::wstring& wsParseString); static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); @@ -438,7 +445,13 @@ namespace StarMath static void ReadingElementsWithAttributes(CStarMathReader* pReader,CElement*& pSavingElement); void SetAlignment(const unsigned int& iAlignment); const unsigned int& GetAlignment(); + void SetBaseFont(const std::wstring& wsNameFont); + void SetBaseSize(const unsigned int& iSize); + void SetBaseAlignment(const unsigned int& iAlignment); + void SetBaseItalic(const bool& bItal); + void SetBaseBold(const bool& bBold); private: + TBaseAttribute m_stBaseAttribute; std::vector m_arEquation; unsigned int m_iAlignment; }; diff --git a/OdfFile/Reader/Format/math_elements.cpp b/OdfFile/Reader/Format/math_elements.cpp index aa46882f15..0ec2c0ff37 100644 --- a/OdfFile/Reader/Format/math_elements.cpp +++ b/OdfFile/Reader/Format/math_elements.cpp @@ -114,7 +114,13 @@ void math_semantics::oox_convert(oox::math_context & Context) /*parser.set*/ /*?*/ /*converter.set*/ Context.base_alignment_; /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_italic_; /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_bold_; - + + parser.SetBaseFont(Context.base_font_name_); + parser.SetBaseSize(Context.base_font_size_); + parser.SetBaseAlignment(Context.base_alignment_); + parser.SetBaseItalic(Context.base_font_italic_); + parser.SetBaseBold(Context.base_font_bold_); + /*result = */converter.StartConversion(parser.Parse(annotation_text)); Context.output_stream() << converter.GetOOXML(); From 2ab2cb7cf2bfcf6ebd2f63c1f52a5d4ef90b509d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 8 Apr 2024 18:45:59 +0600 Subject: [PATCH 07/88] Fix connections conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 2 +- OOXML/XlsxFormat/Table/Connections.cpp | 61 +++++++++++++++++++++++-- OOXML/XlsxFormat/Table/Connections.h | 1 + 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 68dd8c8386..bdd0eb0e1e 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -712,7 +712,7 @@ namespace OOX { if(i->m_sUri == L"{DE250136-89BD-433C-8126-D09CA5730AF9}") { - ptr->m_EXTCONN15 = i->m_oConnection->toBin(); + ptr->m_EXTCONN15 = i->m_oConnection->toBin15(); } } return XLS::BaseObjectPtr{ptr}; diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index 9230e71979..545002a6eb 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -318,7 +318,12 @@ namespace OOX { auto ptr(new XLSB::RangePr15); if(m_oSourceName.IsInit()) - ptr->irstSourceName = m_oSourceName.get(); + { + auto tempStr = m_oSourceName.get(); + ptr->irstSourceName = tempStr.substr(0, tempStr.size()-2); + } + else + ptr->irstSourceName.setSize(0xFFFFFFFF); return XLS::BaseObjectPtr{ptr}; } EElementType CRangePr::getType() const @@ -378,14 +383,29 @@ namespace OOX { auto ptr1(new XLSB::ECDBPROPS); auto ptr(new XLSB::BeginECDbProps); + ptr1->m_BrtBeginECDbProps = XLS::BaseObjectPtr{ptr}; if(m_oConnection.IsInit()) ptr->stConn = m_oConnection.get(); + else + ptr->stConn = false; if(m_oCommand.IsInit()) ptr->stCmd = m_oCommand.get(); + else + { + ptr->stCmd = false; + ptr->fLoadCmd = false; + } if(m_oServerCommand.IsInit()) ptr->stCmdSvr = m_oServerCommand.get(); + else + { + ptr->fLoadCmdSvr = false; + ptr->stCmdSvr = false; + } if(m_oCommandType.IsInit()) ptr->icmdtype = m_oCommandType.get(); + else + ptr->icmdtype = 0; return XLS::BaseObjectPtr{ptr1}; } EElementType CDbPr::getType() const @@ -491,15 +511,15 @@ namespace OOX if(m_oServerNumberFormat.IsInit()) ptr->fSrvFmtNum = m_oServerNumberFormat.get(); else - ptr->fSrvFmtNum = false; + ptr->fSrvFmtNum = true; if(m_oServerFont.IsInit()) ptr->fSrvFmtFlags = m_oServerFont.get(); else - ptr->fSrvFmtFlags = false; + ptr->fSrvFmtFlags = true; if(m_oServerFontColor.IsInit()) ptr->fSrvFmtFore = m_oServerFontColor.get(); else - ptr->fSrvFmtFore = false; + ptr->fSrvFmtFore = true; return XLS::BaseObjectPtr{ptr1}; } EElementType COlapPr::getType() const @@ -981,6 +1001,31 @@ namespace OOX } } } + XLS::BaseObjectPtr CConnection::toBin15() + { + XLS::BaseObjectPtr objectPtr; + + auto ptr(new XLSB::EXTCONN15); + objectPtr = XLS::BaseObjectPtr{ptr}; + auto ptr1(new XLSB::BeginExtConn15); + ptr1->fAutoDelete = false; + ptr1->fExcludeFromRefreshAll = false; + ptr1->fSandbox = false; + ptr1->fUsedByAddin = false; + if(m_oIdExt.IsInit() && !m_oIdExt.get().empty()) + ptr1->irstId = m_oIdExt.get(); + else + { + ptr1->fSandbox = true; + ptr1->irstId.setSize(0xFFFFFFFF); + } + + ptr->m_BrtBeginExtConn15 = XLS::BaseObjectPtr{ptr1}; + if(m_oRangePr.IsInit()) + ptr->m_source = m_oRangePr->toBin(); + return objectPtr; + + } XLS::BaseObjectPtr CConnection::toBin() { XLS::BaseObjectPtr objectPtr; @@ -1021,12 +1066,16 @@ namespace OOX if(m_oType.IsInit()) ptr1->idbtype = m_oType.get(); + else + ptr1->idbtype = 0; if(m_oName.IsInit()) ptr1->stConnName = m_oName.get(); else ptr1->stConnName = L""; if(m_oId.IsInit()) ptr1->dwConnID = m_oId->GetValue(); + else + ptr1->dwConnID = 1; if(m_oCredentials.IsInit()) ptr1->iCredMethod = m_oCredentials->GetValue(); else @@ -1081,10 +1130,12 @@ namespace OOX ptr1->fRefreshOnLoad = false; if(m_oSaveData.IsInit()) ptr1->fSaveData = m_oSaveData.get(); + else + ptr1->fSaveData = false; if(m_oSavePassword.IsInit()) ptr1->pc = m_oSavePassword.get(); else - ptr1->pc = 0; + ptr1->pc = 2; if(m_oSingleSignOnId.IsInit()) ptr1->stSso = m_oSingleSignOnId.get(); else diff --git a/OOXML/XlsxFormat/Table/Connections.h b/OOXML/XlsxFormat/Table/Connections.h index 00107d26f2..5a903fbb62 100644 --- a/OOXML/XlsxFormat/Table/Connections.h +++ b/OOXML/XlsxFormat/Table/Connections.h @@ -328,6 +328,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBin15(); virtual EElementType getType() const; From f5ca81240b553f28d5defbc497ab16d30abae3a6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 9 Apr 2024 14:13:29 +0600 Subject: [PATCH 08/88] Fix connection conversion --- OOXML/XlsxFormat/Table/Connections.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index 545002a6eb..fe144fc348 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -319,8 +319,7 @@ namespace OOX auto ptr(new XLSB::RangePr15); if(m_oSourceName.IsInit()) { - auto tempStr = m_oSourceName.get(); - ptr->irstSourceName = tempStr.substr(0, tempStr.size()-2); + ptr->irstSourceName = m_oSourceName.get(); } else ptr->irstSourceName.setSize(0xFFFFFFFF); @@ -1053,17 +1052,6 @@ namespace OOX auto ptr1(new XLSB::BeginExtConnection); ptr->m_BrtBeginExtConnection = XLS::BaseObjectPtr{ptr1}; - if(m_oDbPr.IsInit()) - ptr->m_ECDBPROPS = m_oDbPr->toBin(); - if(m_oOlapPr.IsInit()) - ptr->m_ECOLAPPROPS = m_oOlapPr->toBin(); - if(m_oTextPr.IsInit()) - ptr->m_ECTXTWIZ = m_oTextPr->toBin(); - if(m_oWebPr.IsInit()) - ptr->m_ECWEBPROPS = m_oWebPr->toBin(); - if(m_oExtLst.IsInit()) - ptr->m_FRTEXTCONNECTIONS = m_oExtLst->toBinConnections(); - if(m_oType.IsInit()) ptr1->idbtype = m_oType.get(); else @@ -1144,6 +1132,17 @@ namespace OOX ptr1->stDataFile = m_oSourceFile.get(); else ptr1->fLoadSourceDataFile = false; + + if(m_oDbPr.IsInit()) + ptr->m_ECDBPROPS = m_oDbPr->toBin(); + if(m_oOlapPr.IsInit()) + ptr->m_ECOLAPPROPS = m_oOlapPr->toBin(); + if(m_oTextPr.IsInit()) + ptr->m_ECTXTWIZ = m_oTextPr->toBin(); + if(m_oWebPr.IsInit()) + ptr->m_ECWEBPROPS = m_oWebPr->toBin(); + //if(m_oExtLst.IsInit()) + //ptr->m_FRTEXTCONNECTIONS = m_oExtLst->toBinConnections(); } return objectPtr; From 30ae04fd6e632c51f958feccb1f7114c44f613ab Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 9 Apr 2024 20:31:09 +0600 Subject: [PATCH 09/88] Update test files --- .../test/ExampleFiles/xlsb2xlsx/simple1.xlsx | Bin 7310 -> 7309 bytes .../test/ExampleFiles/xlsb2xlsx/simple2.xlsx | Bin 18503 -> 18494 bytes .../test/ExampleFiles/xlsx2xlsb/simple1.xlsb | Bin 4928 -> 4940 bytes .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 17943 -> 18007 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/OOXML/test/ExampleFiles/xlsb2xlsx/simple1.xlsx b/OOXML/test/ExampleFiles/xlsb2xlsx/simple1.xlsx index 6f10ff38a5c0f1f5178ac2415bc6c29d267998b1..173807f5668eef6c2b2b46a63830f5ed0bb40546 100644 GIT binary patch delta 1055 zcmV+)1mOFQIgL3IP)h>@6aWAK00000ApntR&qT2jRsxgG1c|d~0%-!XS_L2v1)h$k z`Y)4z6fOhTb`q1Y6gLAO4Mvmd6f1w>(DDjuW(TN2k!OXbW{!?#J+#^YE5oB&4v$Bp zvtiAI$|J(1c@GAzR)WJ7@}>smB8UOW9A$4Sq3s^+XZbF?(y$#>y3ePV;#Kr?ct_(` zc(vdLEw0>vW1UiaUFBpr`K`{HzbCPpnN6cV5U{4=3L%ASLyo(jVd_X@PHk3{DW}10LPU+Aw^ldvonhv)VnkVZO-K2{)_(q*?NI3fhBXAnR{g4q0 z))G&#L_fvXVd=t=(^}IHMQXkT2UJK?t2l|#LS@8b)L+lnZ|B~FXz3mZWl1Oc7oz2+ z)nI7$Hhp9F3X6X!^Ei-yT5Qohcu`2Z!AT;FNHZTheT#epWlF2FJ}UXr?s`nI_OMR(RR^qS`4*5tYH7NOc+%siVGqT3`BmnNf`UaBqU#%SyQQ*j4L`gAC1m0 z&c~$f=i`gf$?-TX@f$uGIIEz47~Xk2dGYc6Lid*Q zAb*Xf8KRCY#WStb#CPGa&MRT8^PBmtsf(m8K^N0H?2p|hP*dsloe5cy9IA&3)E)6g zoi~DLOG2-yNrnm9+d?wF`J~DqLUAw+OESl)y$h`Uza8rpNkN`97Or1r<$qj^K`))9 zuv)Sf%6=2Cv>>@B8udDOuyE8ODY3Z})Y2di-9NnfFHlPZ1QY-O00;m803iSbJxrOC zLB%2~>wjzhf6~n7`^RE+=sWR-iQ3>5R7D8_y$QDUje?i$)6G2yV(qQ& zf=2}d60DYsXY4fR5pr!Lkuy9gaLn;RN-_?6O+|?4^G_X8uQ|)q$f(UuHz;Ric_-62 z11>X#SX%{YZ7UGlA>x0+LtVE9AA@=A(ep1`9daMijvONAP@NiN1!s%o@u`ZO3i1z{ z*_1S#XYq&RC{N~fh}$V4h=(q(^h|NmSNrFa_B)->ZaC$G8)J;^ZyI@Vb;~bMO927^ z02BZK0000003iU8XwO8m3>xkM1)h$k`Y)6J8$lcdJxrPI0002L0ssIS0000000001 Z000000MQte?id`CcpMN0_Za{H004-o+T;KL delta 1060 zcmV+<1l#+KIgU9JP)h>@6aWAK00000AppAh0KKsiRsyr}0%-!1YXXLo&IAXuUIiQv z1v!;r>@bsm6fOfdwiA=E6gLBpj)s%!6f1wh!14-eW{*&VBF_p<%^V%gdSJByR)$Bl z92^gaXM>svl}Ch2^BxRbtptZF`uXe@|jHGn+<#AYe_!6+#Nvh8%kdvDZlNPl*We z4(T;h?}8bVoE3rr=93>5L;(krWENb1$3AVTnpv)VpCpAs?ZYlW(mZ^k7u>)7LUGT= zdG?H0FKJZhl#bnCA6q{~VuY_CEuw;Om;{f&1V0{fsk8W05E$x_*e#RkQq}qmf#Fb^~e1 z#z$ih8l{stHlG^YWkfJBlrEf7?%bOeWBRt8kEVkyh33h6MK|f94ZdOL8xYPu!3dm& za6e?kg0;j`EYVN#by&J^il_1n4kAX>TyLRr#@ z{)K3{X*C#{y-nZPy~5&O$~+E#q!wFr4_*|~Zg7$aBht*rPTwNmK$+6&tdB~*w0mA6 z3L2MIRvV$*oenyaRkU67n-)W@4=dO|EfYr7iQ<9?1Ot)ZZ4$=5F$u|6X4X_{CgX}8 zoeziS7w2Qr_Ve+@@Z@-$miP@HjdAdtjwWXpr^A!UNxYP21v-cI8_p_!D28_)PhNa{ zztFwqJjh?8X@;m{OYuzWH1S-=VZYw9AYOVGu%4*O%b3Di`&eP=>eB!}vu z0(D2cQRj^y+LF*~YLa1s_O_6WZ$7Cqh)^6%!;;K#YVQJT|8K{7MN*JwjfLx%S@|Cq zW6(=yDXf;Pg|gqoD=kPUu7Y(oSX%{YZRa4iL&X2ULtVE9?}K^n(ep1eTO>K1&~7;8*HH%R)F3Mum5WRT z`G-w4rOiI19XUiknf#PKUGq_0w3$t5!?_nvCdc?yyex4&>4JFZ@O(4J{5@Zee%UTvkMyT0R=ggVeBxI{u@CY-0QQr?f?J)zXAXN8UO$Q e000000RR91007b$lkFHBlXn~t2KX5O0000jvEwiR diff --git a/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx b/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx index 7cf898ccb1827f299b1e4e46ed552d6f71433dcd..0d577fe0801a0567f59413e9c0dcb5275a315407 100644 GIT binary patch delta 2700 zcmY+GcTm&I7RQs&+ci=`NkD=W2_Q{sP)ZCO}wGBa?otq`3h?4cvh5Aj5V$E1EP9Don#1&eV7sdwSFi zDW_NRi+b~fzA1+99qqp*rtb;+OI)s-?&P?Ln0>RB*WGGKce`9`D@w~AzHHBxRIO06UkoxU)tT$R815hGALkXw+l zBk~9O)B6{^xCsvoU8J{ffN#MtN0zYAn!iCziItPai#l8TS~dMcrvGcmd?Eo7L}@;2 z#=*cyoSdwraL8jJgau>tvk{FCjX3r+PO4BVeZo;-!sc+l)4RXliKaTmowJ!nDc4Q; zR(G@p<~X?9+dU1?Pk9v;_;QIAeLYTFGIh9bMn5Oobb`@u-n_FVk0}RY^B( zotaX9nv=uYALhcEkM8d!TnhFpO41rj2zE`7XB8|D9LiIh zR3ctj$!NP8H2J%8iBUV`gJtncmR;cGA)gi&cD6^w&bfTtDaQfgkA0D}Tp58JUT4try;jV!VDcY+YryIH+V~35r zS4dOnyh2gcNYhLMysCc8;OzxW-i>1OGm(*#a9rYT3q(ctg2h3novL2bXxG=(f!9X4 zX@!ZO36=)y$S2eH+7~bdZ%~NkFcYG(wOWVGHG#?bk?QSw=bV%)uI4wsR|nZGHZPrG z*tTEhkg7RHg)!Flib(31+gM=hHu%Tp(zjEp^!YIS+2N9ghyIqcNnOZP6i3d0-OOT5 z7P(xe@~XlW4DI|c!QTh0rxiRV!jn18T*>7z&qdQ9X?=|{0!B_D8Z|Ut{yl%0UveZ^7 zNlANn#pb}c@_Ja$z7tzL=As~##PNQYmBc?2zY@tzVv1tj32A&-{KI~sdg9f{Wami7 z{K0iE?*48f`}5sc5(<78+j4)r4oz53kZw;>`l|v*8ut+0o1id+@wPxC%k&lq3hKt{ zi|16Mw|bMj0(k-q%l$g0MhaSR)oh&x817wW8V5^$zrL#wbq zAt?(RLq4m>+73Bdxqvc(sYF64os&X-fY&rUWOhQXE+-1#LtNUI&C0U_ zU*-Q}>~=^;^8xWo{n&GeC$oB^cui*-W-gvf6Q7iBXtB|xFy9>NN`Mu;Yie>g@gKKr zz9nmHNuHl}Pnfwl$)PUGoHgRV3CS0Qf<;iJLo;4WUhF@mPdLYNx8i73fcnxObJVqV;1TCMX^7gHm15}K4OU6VlC*H5z={AB&mqVwS*d%uRnqs=%iB1Tf4%)>WtP%R}! z*r#4A%k(*`2rZXGuuXkia5U|=HW;2mC8^qPp_+T&KCH4P*MF>_$4DsjJ`RNsg9i%? zbHIH+Y;?>C*gN6xm)J*EORkqW<$pq6N3}JC$hP%yUh)6h{xVu=4q!S|!;c1LUsX$1 zuF#tK!gM1|Sxu*>Tg5?e2HMa&nshr$e->GC|HmB6-0^nu5%e7rnI0B@EKv|%^@;Xl z=)wNqA?X?!JMi+9iR{Sh4+#aS-Xdk&5n)F^KN|Zwp81MtS(UEd=lvxyK*I`9>NJ)i z3|)Sw2jM`0rW|1wM~CFrBg7YmyFT<8$i*GHxKnK`G(n5QVnKPJ)NflA-^wh}RYMwe zD(h{kaWhL8DQfvnwUXHK1-cll?M!}4+{*5|SAx(p%^41Mv0{GXJ#LpGb^0(GO9hQP zqMm%tI$S#8W4XK>KATk=xQ-SQ zVbEOt$a;Z#PbEeC$3z$D-PUI}`OH=U3`>?!eR{;ivHKv4>)0AkVz##4$A{1V|ft&eh~t{oq?hOIWz*8#-bqiH2|{4 z1wi#O3Y-eKU$%y%Tmot@i2)0jp@@I_eR9h>9SC&xw*t|cC!63vhbAk`%!q;US5Dw$ N7&C!DZ?%4{{sSbD(oz5b delta 2690 zcmY*bc|6pM7M~dm#(GI4yTl-jU4t28W*A!{5?P{)u~(MKHnNu{@k5p&mndr(#Eoo~ z^~$bDg^;80c?EgLH4hVYLEH z5Fj7MK~rMmg3z)#$Y7c_`*koN4+{k(I5}yf5C;fw63P!0%5Ve5?B+CXEqd$;}VYd+tD>$bcP9EwyMRyxsHr#YP+1qxjWltEMf;!Q>Pu)5BzfE$0K(snp zTOKxNTTO*0G#CO8A-}Lfw)~~P*l5L_Dlj7PoHg+%DDk%(O6%(z-2|~#j`P(uc4~DW z=?xPfotwIR{gnF0dCF>Y&#m2U9956{OjFN;)ixy3--jiIPU6F536(NQTXV^UA?!(- zd~|yIFbXy?IC*Ro@(k5BF}kbJh%4k?{$_N;c3_@hESt3gBVz!${FkvZ8dFCUo1w+@ zZ{NGLWNnhne$Uh{;`VM*@h*s4&rH8AY@P14i_$#eS!ox9bBSU0)Q>_|PHt%4tRZ^o zO7NaO>QMN+iK-KcSBC!3OCfk=aF@>a-tI4=!x_aX*c=E#~kJQeb63d;a46Pqt8iC0A~=q8inK}N$u~Jy zsaxUl0Kn?CPEcRwVJGmv=r-Zoo)ny~E6_<9)E#kgCZx$-pq1T;PR90MjVW*-bcJc5J zP;^Sml?5T(RHsyy!zrA?SD!x9MuYk0lL9XgLYy87U7IR6VjIN=iO_v{zGQY&R|$ET zDG*w}aKRk!(=&~0xqqyi@YJp&PEIgAkx*tO1J4>;He>QcG6esjQjj!=*JI-clnn$z z@&J5@6Erq$B?x)?G0Rnrot!m6wu>!80ZZAP`W78B!;P-(fvP*L7YCVIcVP~pQ>(A{ z^AI|u2EQub28>WJ^WC1eVo1rG;9O4~>UskjIW{V7Ic4qg6rG#qOnQ-o4sU;~cFxQ9 zYi}Fd2T|u43!e9f2UQP4@mG{D_ZD78nU>epqMr0~oOw>}3h0^3bBJ^NiiKI?V(*WR4Tyu^5@@#y$P!1 zQ{s7AY;tj^7;nAQi^YpNv!|$bc-A7mIO}|I79EI~Om}b~Mv9k`*-8Vsp2zI*f@4ej>g-T=Ok;xRO1f?v>?O z$+|cqv5Fa&Y=3^EtKH0prSlX&nHih;-j3}!`t(6*P2*f%o7DAwH8#DV?I)K$q&Y*V zs>!m5gXL;cU3VE*MV28VTxBw(R^hTjcSnMh#SB^4^BU>Iket3vWyQ>G+q}mOT|HmV z=p;ehZ}~^@1&nGX1ZYI!+}X>*$F8qgw#}^ZeM2bIqxHQ_uB5_kjzXv8k_k&;eu~WFb-MOU$Nv?4s@{{K?qj*sZ={(W);T!GM1lDD>YWI)m*nlSU||$_y_TNGCvx&;|f??|LFGGRQ=Tkv9CTOOu-<~cUBMxP((_RJFL3YxD#FF`tnQ9 z)L44Y@LHHY?i%Yx;yYgI zvGF?hG>yof!dJVpl4Qry3;GZdvY$sh013qpndk8 zo;miEm3mdBNCG%a6;8=`)DIT?aBU|53uauu242{K^yL_)>MK>aD5{Z4oo{7KOZyBI z-w<(EKONs4MPT}UEU9Iun|Mr+8v^KDAiv*UIAgNOzhu*nsfdao zhE~|DmY#0C%1dP;xKqZH0tl&tIuk)XL?|nzz8oQxw6r=uF3v9*f4-;zs<$%K<rn97p&o?q;ro)G<|=@=4FMv4J% z@QUCJ;2Yi*oCP?V*n=~HS`%%t|J?c~*$N8?B>T%)G76xgyne&& diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb index 7a984b15fdefc057f782ac73c254492a73eecb1d..e4aea47f12fc7a989fea2d84be6c156011c04d8b 100644 GIT binary patch delta 1261 zcmX@0c1BGoz?+#xgaHJ63OXZ-^K4gb6mnyptizHtIfA)pav#g8$s#NglTR^w$?1nw z7Ni#2!E|tdbqF`C7ghr5cA6ZhYmDiC3rynTHZypfEYvFy&)fVfseaNz-)lBP8mKHa9$}H#Gi}$j7kJVIChNTaJ)HMzCa) zq?d%&L7jL7KSs7tRy6VNlHF5&}ytun5*LubL7Fv35OC+ z9NBpwac}g_AQrZ8UAhG zmo=yH^7k26Ef)IqCphg8mNaj0oh>0L`oji1ZSks~ z<}SM{;FNJwk0Uc&f?q&rd*?N^z&DJw)r)+4{E|AH{V%>hG2dP_F4wL-ZcnnBd~?&X zRgMV;7k^#Qthj4?_fE6IwS%wh*g_1H4yNs`Iu=))srX#D^AN|91BT1lHBVZ|n1mW8 zYMAGqX?`YDtUlSS`tHJ*D_`fH39e_0F>1XL#afvyEwJ10Vf}-RxqA;D&){Qb`6y_5el)A`kMhGB8X&Bw)%5iY-JI zV-Yl!2ZJUK#8CI+Mikun(=_+ipudN~^dLq(2$d45rLQht86UQ%Wr z!VQo(Ku%NwP|d*f1q2?GF9^zm9dRYvgUcEySO|2zAc~rb$$UZzU^SJ=o)1Bp-xsKc z8%52d$-Y8T;G{Y^TS$uW%j7m8B?Z*9$-p21)dHa|@=dy;ACc2 z)5#(%l9MBu6DRAitdi3YsVqn>wu2eN0W?XGL9zL{ggl5fIgHgpikSgbc1sM?Wi zo1FNA<>EU15Ar9A7};3c&g<~#Cl;LuYkCs5(O^&82}zHGM;sm1jwhXXboSA?ByJVm z$a@W{cI|++csI&|Nno#_~HNm)|xy#I@@@71bqrB+q(GN z+UnfeEPK2Zc}Yi1r%%UEr;SHgLh_lB*TE}_%mV*Kow=3K z19Wp3yAC4@DBw4@ail?6A2|7-EGF)o%zPkOyN|o?Oa{71lyUM)KArk1CFN$V33m@L zs$7wfU~x=R_`v98Z1B;*F*3*D%sJ*@2BygplJkr{8x$BZOcYY~STc3u!pVW>*dqm- znFW?Bd`vf3)$k;;VTP#I5ss&ak2vh;p181g;zPd8j$2PyeQyt&$7f)b(H`?U+cDq5 zHd~Ej#-W$hXR;i`4gaJ&u=emsyjajVkr6G}9>0(886E%7qxMYfVO`gTIj zhUG??o3G2Ba*e%zqUKzEgJy8Y+RzExzeyd*^Z6lPkrSQ&!EV;!hQ@kJ=Si0(-wHo3 zvertNYn{S6x#;U7<`djzXXlvZ8@@lO`03=6nX+Fsz+69?bX#7_#kTv E02R4}wEzGB diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index 6aac6466dfa0cc1bbc50ae378559a2570c8a0888..d05c3eaf06155da1ee11e75d8b634717dabad448 100644 GIT binary patch delta 4118 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 T=V&#hP;lSRS+T`Ks`LK=DSn4% delta 4041 zcmZWs2{=^i8$V}ejBV^=nX!$XF*L?5VGPq`YbtKqWEpO-U}a`^|$a_*fRK$o52I@Q`Te zK#y5beRYbaXmAo8493K_BbPYH72gP&#J&K!SR%-g#(;5gG4K)-0Di*`fcMg&U;{=C z%%bB!j8q7S!$g3q63Pvpl2$O-CUF-yp|=79>1fa=J#gh-V!r zcV>3@C^EYa0WMC3w)l*3+Za-Dju1-qSJgPL`JX#&)ZNz8U8&oKpR}SQl@)Y~x*$E7v}3C8-uM z@LATJC7(P2&yih=>kw*1vXa7rxS{dxKf;_1v=j%~y0oObc8+ zs-8U$AN&POU>Ap+c;Hf^4-#?`u#?%wgBA<5xsy~G7=rv!5F{f6MJ|g^*cBNXZyp>T zU7dH`L*OFM|07JiIHY;EJl(z4w>oW@E>B6SbuDX2@moVz@W3Z4>{U3@lD0Z9rZKJ2 zNX&iBi|&q`%~DcdbBb>EG&K|#ZN?5BwkvhKr?ajuhc{JvHteKkwtcz#rl?)h$5FO) z)PLN;?6Z%4`k1rM=TG&5aN_~xF}I8Um9MW`AM|_eXTkHWw3(Lkb8ubVZoZ;vr2fgQ z&2ITq;KO94-Oi*#k^%cWt&TbO$E|jCzG;?K`OYRK_S~(i$gcB`l?f8#K9tYTrxIii zzptpSHq-pmX`Q#OdGc?ScTdTF@G5Q|J;!f388KO*;rHMYT62}#(a;tR(30#tVtvB< zw(S?^+6zg0x(1qZ=w0~r@X+GQsS9QlI+2R4g2CUi`n<+^d*1BqQ2g`R+2tlU9HkM5 zQ}E*M;%CY-`TLlB`z#NV7E4cBUezLrcABb2t3^HPr>Ib}DLxcF)!oZDGmDKUz{+n^ z@D>%uw6I}Ry?aU~&Od8|M#^a!c_MV@L~B=RjVaVWp)FyTnm}d9G7K3s2ALh>nB#|P zT*+oiSB05Z;JeRtLG8R7y{+B7?Km6RpevFLOG}2HWjc*@FsKm{Xuu}>te#TXm#T1N zoLLrb$$n^0i<|MNRSoB;8EED9Sl#FDaYRaZ#x&Xh{TE=gH? z_lW6U1h4`It)`6NE#t0CIN^e-1#OTM4A(_l7Ey!i)H}pYZgPyTQzvDWSVl_l$;yX2 zo&^VQ_r3IZ9!r4Ab+D39j%7K<7W zD++htLzL^yGe{80NZr*Sz-AD65gbmfLU2l&zmLQn6g~vgPa3=fD;2jHw_?IvAXc2N zUOJh5F%``^YeAKu(O)^WdU4*Q))l6zxtm!=U!nwR>E(B3)&Q|BMoOFCm>SB8;3ZEzaPM>BeV5d!5?Gl^D@B(+SyD~;x7H|aB#9BE!_Ot640uvvppz!Y zyX~LkpW>^KZp4sE*Ac{VY7_)+Ost8ggXLXq}FA*U?-_G60}@S zDPK&{-9o$yci28GP|FKeFBG@TkbbIRm=OQ)`D!=^E79ZX^&K2(OX@Gh18X zgX?mpEYMZrwt5=}BTZ#5aYLddjp` z1F_c~H%nl{dT58jwp%F06Sp$+|H&d$)zOU8r*Kc~)e_@a6BXeG!Kq}cpocfE*QTe_ z50w3XFDm@2c(reyl{xQL|IP<8%DvR2oWhUir{L{7pAZ`x!&m3WjKir>T`JxxB?Z?a zWYLAGv?UHd3U=C)x|XzM z;y}FpLBF+&-%X9RLmUh z%a-ueb0+sDg}O%H9~cItLk1j=3wtZ+J8A+}*hvi?9UJ+5w%D_81a;?_FE^vWdX3&A zhrS~;t$y0+Ycl1GB(F^!&EqO^k`v*B9jcIj`iXU%?yvV^ZjP3OzX&*fGsjA6r$N;I z=@R?)<}WcB@0UqG|Jau8@Y&S4Dt(&Xth3jB>K{5n;0-v?? z##@1pm1cXDcoj`(!L3X=8NKvZnm zmMC*pWTUFNc08+p;_lRx;_o3JC_dQOOp92Drx*DL_x+ugKt{8HMHy{M!_j{3Wc`7};#N?#h4uVS5|NhoO$(VKLmg~dp*M$F$`wU& z;cqcGxk6(Ov%rcVNNxdu%l_)I2FFav?JjBi|LW>iJs)?2V{PI>NS%%}@~v^9k@3sS zg}+M`t#SmQ!ATWf2W~rw671a?9Ya8LI}z5QyvURhka5l8W4-Z0p+xTD z0oz%RB+TeL5khPb=Iw}X!&(418;PpW;!H&OYXg#tG8lJOm@~dWd4#=MG(^U2fws%M zo`(w&z6?TL$a5+KuTOp&Ly$fQZgI>6P~#$s`8zv8Fh=ucMK=d9;bKD)#{8X(AOihG z7*!MCY+?wa=(stDiwVh($VgB~H`5gw`%VN9G3iGL^a~j|_@gl-^QEh?lpQQ+iJQ)I z1y5H|1PlCNVF^U=D3Iu?C#vpAS0bzdF1zZA9-p}qQU5Lj)2=piNi06y7kohw7p!I& zk%UPsJ~)5Gc+(I*AUZ~C8KRixjtZo_hs6*+H;+Xgkx>qwFic27gPJd{HwphS96 Date: Tue, 9 Apr 2024 20:31:24 +0600 Subject: [PATCH 10/88] Add fmla test case --- OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsb | Bin 0 -> 6779 bytes OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsx | Bin 0 -> 9838 bytes OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsb | Bin 0 -> 6779 bytes OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsx | Bin 0 -> 11989 bytes OOXML/test/xlsb2xlsx/conversion.cpp | 83 +++++++++++++++ OOXML/test/xlsx2xlsb/conversion.cpp | 111 ++++++++++++++++++++ 6 files changed, 194 insertions(+) create mode 100644 OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsb create mode 100644 OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsx create mode 100644 OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsb create mode 100644 OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsx diff --git a/OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsb b/OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsb new file mode 100644 index 0000000000000000000000000000000000000000..7126d603d010801152cef2cca44f8b3b7299b7e8 GIT binary patch literal 6779 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 EAAr@*i~s-t literal 0 HcmV?d00001 diff --git a/OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsx b/OOXML/test/ExampleFiles/xlsb2xlsx/fmla.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7a6b0736966edcdb24ad254b1979af63a69335b4 GIT binary patch literal 9838 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 literal 0 HcmV?d00001 diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsb new file mode 100644 index 0000000000000000000000000000000000000000..7126d603d010801152cef2cca44f8b3b7299b7e8 GIT binary patch literal 6779 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 EAAr@*i~s-t literal 0 HcmV?d00001 diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsx b/OOXML/test/ExampleFiles/xlsx2xlsb/fmla.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7e76bb99c99ce7b989f698674fd034afc009bfa3 GIT binary patch literal 11989 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 E0e1zpx&QzG literal 0 HcmV?d00001 diff --git a/OOXML/test/xlsb2xlsx/conversion.cpp b/OOXML/test/xlsb2xlsx/conversion.cpp index 92dd5e9091..f5677e1ffc 100644 --- a/OOXML/test/xlsb2xlsx/conversion.cpp +++ b/OOXML/test/xlsb2xlsx/conversion.cpp @@ -92,8 +92,29 @@ public: static std::wstring tempDir; }; +class FmlaTest : public ::testing::Test +{ +public: + + static void SetUpTestCase() + { + + tempDir = GetWorkDir(); + processTestFile(tempDir, L"fmla.xlsb", L"result.xlsx", L"fmla.xlsx"); + } + + + static void TearDownTestCase() + { + RemoveWorkDir(tempDir); + } + + static std::wstring tempDir; +}; + std::wstring SimpleTests1::tempDir = L""; std::wstring SimpleTests2::tempDir = L""; +std::wstring FmlaTest::tempDir = L""; _UINT32 readFiles(const std::wstring &filePath, const std::wstring &examplePath, std::wstring &fileContent, std::wstring &exampleContent ) { @@ -243,3 +264,65 @@ TEST_F(SimpleTests2, WorksheetsTest) ASSERT_TRUE(boost::algorithm::equals(content1, content2)); } +TEST_F(FmlaTest, ContentTypesTest) +{ + auto tempDir = FmlaTest::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(FmlaTest, WorkbookTest) +{ + auto tempDir = FmlaTest::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(FmlaTest, StylesTest) +{ + auto tempDir = FmlaTest::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(FmlaTest, SharedStringsTest) +{ + auto tempDir = FmlaTest::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(FmlaTest, WorksheetsTest) +{ + auto tempDir = FmlaTest::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} \ No newline at end of file diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index 2b0d8dec0b..64ec2e7a31 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -86,6 +86,25 @@ public: } + static void TearDownTestCase() + { + RemoveWorkDir(tempDir); + } + + static std::wstring tempDir; +}; +class XlsbFmlaTests : public ::testing::Test +{ +public: + + static void SetUpTestCase() + { + + tempDir = GetWorkDir(); + processTestFile(tempDir, L"fmla.xlsx", L"result.xlsb", L"fmla.xlsb"); + } + + static void TearDownTestCase() { RemoveWorkDir(tempDir); @@ -96,6 +115,7 @@ public: std::wstring XlsbSimpleTests1::tempDir = L""; std::wstring XlsbSimpleTests2::tempDir = L""; +std::wstring XlsbFmlaTests::tempDir = L""; _UINT32 readBinaryFiles(const std::wstring &filePath, const std::wstring &examplePath, std::vector &fileContent, std::vector &exampleContent) { @@ -361,4 +381,95 @@ TEST_F(XlsbSimpleTests2, ChartSheetTest) ASSERT_EQ(fileContent, exampleContent); } + +TEST_F(XlsbFmlaTests, ContentTypesTest) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbFmlaTests, WorkbookTest) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbFmlaTests, StylesTest) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbFmlaTests, SharedStringsTest) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbFmlaTests, WorksheetsTest1) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbFmlaTests, WorksheetsTest2) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbFmlaTests, WorksheetsTest3) +{ + auto tempDir = XlsbFmlaTests::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet3.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet3.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + + } \ No newline at end of file From e728a582220fd8fed797144ad62cb280f0052be9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 9 Apr 2024 22:17:25 +0600 Subject: [PATCH 11/88] Fix cond fmt conversion from xlsb to xlsx --- OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 443370e794..6cb4a3d5b0 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -1548,7 +1548,7 @@ bool CConditionalFormattingRule::isValid () const } bool CConditionalFormattingRule::isExtended() { - if (m_oDxf.IsInit()) return true; + //if (m_oDxf.IsInit()) return true; if (m_oDataBar.IsInit()) return m_oDataBar->isExtended(); if (m_oIconSet.IsInit()) return m_oIconSet->isExtended(); @@ -2652,6 +2652,7 @@ void CConditionalFormatting::fromBin(XLS::BaseObjectPtr& obj) for(auto &pCFRULE14: ptr->m_arCFRULE14) m_arrItems.push_back(new CConditionalFormattingRule(pCFRULE14)); } + IsExtended(); } XLS::BaseObjectPtr CConditionalFormatting::toBin() From d733af03aa92735f5ac55adf86d11775c6af9460 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 10 Apr 2024 20:30:26 +0600 Subject: [PATCH 12/88] Fix icon set conversion --- .../Biff_structures/CFVOParsedFormula.cpp | 1 + OOXML/XlsbFormat/Biff12_records/CFVO.cpp | 12 +- .../Worksheets/ConditionalFormatting.cpp | 228 +++++++++++------- .../Worksheets/ConditionalFormatting.h | 2 +- 4 files changed, 159 insertions(+), 84 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFVOParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFVOParsedFormula.cpp index 36de012747..d9a124c749 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFVOParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFVOParsedFormula.cpp @@ -112,6 +112,7 @@ void CFVOParsedFormula::save(CFRecord& record) }; saving(rgce); + cce = size; saving(rgcb); } } diff --git a/OOXML/XlsbFormat/Biff12_records/CFVO.cpp b/OOXML/XlsbFormat/Biff12_records/CFVO.cpp index a21b557c2b..8afa7c8862 100644 --- a/OOXML/XlsbFormat/Biff12_records/CFVO.cpp +++ b/OOXML/XlsbFormat/Biff12_records/CFVO.cpp @@ -62,8 +62,16 @@ namespace XLSB { record << iType << numParam << fSaveGTE << fGTE << cbFmla; - if (cbFmla) - record << formula; + if (cbFmla) + { + auto rdPtr = record.getRdPtr(); + record << formula; + auto size = record.getRdPtr() - rdPtr; + record.RollRdPtrBack(size + 4); + _UINT32 cce = formula.cce; + record << cce; + record.skipNunBytes(size); + } } } // namespace XLSB diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 6cb4a3d5b0..43b98d1981 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -240,18 +240,18 @@ void CConditionalFormatValueObject::fromXML(XmlUtils::CXmlLiteReader& oReader) m_oFormula = oReader; } } -XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() +XLS::BaseObjectPtr CConditionalFormatValueObject::toBin(bool isIcon) { auto ptr(new XLSB::uCFVO); XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::CFVO); ptr->m_BrtCFVO = XLS::BaseObjectPtr{ptr1}; - ptr1->fSaveGTE = 0; + ptr1->fSaveGTE = isIcon; if(m_oGte.IsInit()) ptr1->fGTE = m_oGte->GetValue(); else - ptr1->fGTE = false; + ptr1->fGTE = true; if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Number) ptr1->iType = XLSB::CFVOtype::CFVONUM; else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Minimum) @@ -264,18 +264,20 @@ XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() ptr1->iType = XLSB::CFVOtype::CFVOPERCENTILE; else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Formula) ptr1->iType = XLSB::CFVOtype::CFVOFMLA; + else + ptr1->iType = XLSB::CFVOtype::CFVONUM; - if(m_oVal.IsInit()) + if(m_oVal.IsInit() && ptr1->iType != XLSB::CFVOtype::CFVOFMLA) ptr1->numParam.data.value = std::stod(m_oVal.get()); else if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMIN) ptr1->numParam.data.value = 0; else if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMAX) ptr1->numParam.data.value = 0; - if(m_oFormula.IsInit()) + if(static_cast<_UINT32>(ptr1->iType) == XLSB::CFVOtype::CFVOFMLA && m_oVal.IsInit()) { - ptr1->formula = m_oFormula->m_sText; - ptr1->cbFmla = ptr1->formula.cce; + ptr1->formula = m_oVal.get(); + ptr1->cbFmla = 1; } else { @@ -1150,85 +1152,149 @@ XLS::BaseObjectPtr CIconSet::toBin() auto beginPtr(new XLSB::BeginIconSet); ptr->m_BrtBeginIconSet = XLS::BaseObjectPtr{beginPtr}; if(m_oShowValue.IsInit()) - beginPtr->fIcon = !m_oShowValue->GetValue(); + beginPtr->fIcon = !m_oShowValue->GetValue(); + else + beginPtr->fIcon = false; if(m_oReverse.IsInit()) - beginPtr->fReverse = m_oReverse->GetValue(); + beginPtr->fReverse = m_oReverse->GetValue(); + else + beginPtr->fReverse = false; + if(m_oIconSet.IsInit()) + { + switch (m_oIconSet->GetValue()) + { + case SimpleTypes::Spreadsheet::EIconSetType::NoIcons: + { + beginPtr->iSet.set = KPISets::KPINIL; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Arrows3: + { + beginPtr->iSet.set = KPISets::KPI3ARROWS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Arrows3Gray: + { + beginPtr->iSet.set = KPISets::KPI3ARROWSGRAY; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Flags3: + { + beginPtr->iSet.set = KPISets::KPI3FLAGS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights1: + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS1; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights2: + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS2; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Signs3: + { + beginPtr->iSet.set = KPISets::KPI3SIGNS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Symbols3: + { + beginPtr->iSet.set = KPISets::KPI3SYMBOLS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Symbols3_2: + { + beginPtr->iSet.set = KPISets::KPI3SYMBOLS2; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Arrows4: + { + beginPtr->iSet.set = KPISets::KPI4ARROWS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Arrows4Gray: + { + beginPtr->iSet.set = KPISets::KPI4ARROWSGRAY; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::RedToBlack4: + { + beginPtr->iSet.set = KPISets::KPI4REDTOBLACK; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Rating4: + { + beginPtr->iSet.set = KPISets::KPI4RATING; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Traffic4Lights: + { + beginPtr->iSet.set = KPISets::KPI4TRAFFICLIGHTS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Arrows5: + { + beginPtr->iSet.set = KPISets::KPI5ARROWS; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Arrows5Gray: + { + beginPtr->iSet.set = KPISets::KPI5ARROWSGRAY; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Rating5: + { + beginPtr->iSet.set = KPISets::KPI5RATING; + break; + } + case SimpleTypes::Spreadsheet::EIconSetType::Quarters5: + { + beginPtr->iSet.set = KPISets::KPI5QUARTERS; + break; + } + default: + { + beginPtr->iSet.set = KPISets::KPINIL; + break; + } + } + } + else + { + switch(m_arrValues.size()) + { + case 0: + { + beginPtr->iSet.set = KPISets::KPINIL; + break; + } + case 3: + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS1; + break; + } + case 4: + { + beginPtr->iSet.set = KPISets::KPI4TRAFFICLIGHTS; + break; + } + case 5: + { + beginPtr->iSet.set = KPISets::KPI5QUARTERS; + break; + } + default: + { + beginPtr->iSet.set = KPISets::KPINIL; + break; + } + } - if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::NoIcons) - { - beginPtr->iSet.set = KPISets::KPINIL; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows3) - { - beginPtr->iSet.set = KPISets::KPI3ARROWS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows3Gray) - { - beginPtr->iSet.set = KPISets::KPI3ARROWSGRAY; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Flags3) - { - beginPtr->iSet.set = KPISets::KPI3FLAGS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights1) - { - beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS1; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights2) - { - beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS2; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Signs3) - { - beginPtr->iSet.set = KPISets::KPI3SIGNS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Symbols3) - { - beginPtr->iSet.set = KPISets::KPI3SYMBOLS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Symbols3_2) - { - beginPtr->iSet.set = KPISets::KPI3SYMBOLS2; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows4) - { - beginPtr->iSet.set = KPISets::KPI4ARROWS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows4Gray) - { - beginPtr->iSet.set = KPISets::KPI4ARROWSGRAY; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::RedToBlack4) - { - beginPtr->iSet.set = KPISets::KPI4REDTOBLACK; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Rating4) - { - beginPtr->iSet.set = KPISets::KPI4RATING; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic4Lights) - { - beginPtr->iSet.set = KPISets::KPI4TRAFFICLIGHTS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows5) - { - beginPtr->iSet.set = KPISets::KPI5ARROWS; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows5Gray) - { - beginPtr->iSet.set = KPISets::KPI5ARROWSGRAY; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Rating5) - { - beginPtr->iSet.set = KPISets::KPI5RATING; - } - else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Quarters5) - { - beginPtr->iSet.set = KPISets::KPI5QUARTERS; } for(auto i:m_arrValues) - ptr->m_arCFVO.push_back(i->toBin()); + ptr->m_arCFVO.push_back(i->toBin(true)); return objectPtr; } void CIconSet::ReadAttributes(XLS::BaseObjectPtr& obj) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h index cb0ab73bc6..1918b3aac2 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h @@ -107,7 +107,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); - XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBin(const bool isIcon = false); virtual EElementType getType () const; bool isExtended (); From cb53604c1397298ba416b8366d6d7efcfdd31131 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 15 Apr 2024 19:27:19 +0600 Subject: [PATCH 13/88] Add parsing ptg types method --- .../Logic/Biff_structures/PtgFuncVar.cpp | 10 ++++ .../Format/Logic/Biff_structures/PtgFuncVar.h | 4 ++ .../Logic/Biff_structures/StringPtgParser.cpp | 48 ++++++++++++++++--- .../Logic/Biff_structures/StringPtgParser.h | 1 + OOXML/XlsxFormat/Worksheets/SheetData.cpp | 11 ----- 5 files changed, 57 insertions(+), 17 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp index f0e1c277d6..7e96849731 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp @@ -144,6 +144,16 @@ void PtgFuncVar::setParamsNum(const unsigned char num) } } +const unsigned char PtgFuncVar::getParamsNum() +{ + return cparams; +} + +const bool PtgFuncVar::getFCeFunc() +{ + return fCeFunc; +} + } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h index e1680a9ebd..268f904623 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h @@ -58,6 +58,10 @@ public: void setParamsNum(const unsigned char num); + const unsigned char getParamsNum(); + + const bool getFCeFunc(); + static const unsigned short fixed_id = 0x02; private: unsigned char cparams; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 1f3544d4d8..2340f423c6 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -322,11 +322,14 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if (SyntaxPtg::extract_PtgList(it, itEnd, ptgList, ixti))// Shall be placed strongly before PtgArea and PtgRef { + if((ptgList.rowType == 0x10 || ptgList.rowType == 0x08 || ptgList.rowType == 0x02) + && ptgList.columns == 0x01) + ptgList.type_ = 0x01; rgce.addPtg(found_operand = OperandPtgPtr(new PtgList(ptgList))); } else if (SyntaxPtg::extract_PtgName(it, itEnd, number))// Shall be placed strongly before PtgArea and PtgRef { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgNameX(ixti, number, OperandPtg::ptg_VALUE))); + rgce.addPtg(found_operand = OperandPtgPtr(new PtgNameX(ixti, number, OperandPtg::ptg_REFERENCE))); } else { @@ -335,7 +338,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if(SyntaxPtg::extract_PtgName(it, itEnd, number))// Shall be placed strongly before PtgArea and PtgRef { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgName(number, OperandPtg::ptg_VALUE))); + rgce.addPtg(found_operand = OperandPtgPtr(new PtgName(number, OperandPtg::ptg_REFERENCE))); } else if (SyntaxPtg::extract_PtgList(it, itEnd, ptgList))// Shall be placed strongly before PtgArea and PtgRef { @@ -379,20 +382,20 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R else if(SyntaxPtg::extract_PtgFunc(it, itEnd, operand_str)) { PtgPtr func; - if((func = PtgFunc::create(operand_str, OperandPtg::ptg_VALUE)) || - (func = PtgFuncVar::create(operand_str, OperandPtg::ptg_VALUE))) + if((func = PtgFunc::create(operand_str, OperandPtg::ptg_REFERENCE)) || + (func = PtgFuncVar::create(operand_str, OperandPtg::ptg_REFERENCE))) { ptg_stack.push(func); } else { - func = PtgFuncVar::create(L"USER_DEFINED_FUNCTION", OperandPtg::ptg_VALUE); + func = PtgFuncVar::create(L"USER_DEFINED_FUNCTION", OperandPtg::ptg_REFERENCE); if(!func) { // EXCEPT::LE::WhatIsTheFuck("Ftab_Cetab doesn't contain info about user-defined function (0xFF).", __FUNCTION__); } ptg_stack.push(func); - rgce.addPtg(PtgPtr(new PtgNameX(operand_str, OperandPtg::ptg_VALUE))); + rgce.addPtg(PtgPtr(new PtgNameX(operand_str, OperandPtg::ptg_REFERENCE))); } } else if(SyntaxPtg::extract_UndefinedName(it, itEnd)) // Shall be placed strongly after extract_PtgName @@ -433,9 +436,42 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R return false; } } + //parsePtgTypes(rgce); return true; } +const void StringPtgParser::parsePtgTypes(Rgce& rgce) +{ + PtgVector functionStack; + for(auto i:rgce.sequence) + { + auto ptgId = i->ptg_id; + if(!ptgId.is_initialized()) + continue; + auto untypedId = GETBITS(ptgId.get(), 0, 4); + if(untypedId == 1) + { + auto funcPtr = dynamic_cast(i.get()); + auto paramsNum = funcPtr->getParametersNum(); + for(auto j = 0; j < paramsNum; j++) + { + functionStack.pop_back(); + } + ///check and change fixed num of args + } + else if(untypedId == 2) + { + auto funcPtr = dynamic_cast(i.get()); + auto paramsNum = funcPtr->getParamsNum(); + auto testval = funcPtr->dataType; + for(auto j = 0; j < paramsNum; j++) + { + functionStack.pop_back(); + } + } + functionStack.push_back(i); + } +} } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h index f3e744803d..09adfdbc5e 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h @@ -45,6 +45,7 @@ public: const bool parseToPtgs(const std::wstring& assembled_formula, Rgce& rgce, RgbExtra& rgb, const std::wstring & tag_name); private: + const void parsePtgTypes(Rgce& rgce); PtgStack ptg_stack; }; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 76225939f1..e24490613a 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1119,17 +1119,6 @@ namespace OOX { auto formula = dynamic_cast(obj.get()); formula->formula = m_sText; - for(auto i:formula->formula.rgce.sequence) - { - if(i->ptg_id.get() == 37) - { - i->ptg_id = 101; - } - if(i->ptg_id.get() == 36) - { - i->ptg_id = 100; - } - } if(m_oAca.IsInit()) { formula->fAlwaysCalc = m_oAca->GetValue(); From 2901f337e7e505a9155f3ae690b0df6187a634aa Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 16 Apr 2024 15:15:37 +0400 Subject: [PATCH 14/88] Add some functionality to libvlc player --- Common/3dParty/libvlc/vlcplayer.cpp | 11 +++++++++++ Common/3dParty/libvlc/vlcplayer.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/Common/3dParty/libvlc/vlcplayer.cpp b/Common/3dParty/libvlc/vlcplayer.cpp index c46a3f2bb8..d6addf4f9e 100644 --- a/Common/3dParty/libvlc/vlcplayer.cpp +++ b/Common/3dParty/libvlc/vlcplayer.cpp @@ -97,9 +97,20 @@ void CVlcPlayer::setTime(qint64 nTime) libvlc_media_player_set_time(m_pVlcPlayer, nTime); } +qint64 CVlcPlayer::time() +{ + return libvlc_media_player_get_time(m_pVlcPlayer); +} + void CVlcPlayer::setPosition(float fPos) { libvlc_media_player_set_position(m_pVlcPlayer, fPos); + emit positionChanged(libvlc_media_player_get_position(m_pVlcPlayer)); +} + +float CVlcPlayer::position() +{ + return libvlc_media_player_get_position(m_pVlcPlayer); } bool CVlcPlayer::isAudio() diff --git a/Common/3dParty/libvlc/vlcplayer.h b/Common/3dParty/libvlc/vlcplayer.h index 1158d51787..c0563ce858 100644 --- a/Common/3dParty/libvlc/vlcplayer.h +++ b/Common/3dParty/libvlc/vlcplayer.h @@ -24,12 +24,19 @@ public: public: void integrateIntoWidget(QWidget* pWidget); void open(CVlcMedia* pMedia); + // control playback void pause(); void play(); void stop(); + // volume void setVolume(int nVolume); + // time (in ms) void setTime(qint64 nTime); + qint64 time(); + // position (in range 0.0...1.0) void setPosition(float fPos); + float position(); + bool isAudio(); bool isPlaying(); libvlc_state_t getState(); From 6778a4c0da22d6a9ac85ba465ec00c20c7b51ffc Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 16 Apr 2024 18:17:49 +0600 Subject: [PATCH 15/88] Add operators check in pthtypesParsing --- .../Logic/Biff_structures/StringPtgParser.cpp | 71 ++++++++++++++----- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 2340f423c6..77ad8ffd46 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -440,37 +440,72 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R return true; } +void SetPtgType(unsigned short &ptgId, const char type) +{ + if(ptgId > 31) + SETBITS(ptgId,5,6,type); +} const void StringPtgParser::parsePtgTypes(Rgce& rgce) { PtgVector functionStack; for(auto i:rgce.sequence) { - auto ptgId = i->ptg_id; - if(!ptgId.is_initialized()) + if(!i->ptg_id.is_initialized()) continue; - auto untypedId = GETBITS(ptgId.get(), 0, 4); - if(untypedId == 1) + auto ptgId = i->ptg_id.get(); + + auto untypedId = GETBITS(ptgId, 0, 4); + if(ptgId > 21) { - auto funcPtr = dynamic_cast(i.get()); - auto paramsNum = funcPtr->getParametersNum(); - for(auto j = 0; j < paramsNum; j++) + if(untypedId == 1) { - functionStack.pop_back(); + auto funcPtr = dynamic_cast(i.get()); + auto paramsNum = funcPtr->getParametersNum(); + for(auto j = 0; j < paramsNum; j++) + { + functionStack.pop_back(); + } + ///check and change fixed num of args } - ///check and change fixed num of args + else if(untypedId == 2) + { + auto funcPtr = dynamic_cast(i.get()); + auto paramsNum = funcPtr->getParamsNum(); + for(auto j = 0; j < paramsNum; j++) + { + functionStack.pop_back(); + } + } + functionStack.push_back(i); } - else if(untypedId == 2) + else if(ptgId > 1 && ptgId < 15) { - auto funcPtr = dynamic_cast(i.get()); - auto paramsNum = funcPtr->getParamsNum(); - auto testval = funcPtr->dataType; - for(auto j = 0; j < paramsNum; j++) - { - functionStack.pop_back(); - } + SetPtgType(functionStack.back()->ptg_id.get(), 2); + functionStack.pop_back(); + SetPtgType(functionStack.back()->ptg_id.get(), 2); } - functionStack.push_back(i); + else if(ptgId > 14 && ptgId < 18) + { + SetPtgType(functionStack.back()->ptg_id.get(), 1); + functionStack.pop_back(); + SetPtgType(functionStack.back()->ptg_id.get(), 1); + } + else if(ptgId > 17 && ptgId < 21) + { + SetPtgType(functionStack.back()->ptg_id.get(), 2); + } + else if(ptgId == 21) + { + continue; + } + else + { + functionStack.push_back(i); + } + } + auto exit = 1; + exit++; } From a94a0682022d722558c72993def2d021f235b4ff Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 18 Apr 2024 17:58:50 +0600 Subject: [PATCH 16/88] Fix cell error conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index e24490613a..66e1742fb7 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -2078,6 +2078,40 @@ namespace OOX pSource = error; } } + else if (m_oValue->m_sText == L"#VALUE!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x0F; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x0F; + oCell = &error->cell; + pSource = error; + } + } + else + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x0F; + oCell = &error->cell; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x0F; + oCell = &error->cell; + pSource = error; + } + } } break; case SimpleTypes::Spreadsheet::celltypeBool: From 31090af4406528128da8e98b226063b1710b5416 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 22 Apr 2024 16:32:40 +0600 Subject: [PATCH 17/88] Fix array formula conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 198e6e9443..08be4c9305 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1859,7 +1859,7 @@ namespace OOX { if(checkArrayCell(sourceCellRef, sharedFormulas)) { - if(!m_oFormula.IsInit()) + if(!m_oFormula.IsInit() || m_oFormula->m_sText.empty()) { m_oFormula.Init(); m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeArray; From eb1bc2779bea991336f5cd2c05075983a20b978d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 24 Apr 2024 18:35:38 +0600 Subject: [PATCH 18/88] Fix formula types conversion --- .../Logic/Biff_structures/CFParsedFormula.cpp | 5 + .../Format/Logic/Biff_structures/PtgFunc.cpp | 4 + .../Format/Logic/Biff_structures/PtgFunc.h | 2 + .../Logic/Biff_structures/PtgFuncVar.cpp | 5 + .../Format/Logic/Biff_structures/PtgFuncVar.h | 2 + .../Logic/Biff_structures/StringPtgParser.cpp | 111 ++++++++++++++++-- .../Logic/Biff_structures/StringPtgParser.h | 1 + OOXML/XlsxFormat/Worksheets/SheetData.cpp | 15 ++- 8 files changed, 131 insertions(+), 14 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp index c64c045e87..b9074b5586 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp @@ -43,6 +43,11 @@ CFParsedFormula::CFParsedFormula(const CellRef& cell_base_ref) : ParsedFormula(c CFParsedFormula& CFParsedFormula::operator=(const std::wstring& value) { parseStringFormula(value, L"CFParsedFormulaNoCCE"); + auto ptgType = GETBITS(rgce.sequence.back()->getPtgId(),5,6); + if(ptgType == 1) + { + SETBITS(rgce.sequence.back()->ptg_id.get(),5,6,2); + } return *this; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.cpp index ae940a2ec0..336b550962 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.cpp @@ -103,6 +103,10 @@ const int PtgFunc::getParametersNum() const return iftab.getParamsNum(); } +const unsigned short PtgFunc::getFuncIndex() const +{ + return iftab.getIndex(); +} } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.h index 88762941bb..5bf52a2e64 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFunc.h @@ -57,6 +57,8 @@ public: const int getParametersNum() const; + const unsigned short getFuncIndex() const; + static const unsigned short fixed_id = 0x01; private: Ftab_Cetab iftab; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp index 7e96849731..0621177851 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.cpp @@ -154,6 +154,11 @@ const bool PtgFuncVar::getFCeFunc() return fCeFunc; } +const unsigned short PtgFuncVar::getFuncIndex() const +{ + return tab.getIndex(); +} + } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h index 268f904623..b349e8d251 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgFuncVar.h @@ -62,6 +62,8 @@ public: const bool getFCeFunc(); + const unsigned short getFuncIndex() const; + static const unsigned short fixed_id = 0x02; private: unsigned char cparams; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 77ad8ffd46..0776da1e2a 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -363,11 +363,11 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R { if(L"SharedParsedFormula" == tag_name || L"CFParsedFormulaNoCCE" == tag_name) { - found_operand = OperandPtgPtr(new PtgRefN(operand_str, OperandPtg::ptg_VALUE, rgce.getLocation())); + found_operand = OperandPtgPtr(new PtgRefN(operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation())); } else { - found_operand = OperandPtgPtr(new PtgRef(operand_str, OperandPtg::ptg_VALUE)); + found_operand = OperandPtgPtr(new PtgRef(operand_str, OperandPtg::ptg_REFERENCE)); } rgce.addPtg(found_operand); } @@ -436,7 +436,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R return false; } } - //parsePtgTypes(rgce); + parsePtgTypes(rgce); return true; } @@ -461,8 +461,10 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) { auto funcPtr = dynamic_cast(i.get()); auto paramsNum = funcPtr->getParametersNum(); - for(auto j = 0; j < paramsNum; j++) - { + auto refArgs = PosValArgs(funcPtr->getFuncIndex()); + for(auto j = paramsNum-1; j >= 0; j--) + { if(refArgs.size() > j && refArgs.at(j)) + SetPtgType(functionStack.back()->ptg_id.get(), 3); functionStack.pop_back(); } ///check and change fixed num of args @@ -471,8 +473,11 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) { auto funcPtr = dynamic_cast(i.get()); auto paramsNum = funcPtr->getParamsNum(); - for(auto j = 0; j < paramsNum; j++) + auto refArgs = PosValArgs(funcPtr->getFuncIndex()); + for(auto j = paramsNum-1; j >= 0; j--) { + if(refArgs.size() > j && refArgs.at(j)) + SetPtgType(functionStack.back()->ptg_id.get(), 3); functionStack.pop_back(); } } @@ -480,9 +485,9 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) } else if(ptgId > 1 && ptgId < 15) { - SetPtgType(functionStack.back()->ptg_id.get(), 2); + SetPtgType(functionStack.back()->ptg_id.get(), 3); functionStack.pop_back(); - SetPtgType(functionStack.back()->ptg_id.get(), 2); + SetPtgType(functionStack.back()->ptg_id.get(), 3); } else if(ptgId > 14 && ptgId < 18) { @@ -492,7 +497,7 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) } else if(ptgId > 17 && ptgId < 21) { - SetPtgType(functionStack.back()->ptg_id.get(), 2); + SetPtgType(functionStack.back()->ptg_id.get(), 3); } else if(ptgId == 21) { @@ -504,10 +509,94 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) } } - auto exit = 1; - exit++; } +std::vector StringPtgParser::PosValArgs(const unsigned int &index) const +{ + std::vector argVector; + switch(index) + { + case 0x0001: case 0x0002: case 0x0003: case 0x000F: case 0x000B: + case 0x0010: case 0x0011: case 0x0012: case 0x0014: case 0x0015: case 0x0016: case 0x0017: case 0x0018: case 0x001A: case 0x001C: + case 0x0020: case 0x0021: case 0x0026: case 0x0036: + case 0x0040: case 0x0043: case 0x0044: case 0x0045: case 0x0047: case 0x0048: case 0x0049: case 0x004F: + case 0x0051: case 0x0053: case 0x0054: case 0x0056: case 0x0057: case 0x0058: + case 0x0060: case 0x0062: case 0x0063: case 0x0064: case 0x006F: + case 0x0070: case 0x0071: case 0x0072: case 0x0076: case 0x0079: case 0x007B:case 0x007D: case 0x007E:case 0x007F: + case 0x0080: case 0x0081: case 0x0085: case 0x0086: case 0x0087: case 0x008C: case 0x008D: + case 0x0096: case 0x0097: case 0x009D: + case 0x00A2: case 0x00A3: case 0x00A4: case 0x00AC: + case 0x00B1: case 0x00B3: case 0x00B4: case 0x00B5: case 0x00B8: case 0x00B9: case 0x00BA: case 0x00BE: + case 0x00C0: case 0x00C6: case 0x00C8: case 0x00C9: + case 0x00D6: case 0x00D7: + case 0x00E0: case 0x00E2: case 0x00E5: case 0x00E6: case 0x00E7: case 0x00E8: case 0x00E9: case 0x00EA: case 0x00ED: + case 0x00F4: case 0x00F8: case 0x00FB: case 0x00FE: + case 0x0100: case 0x0101: case 0x0105: case 0x0106: case 0x0107: case 0x010F: + case 0x0117: case 0x011B: case 0x011C: + case 0x0126: case 0x0128: case 0x012A: + case 0x0156: case 0x0157: case 0x0158: + case 0x0160: + case 0x0170: case 0x0171: case 0x0172: case 0x0173: case 0x0174: case 0x0175: case 0x0176: case 0x0177: case 0x0178: case 0x0179: case 0x017A: case 0x017C: + case 0x01DF: + case 0x01E0: + argVector.push_back(true); + break; + case 0x000D: case 0x001B: case 0x001E: case 0x0027: case 0x0030: case 0x0046: case 0x005B: case 0x005D: + case 0x0061: case 0x0067: case 0x006B: case 0x006D: case 0x0073: case 0x0074: case 0x0075: + case 0x0084: case 0x0088: case 0x0089: case 0x008A: case 0x008B: case 0x0093: case 0x0094: case 0x00A5: case 0x00AF: + case 0x00B0: case 0x00B2: case 0x00BB: case 0x00BC: case 0x00C5: case 0x00CC: + case 0x00D0: case 0x00D1: case 0x00D4: case 0x00D5: case 0x00EF: case 0x00FD: case 0x0102: case 0x0108: case 0x010C: + case 0x0112: case 0x0113: case 0x0114: case 0x011D: case 0x0120: case 0x012B: case 0x012F: + case 0x0130: case 0x0131: case 0x0132: case 0x0133: case 0x0134: case 0x0136: case 0x0137: case 0x013A: case 0x013B: + case 0x014C: case 0x0151: case 0x0153: case 0x015C: case 0x0161: case 0x0162: case 0x0165: case 0x0167: + argVector.push_back(true); + argVector.push_back(true); + break; + case 0x000E: case 0x001F: case 0x0041: case 0x0042: case 0x0052: case 0x007A: case 0x007C: case 0x008E: case 0x0091: + case 0x009E: case 0x00A0: case 0x00CD: case 0x00CE: case 0x00D2: case 0x00D3: case 0x00DC: case 0x0103: case 0x0104: + case 0x0109: case 0x010A: case 0x010B: case 0x0115: case 0x0116: case 0x0118: case 0x0119: case 0x011A: case 0x011F: + case 0x0122: case 0x0123: case 0x0124: case 0x0127: case 0x0129: case 0x012C: case 0x012D: + case 0x0135: case 0x014F: case 0x0154: case 0x015F: case 0x017E: + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + break; + case 0x006E: case 0x0077: case 0x0078: case 0x008F: case 0x009F: case 0x00AB: case 0x00B6: case 0x00CF: case 0x00F2: case 0x00F3: + case 0x0111: case 0x011E: case 0x0121: case 0x0125: case 0x012E: case 0x013C: case 0x013D: case 0x014E: case 0x0155: case 0x015E: + case 0x0163: case 0x017F: case 0x01DD: + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + break; + case 0x0038: case 0x0039: case 0x003A: case 0x003B: case 0x0090: case 0x009A: case 0x009B: case 0x009C: case 0x00DB: + case 0x00F6: case 0x00F7: case 0x010E: case 0x0110: case 0x0164: + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + break; + case 0x001D: + argVector.push_back(false); + argVector.push_back(true); + argVector.push_back(true); + argVector.push_back(true); + case 0x0159: case 0x0145: case 0x0146: case 0x0147: case 0x0148: + argVector.push_back(false); + argVector.push_back(true); + break; + case 0x0066: case 0x0065: + argVector.push_back(true); + argVector.push_back(false); + argVector.push_back(false); + argVector.push_back(true); + break; + default: + break; + } + return argVector; +} } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h index 09adfdbc5e..190d78c576 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.h @@ -46,6 +46,7 @@ public: private: const void parsePtgTypes(Rgce& rgce); + std::vector PosValArgs(const unsigned int &index)const; PtgStack ptg_stack; }; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 08be4c9305..9eed8a6d50 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1121,7 +1121,12 @@ namespace OOX { auto formula = dynamic_cast(obj.get()); formula->formula = m_sText; - + if(!formula->formula.rgce.sequence.empty()) + { + auto lastValType = GETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6); + if(lastValType == 1) + SETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6,2); + } } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeShared: @@ -1143,8 +1148,12 @@ namespace OOX } if(m_oRef.IsInit()) formula->rfx = m_oRef.get(); - - + if(!formula->formula.rgce.sequence.empty()) + { + auto lastValType = GETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6); + if(lastValType == 1) + SETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6,2); + } } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeDataTable: From 2fa4cdebb9266a1626fd8f07f3bf2b97ab450a47 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 25 Apr 2024 21:35:11 +0600 Subject: [PATCH 19/88] Fix table conversion --- .../Logic/Biff_structures/StringPtgParser.cpp | 31 +++++++++++-------- .../Logic/Biff_structures/SyntaxPtg.cpp | 2 ++ OOXML/XlsxFormat/Worksheets/SheetData.cpp | 18 ++++++++++- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 0776da1e2a..980924d3fc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -342,9 +342,6 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if (SyntaxPtg::extract_PtgList(it, itEnd, ptgList))// Shall be placed strongly before PtgArea and PtgRef { - if((ptgList.rowType == 0x10 || ptgList.rowType == 0x08 || ptgList.rowType == 0x02) - && ptgList.columns == 0x01) - ptgList.type_ = 0x01; rgce.addPtg(found_operand = OperandPtgPtr(new PtgList(ptgList))); } else if(SyntaxPtg::extract_PtgArea(it, itEnd, operand_str)) // Sequence is important (in pair with PtgRef) @@ -440,11 +437,19 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R return true; } -void SetPtgType(unsigned short &ptgId, const char type) +void SetPtgType(PtgPtr ptg, const char type) { - if(ptgId > 31) - SETBITS(ptgId,5,6,type); + if(ptg->ptg_id.get() > 0x1F && ptg->ptg_id.get() <= 0x7D ) + { + SETBITS(ptg->ptg_id.get(),5,6,type); + } + else if(ptg->ptg_id.get() == 0x1918) + { + auto list = static_cast(ptg.get()); + list->type_ = type - 1; + } } + const void StringPtgParser::parsePtgTypes(Rgce& rgce) { PtgVector functionStack; @@ -464,7 +469,7 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) auto refArgs = PosValArgs(funcPtr->getFuncIndex()); for(auto j = paramsNum-1; j >= 0; j--) { if(refArgs.size() > j && refArgs.at(j)) - SetPtgType(functionStack.back()->ptg_id.get(), 3); + SetPtgType(functionStack.back(), 3); functionStack.pop_back(); } ///check and change fixed num of args @@ -477,7 +482,7 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) for(auto j = paramsNum-1; j >= 0; j--) { if(refArgs.size() > j && refArgs.at(j)) - SetPtgType(functionStack.back()->ptg_id.get(), 3); + SetPtgType(functionStack.back(), 3); functionStack.pop_back(); } } @@ -485,19 +490,19 @@ const void StringPtgParser::parsePtgTypes(Rgce& rgce) } else if(ptgId > 1 && ptgId < 15) { - SetPtgType(functionStack.back()->ptg_id.get(), 3); + SetPtgType(functionStack.back(), 3); functionStack.pop_back(); - SetPtgType(functionStack.back()->ptg_id.get(), 3); + SetPtgType(functionStack.back(), 3); } else if(ptgId > 14 && ptgId < 18) { - SetPtgType(functionStack.back()->ptg_id.get(), 1); + SetPtgType(functionStack.back(), 1); functionStack.pop_back(); - SetPtgType(functionStack.back()->ptg_id.get(), 1); + SetPtgType(functionStack.back(), 1); } else if(ptgId > 17 && ptgId < 21) { - SetPtgType(functionStack.back()->ptg_id.get(), 3); + SetPtgType(functionStack.back(), 3); } else if(ptgId == 21) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index f24f5e7ad2..fe99f26850 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -629,12 +629,14 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: else if(boost::regex_search(first, last, results_1, reg_inside_table4)) { _UINT16 indexColumn = -1; + ptgList.rowType = 0x00; auto insider = boost::algorithm::erase_all_copy(results_1.str(0), L"\n"); if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { ptgList.columns = 0x01; ptgList.colFirst = indexColumn; + ptgList.colLast = ptgList.colFirst; first = results_1[0].second; return true; } diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 9eed8a6d50..d0da1cf9dd 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -66,6 +66,7 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.h" #include #include @@ -1124,8 +1125,15 @@ namespace OOX if(!formula->formula.rgce.sequence.empty()) { auto lastValType = GETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6); - if(lastValType == 1) + if(lastValType == 1 || lastValType == 3) + { SETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6,2); + } + else if(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get() == 6424) + { + auto list = static_cast(formula->formula.rgce.sequence.rbegin()->get()); + list->type_ = 1; + } } } break; @@ -1152,7 +1160,15 @@ namespace OOX { auto lastValType = GETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6); if(lastValType == 1) + { SETBITS(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get(),5,6,2); + } + else if(formula->formula.rgce.sequence.rbegin()->get()->ptg_id.get() == 6424) + { + auto list = static_cast(formula->formula.rgce.sequence.rbegin()->get()); + list->type_ = 1; + } + } } break; From 3acb44a5c907d6587adfcf34c15c6974df4ac172 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 26 Apr 2024 17:08:50 +0300 Subject: [PATCH 20/88] Fixed drop in assessment. fix bugs. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 30 ++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 4 +- .../StarMath2OOXML/cstarmathpars.cpp | 157 ++++++++++++------ .../Converter/StarMath2OOXML/cstarmathpars.h | 9 +- 4 files changed, 143 insertions(+), 57 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index f87f79e7e4..a993e8d7a7 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -1304,6 +1304,36 @@ TEST(SMConvectorTest,UnarySignWithColor) EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } +TEST(SMConvectorTest,rSubrSup) +{ + std::wstring wsString = L"2 rSub 20 1 rSup 28"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"220128"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,DifferentRegisters) +{ + std::wstring wsString = L"2 OvEr 10 unION 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"210\x22C35"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Quotes) +{ + std::wstring wsString = L"\"2 + 3\" over 10 2 \"+\" 5 over 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2 + 3102+53"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + //TEST(SMConvectorTest,AttributeMatrix) //{ // std::wstring wsString = L""; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 721cb59104..b62b20c5bb 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -327,9 +327,7 @@ namespace StarMath { StandartProperties(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false); pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); - pXmlWrite->WriteNodeBegin(L"m:e",false); - pValueGrade->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pValueGrade,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:d",false,false); } void CConversionSMtoOOXML::WriteCtrlPrNode(XmlUtils::CXmlWriter *pXmlWrite, CAttribute *pAttribute) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index f31356253c..c948512b5c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -257,6 +257,18 @@ namespace StarMath { m_stBaseAttribute.base_font_italic = bItal; } + std::wstring CParserStarMathString::ConvertToLowerCase(const std::wstring& wsToken) + { + if(!wsToken.empty() && wsToken[0] == L'%') + return wsToken; + std::wstring wsLowerCase; + for(wchar_t cOneElement:wsToken) + wsLowerCase+= std::tolower(cOneElement); + if(wsLowerCase.empty()) + return wsToken; + else + return wsLowerCase; + } //class methods CAttribute CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(0),m_unCount(0) { @@ -511,7 +523,7 @@ namespace StarMath case TypeElement::size: { std::wstring wsSize = pReader->GetElement(); - pReader->SetString(wsSize); + pReader->TokenProcessing(wsSize); int iTemp; if(CElementString::GetDigit(wsSize) != TypeElement::undefine) iTemp = std::stoi(wsSize); @@ -527,12 +539,12 @@ namespace StarMath } case TypeElement::font: { - pReader->SetString(pReader->GetElement()); - if(pReader->GetString() == L"sans") + pReader->TokenProcessing(); + if(pReader->GetLowerCaseString() == L"sans") m_wsNameFont = L"Liberation Sans"; - else if(pReader->GetString() == L"serif") + else if(pReader->GetLowerCaseString() == L"serif") m_wsNameFont = L"Liberation Serif"; - else if(pReader->GetString() == L"fixed") + else if(pReader->GetLowerCaseString() == L"fixed") m_wsNameFont = L"Liberation Mono"; else return false; @@ -624,7 +636,7 @@ namespace StarMath wsSum += std::to_wstring(iGreen); if(iBlue != -1) wsSum += std::to_wstring(iBlue); - pReader->SetString(wsSum); + pReader->TokenProcessing(wsSum); } bool CAttribute::CheckingForEmptiness() { @@ -668,7 +680,7 @@ namespace StarMath { switch (pReader->GetGlobalType()) { case TypeElement::String: - return new CElementString(pReader->GetString()); + return new CElementString(pReader->GetOriginalString()); case TypeElement::BinOperator: return new CElementBinOperator(pReader->GetLocalType()); case TypeElement::SetOperations: @@ -680,7 +692,7 @@ namespace StarMath if(pReader->GetLocalType() == TypeElement::func) { pReader->GetToken(); - return new CElementFunction(pReader->GetLocalType(),pReader->GetString()); + return new CElementFunction(pReader->GetLocalType(),pReader->GetLowerCaseString()); } else return new CElementFunction(pReader->GetLocalType()); @@ -692,7 +704,7 @@ namespace StarMath if(pReader->GetLocalType() == TypeElement::oper) { pReader->GetToken(); - return new CElementOperator(pReader->GetLocalType(),pReader->GetString()); + return new CElementOperator(pReader->GetLocalType(),pReader->GetLowerCaseString()); } else return new CElementOperator(pReader->GetLocalType()); @@ -760,17 +772,33 @@ namespace StarMath m_wsString = wsTokenString; } void CElementString::Parse(CStarMathReader* pReader) - { + { + if(m_wsString == L"\"") + { + m_wsString.clear(); + wchar_t wsOneToken = pReader->GetOneElement(); + while(wsOneToken !=L'"') + { + m_wsString+=wsOneToken; + if(pReader->CheckIteratorPosition()) + wsOneToken = pReader->GetOneElement(); + else + break; + } + } pReader->ClearReader(); } void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { + if(m_wsString !=L"" && m_wsString!=L" ") + { pXmlWrite->WriteNodeBegin(L"m:r",false); CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); pXmlWrite->WriteString(m_wsString); pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } } std::wstring CElementString::GetString() { @@ -1984,6 +2012,8 @@ namespace StarMath TypeElement CElementIndex::GetIndex(const std::wstring &wsCheckToken) { if(L"^" == wsCheckToken) return TypeElement::upper; + else if(L"rsup" == wsCheckToken) return TypeElement::upper; + else if(L"rsub" == wsCheckToken) return TypeElement::lower; else if(L"_" == wsCheckToken) return TypeElement::lower; else if(L"lsup" == wsCheckToken) return TypeElement::lsup; else if(L"lsub" == wsCheckToken) return TypeElement::lsub; @@ -2604,134 +2634,142 @@ namespace StarMath { if(CheckIteratorPosition()) { - m_wsToken = GetElement(); - TypeElement enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); - if(enTypeFont != TypeElement::undefine || L"color" == m_wsToken) + TokenProcessing(); + TypeElement enTypeFont = CAttribute::GetTypeFontAttribute(m_wsLowerCaseToken); + if(enTypeFont != TypeElement::undefine || L"color" == m_wsLowerCaseToken) m_pAttribute = new CAttribute(); - while((enTypeFont != TypeElement::undefine || L"color" == m_wsToken) && m_itStart != m_itEnd) + while((enTypeFont != TypeElement::undefine || L"color" == m_wsLowerCaseToken) && m_itStart != m_itEnd) { - if(L"color" == m_wsToken) + if(L"color" == m_wsLowerCaseToken) { - m_wsToken = GetElement(); - if(m_pAttribute->ParseColorAttribute(m_wsToken,this)) - m_wsToken.clear(); + TokenProcessing(); + if(m_pAttribute->ParseColorAttribute(m_wsLowerCaseToken,this)) + m_wsLowerCaseToken.clear(); } else if(enTypeFont != TypeElement::undefine) if(m_pAttribute->ParseFontAttribute(enTypeFont,this)) - m_wsToken.clear(); + m_wsLowerCaseToken.clear(); else - enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); - if((m_itStart != m_itEnd) && m_wsToken.empty()) + enTypeFont = CAttribute::GetTypeFontAttribute(m_wsLowerCaseToken); + if((m_itStart != m_itEnd) && m_wsLowerCaseToken.empty()) { - m_wsToken = GetElement(); - enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); + TokenProcessing(); + enTypeFont = CAttribute::GetTypeFontAttribute(m_wsLowerCaseToken); } } if(m_pAttribute != nullptr && !m_pAttribute->CheckAttribute()) m_pAttribute = nullptr; - if(m_wsToken == L"left") m_wsToken = GetElement(); - else if(L"right" == m_wsToken ) m_wsToken = GetElement(); + if(m_wsLowerCaseToken == L"left") TokenProcessing(); + else if(L"right" == m_wsLowerCaseToken ) TokenProcessing(); } //std::wcout< m_stBracket; @@ -450,6 +452,7 @@ namespace StarMath void SetBaseAlignment(const unsigned int& iAlignment); void SetBaseItalic(const bool& bItal); void SetBaseBold(const bool& bBold); + static std::wstring ConvertToLowerCase(const std::wstring& wsToken); private: TBaseAttribute m_stBaseAttribute; std::vector m_arEquation; From 33fdfadcf770862e95e0359baa544acc47f796c5 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 2 May 2024 11:33:28 +0300 Subject: [PATCH 21/88] fix bug #66679 --- .../Binary/Presentation/BinaryFileReaderWriter.h | 1 + OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp | 15 +++++---------- OOXML/Binary/Sheets/Reader/ChartFromToBinary.h | 7 +++---- OOXML/PPTXFormat/Logic/SmartArt.cpp | 1 - 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h index 3c52744369..5a14f63d26 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h @@ -535,6 +535,7 @@ namespace NSBinPptxRW _INT32 m_nCountCharts = 1; _INT32 m_nCountDiagram = 1; _INT32 m_nCountActiveX = 1; + _INT32 m_nThemeOverrideCount = 1; BinDocxRW::CDocxSerializer* m_pMainDocument; int m_nDocumentType; diff --git a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp index d3c8a75654..c076daa70b 100644 --- a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp +++ b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp @@ -47,16 +47,10 @@ using namespace OOX::Spreadsheet; namespace BinXlsxRW { - SaveParams::SaveParams(const std::wstring& _sDrawingsPath, const std::wstring& _sEmbeddingsPath, const std::wstring& _sThemePath, OOX::CContentTypes* _pContentTypes, CSVWriter* _pCSVWriter, bool bMacro) + SaveParams::SaveParams(const std::wstring& _sDrawingsPath, const std::wstring& _sEmbeddingsPath, const std::wstring& _sThemePath, OOX::CContentTypes* _pContentTypes, CSVWriter* _pCSVWriter, bool bMacro) : + bMacroEnabled(bMacro), pContentTypes(_pContentTypes), sThemePath(_sThemePath), + sDrawingsPath(_sDrawingsPath), sEmbeddingsPath(_sEmbeddingsPath), pCSVWriter(_pCSVWriter) { - bMacroEnabled = bMacro; - pContentTypes = _pContentTypes; - sThemePath = _sThemePath; - sDrawingsPath = _sDrawingsPath; - sEmbeddingsPath = _sEmbeddingsPath; - - nThemeOverrideCount = 1; - pCSVWriter = _pCSVWriter; } const BYTE c_oserct_extlstEXT = 0; @@ -1134,7 +1128,7 @@ namespace BinXlsxRW } else if (c_oserct_chartspaceTHEMEOVERRIDE == type) { - std::wstring sThemeOverrideName = L"themeOverride" + std::to_wstring(m_oSaveParams.nThemeOverrideCount++) + L".xml"; + std::wstring sThemeOverrideName = L"themeOverride" + std::to_wstring(m_oBufferedStream.m_nThemeOverrideCount++) + L".xml"; std::wstring sThemeOverrideRelsPath = L"../theme/" + sThemeOverrideName; OOX::CPath pathThemeOverrideFile = m_oSaveParams.sThemePath + FILE_SEPARATOR_STR + sThemeOverrideName; @@ -7393,6 +7387,7 @@ namespace BinXlsxRW int nCurPos = m_oBcw.WriteItemStart(c_oserct_chartspaceCHART); WriteCT_Chart(*oVal.m_chart); m_oBcw.WriteItemEnd(nCurPos); + } if (oVal.m_spPr.IsInit()) { diff --git a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.h b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.h index d6cd9a31e2..153a433054 100644 --- a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.h +++ b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.h @@ -99,14 +99,13 @@ namespace BinXlsxRW { struct SaveParams { - SaveParams (const std::wstring& _sDrawingsPath, const std::wstring& _sEmbeddingsPath, const std::wstring& _sThemePath, OOX::CContentTypes *pContentTypes, CSVWriter* pCSVWriter = NULL, bool bMacro = false); + SaveParams(const std::wstring& _sDrawingsPath, const std::wstring& _sEmbeddingsPath, const std::wstring& _sThemePath, OOX::CContentTypes *pContentTypes, CSVWriter* pCSVWriter = NULL, bool bMacro = false); smart_ptr pTheme; std::wstring sThemePath; std::wstring sDrawingsPath; std::wstring sEmbeddingsPath; OOX::CContentTypes* pContentTypes = NULL; - int nThemeOverrideCount = 0; CSVWriter* pCSVWriter = NULL; bool bMacroEnabled = false; }; @@ -114,9 +113,9 @@ namespace BinXlsxRW class BinaryChartReader : public Binary_CommonReader { NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter; - SaveParams& m_oSaveParams; + SaveParams& m_oSaveParams; public: - BinaryChartReader (NSBinPptxRW::CBinaryFileReader& oBufferedStream, SaveParams& oSaveParams, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter); + BinaryChartReader (NSBinPptxRW::CBinaryFileReader& oBufferedStream, SaveParams& oSaveParams, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter); int ReadCT_ChartFile (long length, OOX::Spreadsheet::CChartFile* poResult); int ReadCT_ChartExFile (long length, OOX::Spreadsheet::CChartExFile* poResult); diff --git a/OOXML/PPTXFormat/Logic/SmartArt.cpp b/OOXML/PPTXFormat/Logic/SmartArt.cpp index 528bd9f1ba..ca86553690 100644 --- a/OOXML/PPTXFormat/Logic/SmartArt.cpp +++ b/OOXML/PPTXFormat/Logic/SmartArt.cpp @@ -650,7 +650,6 @@ namespace PPTX pWriter->StartRecord(/*c_oserct_chartspaceTHEMEOVERRIDE = */15); pThemeOverride->toPPTY(pWriter); pWriter->EndRecord(); - break; } else if (OOX::FileTypes::ChartStyle == container[i]->type()) { From 25b33244a40ad5d2e959aad3faa690f098afaeca Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 2 May 2024 15:57:47 +0300 Subject: [PATCH 22/88] fix bug #67011 --- .../Records/Drawing/ShapeContainer.cpp | 5 ++++ OOXML/PPTXFormat/Logic/Pic.cpp | 27 ++++++++++++++++++- OOXML/PPTXFormat/Logic/Timing/CTn.cpp | 1 + OOXML/PPTXFormat/Slide.cpp | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp index ba8932f0f3..46cb8ddbb4 100644 --- a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp +++ b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp @@ -553,7 +553,12 @@ void CPPTElement::SetUpProperty(CElementPtr pElement, CTheme* pTheme, CSlideInfo bool bUsebRecolorFillAsPictures = (0x40 == (0x40 & flag2)); if (bUsebFilled) + { pElement->m_bIsFilled = bFilled; + if (pElement->m_oBrush.Type == c_BrushTypeNotSet) + pElement->m_oBrush.Type = c_BrushTypeSolid; + } + break; } diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 225dc85395..65b40dfdd6 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -896,8 +896,33 @@ namespace PPTX { if (oleObject.IsInit() && oleObject->isValid()) { + int _id = nvPicPr.cNvPr.id; + if (_id <= 0) + { + _id = pWriter->m_lObjectId; + ++pWriter->m_lObjectId; + } + else + { + if (pWriter->m_lObjectId <= (unsigned int)_id) + { + pWriter->m_lObjectId = _id + 1; + } + } + bOle = true; - pWriter->WriteString(L""); + pWriter->WriteString(L""); + pWriter->WriteString(L"WriteString(L" name=\"" + nvPicPr.cNvPr.name + L"\""); + pWriter->WriteString(L"/>"); + pWriter->WriteString(L""); + pWriter->WriteString(L""); + pWriter->WriteString(L""); + //pWriter->WriteString(L""); + //pWriter->WriteString(L""); + //pWriter->WriteString(L""); + pWriter->WriteString(L""); if (spPr.xfrm.IsInit()) { std::wstring oldName = spPr.xfrm->node_name; diff --git a/OOXML/PPTXFormat/Logic/Timing/CTn.cpp b/OOXML/PPTXFormat/Logic/Timing/CTn.cpp index b71c4abf38..ec49fdc9aa 100644 --- a/OOXML/PPTXFormat/Logic/Timing/CTn.cpp +++ b/OOXML/PPTXFormat/Logic/Timing/CTn.cpp @@ -138,6 +138,7 @@ namespace PPTX pWriter->WriteAttribute(L"grpId", grpId); pWriter->WriteAttribute(L"afterEffect", afterEffect); pWriter->WriteAttribute(L"nodeType", nodeType); + pWriter->WriteAttribute(L"nodePh", nodePh); pWriter->EndAttributes(); if (stCondLst.IsInit()) diff --git a/OOXML/PPTXFormat/Slide.cpp b/OOXML/PPTXFormat/Slide.cpp index 1c7723b0f2..0765cc6041 100644 --- a/OOXML/PPTXFormat/Slide.cpp +++ b/OOXML/PPTXFormat/Slide.cpp @@ -200,6 +200,7 @@ namespace PPTX pWriter->WriteAttribute(L"xmlns:p", PPTX::g_Namespaces.p.m_strLink); pWriter->WriteAttribute(L"xmlns:m", PPTX::g_Namespaces.m.m_strLink); pWriter->WriteAttribute(L"xmlns:w", PPTX::g_Namespaces.w.m_strLink); + pWriter->WriteAttribute(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006"); pWriter->WriteAttribute(L"showMasterPhAnim", showMasterPhAnim); pWriter->WriteAttribute(L"showMasterSp", showMasterSp); From 23c54255e3bd4aa77066681e2a5e3c7611b65148 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 3 May 2024 13:55:29 +0600 Subject: [PATCH 23/88] Fix ptg conversion --- .../Biff_structures/ListParsedFormula.cpp | 27 +++ .../Logic/Biff_structures/SyntaxPtg.cpp | 20 +-- OOXML/XlsxFormat/Table/Tables.cpp | 162 +++++++++--------- 3 files changed, 114 insertions(+), 95 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp index 24d9e81130..675f3c8943 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp @@ -31,6 +31,7 @@ */ #include "ListParsedFormula.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.h" namespace XLS { @@ -42,6 +43,19 @@ ListParsedFormula::ListParsedFormula() : ParsedFormula(CellRef()) ListParsedFormula& ListParsedFormula::operator=(const std::wstring& value) { ParsedFormula::operator = (value); + if(!rgce.sequence.empty()) + { + auto lastValType = GETBITS(rgce.sequence.rbegin()->get()->ptg_id.get(),5,6); + if(lastValType == 1 || lastValType == 3) + { + SETBITS(rgce.sequence.rbegin()->get()->ptg_id.get(),5,6,2); + } + else if(rgce.sequence.rbegin()->get()->ptg_id.get() == 6424) + { + auto list = static_cast(rgce.sequence.rbegin()->get()); + list->type_ = 1; + } + } return *this; } @@ -127,6 +141,19 @@ ListParsedArrayFormula::ListParsedArrayFormula() : ArrayParsedFormula(false, Cel ListParsedArrayFormula& ListParsedArrayFormula::operator=(const std::wstring& value) { ArrayParsedFormula::operator = (value); + if(!rgce.sequence.empty()) + { + auto lastValType = GETBITS(rgce.sequence.rbegin()->get()->ptg_id.get(),5,6); + if(lastValType == 1 || lastValType == 3) + { + SETBITS(rgce.sequence.rbegin()->get()->ptg_id.get(),5,6,2); + } + else if(rgce.sequence.rbegin()->get()->ptg_id.get() == 6424) + { + auto list = static_cast(rgce.sequence.rbegin()->get()); + list->type_ = 1; + } + } return *this; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index fe99f26850..bbad79043b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -484,7 +484,6 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: insider = results_1.str(0); - insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (insider == L"[#Data]") { if (boost::regex_search(first, last, results_1, reg_inside_table2)) @@ -534,8 +533,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: if (boost::regex_search(first, last, results_1, reg_inside_table3)) { - insider = results_1.str(0); - insider = boost::algorithm::erase_all_copy(insider, L"\n"); + insider = results_1.str(0); if (!insider.empty() && insider[0] != '[') insider.erase(0, 1); @@ -547,12 +545,12 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: if (ptgList.colFirst == 65535) { ptgList.columns = 0x01; - ptgList.colFirst = indexColumn; + ptgList.colFirst = indexColumn; + ptgList.colLast = indexColumn; if (boost::regex_search(first, last, results_1, reg_inside_table3)) { - insider = results_1.str(0); - insider = boost::algorithm::erase_all_copy(insider, L"\n"); + insider = results_1.str(0); if (!insider.empty() && insider[0] != '[') insider.erase(0, 1); @@ -566,8 +564,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: } else if(boost::regex_search(first, last, results_1, reg_inside_table5)) { - insider = results_1.str(0); - insider = boost::algorithm::erase_all_copy(insider, L"\n"); + insider = results_1.str(0); insider = boost::algorithm::erase_first_copy(insider, L":"); if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) @@ -588,8 +585,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: else if(boost::regex_search(first, last, results_1, reg_inside_table5)) { insider = results_1.str(0); - insider = boost::algorithm::erase_first_copy(insider, L","); - insider = boost::algorithm::erase_all_copy(insider, L"\n"); + insider = boost::algorithm::erase_first_copy(insider, L","); if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { @@ -597,6 +593,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: { ptgList.columns = 0x01; ptgList.colFirst = indexColumn; + ptgList.colLast = indexColumn; } } first = results_1[0].second; @@ -622,6 +619,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: { ptgList.columns = 0x01; ptgList.colFirst = 0; + ptgList.colLast = 0; first = results_1[0].second; } return true; @@ -630,7 +628,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: { _UINT16 indexColumn = -1; ptgList.rowType = 0x00; - auto insider = boost::algorithm::erase_all_copy(results_1.str(0), L"\n"); + auto insider = results_1.str(0); if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index b278fd6203..c7cbe495aa 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -275,84 +275,81 @@ namespace Spreadsheet { auto ptr(new XLSB::LISTCOL); XLS::BaseObjectPtr objectPtr(ptr); - if(m_oDataCellStyle.IsInit() || m_oTotalsRowDxfId.IsInit() || m_oHeaderRowCellStyle.IsInit() || m_oHeaderRowDxfId.IsInit() - || m_oTotalsRowCellStyle.IsInit()|| m_oDataDxfId.IsInit() || m_oId.IsInit() || m_oName.IsInit() || m_oQueryTableFieldId.IsInit() - || m_oTotalsRowLabel.IsInit() || m_oUniqueName.IsInit() || m_oTotalsRowFunction.IsInit() ) - { - auto ptr1(new XLSB::BeginListCol); - ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; - if(m_oDataCellStyle.IsInit()) - ptr1->stStyleInsertRow = m_oDataCellStyle.get(); - else - ptr1->stStyleInsertRow = 0xFFFFFFFF; - if(m_oTotalsRowDxfId.IsInit()) - ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); - else - ptr1->nDxfInsertRow = 0xFFFFFFFF; - if(m_oHeaderRowDxfId.IsInit()) - ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); - else - ptr1->stStyleHeader = 0xFFFFFFFF; - if(m_oHeaderRowDxfId.IsInit()) - ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); - else - ptr1->nDxfHdr = 0xFFFFFFFF; - if(m_oTotalsRowCellStyle.IsInit()) - ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); - else - ptr1->stStyleAgg = 0xFFFFFFFF; + auto ptr1(new XLSB::BeginListCol); + ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleInsertRow = m_oDataCellStyle.get(); + else + ptr1->stStyleInsertRow.setSize(0xFFFFFFFF); + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfInsertRow = 0xFFFFFFFF; - if(m_oDataDxfId.IsInit()) - ptr1->nDxfAgg = m_oDataDxfId->GetValue(); - else - ptr1->nDxfAgg = 0xFFFFFFFF; - if(m_oId.IsInit()) - ptr1->idField = m_oId->GetValue(); - else - ptr1->idField = 0; + if(m_oHeaderRowDxfId.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader.setSize(0xFFFFFFFF); + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHdr = 0xFFFFFFFF; + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg.setSize(0xFFFFFFFF); - if(m_oName.IsInit()) - ptr1->stCaption = m_oName.get(); - else - ptr1->stCaption = 0xFFFFFFFF; - if(m_oQueryTableFieldId.IsInit()) - ptr1->idqsif = m_oQueryTableFieldId->GetValue(); - else - ptr1->idqsif = 0; + if(m_oDataDxfId.IsInit()) + ptr1->nDxfAgg = m_oDataDxfId->GetValue(); + else + ptr1->nDxfAgg = 0xFFFFFFFF; + if(m_oId.IsInit()) + ptr1->idField = m_oId->GetValue(); + else + ptr1->idField = 0; - if(m_oTotalsRowLabel.IsInit()) - ptr1->stTotal = m_oTotalsRowLabel.get(); - else - ptr1->stTotal = 0xFFFFFFFF; + if(m_oName.IsInit()) + ptr1->stCaption = m_oName.get(); + else + ptr1->stCaption.setSize(0xFFFFFFFF); + if(m_oQueryTableFieldId.IsInit()) + ptr1->idqsif = m_oQueryTableFieldId->GetValue(); + else + ptr1->idqsif = 0; - if(m_oUniqueName.IsInit()) - ptr1->stName = m_oUniqueName.get(); - else - ptr1->stName = 0xFFFFFFFF; - if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_AVERAGE; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCount) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNT; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCountNums) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNTNUMS; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMax) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MAX; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMin) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MIN; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionSum) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_SUM; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionStdDev) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_STDDEV; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionVar) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; - else + if(m_oTotalsRowLabel.IsInit()) + ptr1->stTotal = m_oTotalsRowLabel.get(); + else + ptr1->stTotal.setSize(0xFFFFFFFF); + + if(m_oUniqueName.IsInit()) + ptr1->stName = m_oUniqueName.get(); + else + ptr1->stName.setSize(0xFFFFFFFF); + if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; - } + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_AVERAGE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCount) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNT; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCountNums) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNTNUMS; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMax) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MAX; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMin) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MIN; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionSum) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_SUM; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionStdDev) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_STDDEV; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionVar) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; + else + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; + if(m_oCalculatedColumnFormula.IsInit()) { auto fmla(new XLSB::ListCCFmla); @@ -502,11 +499,8 @@ namespace Spreadsheet { auto ptr(new XLSB::LISTCOLS); XLS::BaseObjectPtr objectPtr(ptr); - auto ptr1(new XLSB::BeginListCols); - ptr1->nCols = m_arrItems.size(); - ptr->m_BrtBeginListCols = XLS::BaseObjectPtr{ptr1}; - for(auto i:m_arrItems) - ptr->m_arLISTCOL.push_back(i->toBin()); + for(auto i:m_arrItems) + ptr->m_arLISTCOL.push_back(i->toBin()); return objectPtr; } void CTableColumns::ReadAttributes(std::vector& obj) @@ -624,7 +618,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") { if(i->m_oName.IsInit()) { - i->m_oName = boost::algorithm::erase_all_copy(i->m_oName.get(), L"_x000a_"); + i->m_oName = boost::algorithm::replace_all_copy(i->m_oName.get(), L"_x000a_", L"\n"); std::unordered_map>::iterator pFind = XLS::GlobalWorkbookInfo::mapTableColumnNames_static.find(m_oId->GetValue()); if (pFind != XLS::GlobalWorkbookInfo::mapTableColumnNames_static.end()) { @@ -679,7 +673,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") else if(m_oDisplayName.IsInit()) ptr1->stName = m_oDisplayName.get(); else - ptr1->stName = 0xFFFFFFFF; + ptr1->stName.setSize(0xFFFFFFFF); if(m_oTotalsRowCount.IsInit()) ptr1->crwTotals = m_oTotalsRowCount->GetValue(); else @@ -693,7 +687,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oDisplayName.IsInit()) ptr1->stDisplayName = m_oDisplayName.get(); else - ptr1->stDisplayName = 0xFFFFFFFF; + ptr1->stDisplayName.setSize(0xFFFFFFFF); if(m_oTableBorderDxfId.IsInit()) ptr1->nDxfBorder = m_oTableBorderDxfId->GetValue(); @@ -703,7 +697,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oComment.IsInit()) ptr1->stComment = m_oComment.get(); else - ptr1->stComment = 0xFFFFFFFF; + ptr1->stComment.setSize(0xFFFFFFFF); if(m_oConnectionId.IsInit()) ptr1->dwConnID = m_oConnectionId->GetValue(); @@ -718,7 +712,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oDataCellStyle.IsInit()) ptr1->stStyleData = m_oDataCellStyle.get(); else - ptr1->stStyleData = 0xFFFFFFFF; + ptr1->stStyleData.setSize(0xFFFFFFFF); if(m_oHeaderRowBorderDxfId.IsInit()) ptr1->nDxfHeaderBorder = m_oHeaderRowBorderDxfId->GetValue(); @@ -728,7 +722,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oHeaderRowCellStyle.IsInit()) ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); else - ptr1->stStyleHeader = 0xFFFFFFFF; + ptr1->stStyleHeader.setSize(0xFFFFFFFF); if(m_oHeaderRowDxfId.IsInit()) ptr1->nDxfHeader = m_oHeaderRowDxfId->GetValue(); @@ -770,7 +764,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oTotalsRowCellStyle.IsInit()) ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); else - ptr1->stStyleAgg = 0xFFFFFFFF; + ptr1->stStyleAgg.setSize(0xFFFFFFFF); if(m_oTotalsRowDxfId.IsInit()) ptr1->nDxfAgg = m_oTotalsRowDxfId->GetValue(); From a6d9af576dbed3ad2ef346ab81ceb4ee515de0c7 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 3 May 2024 12:38:06 +0300 Subject: [PATCH 24/88] . --- OOXML/Binary/Document/BinReader/Readers.cpp | 15 +++++++++++++++ .../BinWriter/BinReaderWriterDefines.h | 5 ++++- OOXML/Binary/Document/BinWriter/BinWriters.cpp | 18 ++++++++++++++++++ OOXML/DocxFormat/Logic/SectionProperty.h | 8 ++++---- OdfFile/Reader/Format/chart_build_oox.cpp | 6 +++--- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/OOXML/Binary/Document/BinReader/Readers.cpp b/OOXML/Binary/Document/BinReader/Readers.cpp index fda1072622..53f19b99a8 100644 --- a/OOXML/Binary/Document/BinReader/Readers.cpp +++ b/OOXML/Binary/Document/BinReader/Readers.cpp @@ -1877,6 +1877,21 @@ int Binary_pPrReader::Read_pageNumType(BYTE type, long length, void* poResult) pCPageNumber->m_oStart.Init(); pCPageNumber->m_oStart->SetValue(m_oBufferedStream.GetLong()); } + else if (c_oSerProp_secPrPageNumType::fmt == type) + { + pCPageNumber->m_oFmt.Init(); + pCPageNumber->m_oFmt->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else if (c_oSerProp_secPrPageNumType::chapStyle == type) + { + pCPageNumber->m_oChapStyle.Init(); + pCPageNumber->m_oChapStyle->SetValue(m_oBufferedStream.GetLong()); + } + else if (c_oSerProp_secPrPageNumType::chapSep == type) + { + pCPageNumber->m_oChapSep.Init(); + pCPageNumber->m_oChapSep->SetValueFromByte(m_oBufferedStream.GetUChar()); + } else res = c_oSerConstants::ReadUnknown; return res; diff --git a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h index ba1246ee42..e3966154be 100644 --- a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h +++ b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h @@ -487,7 +487,10 @@ extern int g_nCurFormatVersion; };} namespace c_oSerProp_secPrPageNumType{enum c_oSerProp_secPrPageNumType { - start = 0 + start = 0, + fmt = 1, + chapStyle = 2, + chapSep = 3 };} namespace c_oSerProp_secPrLineNumType{enum c_oSerProp_secPrLineNumType { diff --git a/OOXML/Binary/Document/BinWriter/BinWriters.cpp b/OOXML/Binary/Document/BinWriter/BinWriters.cpp index e4f0b698e4..035a051f71 100644 --- a/OOXML/Binary/Document/BinWriter/BinWriters.cpp +++ b/OOXML/Binary/Document/BinWriter/BinWriters.cpp @@ -1671,6 +1671,24 @@ void Binary_pPrWriter::WritePageNumType(const ComplexTypes::Word::CPageNumber& p m_oBcw.m_oStream.WriteLONG(pPageNumber.m_oStart->GetValue()); m_oBcw.WriteItemEnd(nCurPos); } + if (pPageNumber.m_oFmt.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrPageNumType::fmt); + m_oBcw.m_oStream.WriteBYTE(pPageNumber.m_oFmt->GetValue()); + m_oBcw.WriteItemEnd(nCurPos); + } + if (pPageNumber.m_oChapStyle.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrPageNumType::chapStyle); + m_oBcw.m_oStream.WriteLONG(pPageNumber.m_oChapStyle->GetValue()); + m_oBcw.WriteItemEnd(nCurPos); + } + if (pPageNumber.m_oChapSep.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerProp_secPrPageNumType::chapSep); + m_oBcw.m_oStream.WriteBYTE(pPageNumber.m_oChapSep->GetValue()); + m_oBcw.WriteItemEnd(nCurPos); + } } void Binary_pPrWriter::WriteLineNumType(const ComplexTypes::Word::CLineNumber& pLineNumber) { diff --git a/OOXML/DocxFormat/Logic/SectionProperty.h b/OOXML/DocxFormat/Logic/SectionProperty.h index 2d2fdeb8dc..ef2907f7c2 100644 --- a/OOXML/DocxFormat/Logic/SectionProperty.h +++ b/OOXML/DocxFormat/Logic/SectionProperty.h @@ -281,10 +281,10 @@ namespace ComplexTypes void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); public: - nullable m_oChapSep; - nullable m_oChapStyle; - nullable m_oFmt; - nullable m_oStart; + nullable m_oChapSep; + nullable m_oChapStyle; + nullable m_oFmt; + nullable m_oStart; }; //-------------------------------------------------------------------------------- diff --git a/OdfFile/Reader/Format/chart_build_oox.cpp b/OdfFile/Reader/Format/chart_build_oox.cpp index 0b72a70e1b..e8bbb55a74 100644 --- a/OdfFile/Reader/Format/chart_build_oox.cpp +++ b/OdfFile/Reader/Format/chart_build_oox.cpp @@ -209,7 +209,7 @@ void object_odf_context::xlsx_convert(oox::xlsx_conversion_context & Context) Context.get_math_context().base_font_bold_ = baseFontBold_; Context.get_math_context().start(); - office_math_->oox_convert(Context.get_math_context()); + office_math_->oox_convert(Context.get_math_context(), 1); } else if(object_type_ == 4 && office_spreadsheet_) { @@ -261,7 +261,7 @@ void object_odf_context::docx_convert(oox::docx_conversion_context & Context) Context.get_math_context().base_font_bold_ = baseFontBold_; Context.start_math_formula(); - office_math_->oox_convert(Context.get_math_context(),2); + office_math_->oox_convert(Context.get_math_context(), 2); Context.end_math_formula(); Context.get_drawing_context().get_text_stream_frame() = temp_stream.str(); @@ -307,7 +307,7 @@ void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context) Context.get_math_context().base_font_bold_ = baseFontBold_; Context.get_math_context().start(); - office_math_->oox_convert(Context.get_math_context(),1); + office_math_->oox_convert(Context.get_math_context(), 1); } else if(object_type_ == 4 && office_spreadsheet_) { From 95d8fd287109167514b8831c0eeab0d3fb62acf9 Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 3 May 2024 13:17:41 +0300 Subject: [PATCH 25/88] Fix bug #67767 --- Common/3dParty/html/css/src/CCompiledStyle.cpp | 3 +-- Common/3dParty/html/css/src/CCssCalculator_Private.cpp | 8 ++++++++ Common/3dParty/html/css/src/StyleProperties.cpp | 9 +++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Common/3dParty/html/css/src/CCompiledStyle.cpp b/Common/3dParty/html/css/src/CCompiledStyle.cpp index 7e63f251d1..8504f7ee07 100644 --- a/Common/3dParty/html/css/src/CCompiledStyle.cpp +++ b/Common/3dParty/html/css/src/CCompiledStyle.cpp @@ -110,7 +110,7 @@ namespace NSCSS void CCompiledStyle::AddStyle(const std::map& mStyle, const unsigned int unLevel, const bool& bHardMode) { const bool bIsThereBorder = (m_oBorder.Empty()) ? false : true; - const double dFontSize = (!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Twips) : DEFAULT_FONT_SIZE; + const double dFontSize = (!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Point) : DEFAULT_FONT_SIZE; for (std::pair pPropertie : mStyle) { @@ -180,7 +180,6 @@ namespace NSCSS break; m_oMargin.SetTop(pPropertie.second, unLevel, bHardMode); - m_oMargin.UpdateTop(dFontSize); break; } CASE(L"margin-right"): diff --git a/Common/3dParty/html/css/src/CCssCalculator_Private.cpp b/Common/3dParty/html/css/src/CCssCalculator_Private.cpp index 62b93c88a7..085e945bc2 100644 --- a/Common/3dParty/html/css/src/CCssCalculator_Private.cpp +++ b/Common/3dParty/html/css/src/CCssCalculator_Private.cpp @@ -564,6 +564,14 @@ namespace NSCSS if (!bIsSettings) { + std::map, CCompiledStyle*>::const_iterator itFound = std::find_if(m_mUsedStyles.begin(), m_mUsedStyles.end(), [oStyle](const std::pair, CCompiledStyle*>& oValue){ return (*oValue.second) == oStyle; }); + + if (m_mUsedStyles.end() != itFound) + { + oStyle = *itFound->second; + return true; + } + oStyle.SetID(arSelectors.back().m_wsName + ((!arSelectors.back().m_wsClass.empty()) ? L'.' + arSelectors.back().m_wsClass : L"") + ((arSelectors.back().m_wsId.empty()) ? L"" : L'#' + arSelectors.back().m_wsId) + L'-' + std::to_wstring(++m_nCountNodes)); CCompiledStyle *pTemp = new CCompiledStyle(oStyle); diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 42a1c973d6..4b1aa1f659 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -374,7 +374,7 @@ namespace NSCSS bool CDigit::SetValue(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { - if (wsValue.empty() || (CHECK_CONDITIONS && !bHardMode)) + if (wsValue.empty() || (CHECK_CONDITIONS && !bHardMode) || unLevel < m_unLevel) return false; std::wstring wsNewValue = wsValue; @@ -404,7 +404,12 @@ namespace NSCSS m_enUnitMeasure = oValue.m_enUnitMeasure; } else if (NSCSS::Percent == oValue.m_enUnitMeasure) - m_oValue *= oValue.m_oValue / 100.; + { + if (m_unLevel == oValue.m_unLevel) + m_oValue = oValue.m_oValue; + else + m_oValue *= oValue.m_oValue / 100.; + } else m_oValue = oValue.ToDouble(m_enUnitMeasure); From 234c1766dce097d91134ee65d288f1642f33c57e Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 3 May 2024 13:18:26 +0300 Subject: [PATCH 26/88] Fix bug #67770 --- HtmlFile2/htmlfile2.cpp | 77 +++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 2fdd4f83de..fa9624a57b 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -1494,6 +1494,18 @@ private: return true; } + bool OpenP(NSStringUtils::CStringBuilder* pXml) + { + if (m_bInP) + return false; + + pXml->WriteString(L""); + m_bInP = true; + m_bWasPStyle = false; + + return true; + } + bool OpenR(NSStringUtils::CStringBuilder* pXml) { if (m_bInR) @@ -1532,16 +1544,29 @@ private: m_bInT = false; } + void CheckA(NSStringUtils::CStringBuilder* pXml, const std::vector& arSelectors) + { + for (std::vector::const_reverse_iterator itNode = arSelectors.crbegin(); itNode < arSelectors.crend(); ++itNode) + { + if (NodeBelongToTable(itNode->m_wsName)) + break; + + if (L"a" == itNode->m_wsName) + { + pXml->WriteString(L""); + break; + } + } + } + void CloseP(NSStringUtils::CStringBuilder* pXml, const std::vector& arSelectors) { m_bWasSpace = true; if (!m_bInP) return; - - for (const NSCSS::CNode& item : arSelectors) - if (item.m_wsName == L"a") - pXml->WriteString(L""); + + CheckA(pXml, arSelectors); CloseT(pXml); CloseR(pXml); @@ -2479,6 +2504,32 @@ private: if (bCross && sFootnote == L"href") sFootnote = sRef.substr(sRef.find('#') + 1); + const bool bInP{m_bInP}, bWasPStyle{m_bWasPStyle}; + + NSStringUtils::CStringBuilder oInsideData; + m_bInP = true; + m_bWasPStyle = true; + + if(!readStream(&oInsideData, sSelectors, oTS)) + { + oInsideData.WriteString(L""); + wrRPr(&oInsideData, sSelectors, oTS); + oInsideData.WriteString(L""); + oInsideData.WriteEncodeXmlString(sAlt); + oInsideData.WriteString(L""); + } + + if (0 != oInsideData.GetCurSize() && L"" == oInsideData.GetSubData(0, 6)) + { + CloseP(oXml, sSelectors); + oXml->WriteString(oInsideData.GetSubData(6, oInsideData.GetCurSize() - 6)); + sNote.clear(); + return; + } + + m_bInP = bInP; + m_bWasPStyle = bWasPStyle; + wrP(oXml, sSelectors, oTS); // Перекрестная ссылка внутри файла if(bCross) @@ -2511,14 +2562,8 @@ private: } oXml->WriteString(L"\">"); - if(!readStream(oXml, sSelectors, oTS)) - { - oXml->WriteString(L""); - wrRPr(oXml, sSelectors, oTS); - oXml->WriteString(L""); - oXml->WriteEncodeXmlString(sAlt); - oXml->WriteString(L""); - } + oXml->WriteString(oInsideData.GetData()); + if (m_bInP) { oXml->WriteString(L""); @@ -2545,6 +2590,7 @@ private: oXml->WriteString(L""); } } + sNote = L""; } @@ -2742,12 +2788,7 @@ private: std::wstring wrP(NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, const CTextSettings& oTS) { - if (!m_bInP) - { - oXml->WriteString(L""); - m_bInP = true; - m_bWasPStyle = false; - } + OpenP(oXml); if (m_bWasPStyle) return L""; From 5c6aaed51f359ad03a0e3a59520e02960833d420 Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 3 May 2024 13:18:53 +0300 Subject: [PATCH 27/88] Fix svg file size --- .../raster/Metafile/svg/CSvgFile.cpp | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp index 3d920e91f0..08a7727073 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp @@ -42,30 +42,40 @@ bool CSvgFile::GetBounds(double &dX, double &dY, double &dWidth, double &dHeight SVG::TRect oWindow = m_oContainer.GetWindow(); - dX = oWindow.m_oX .ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH); - dY = oWindow.m_oY .ToDouble(NSCSS::Pixel, SVG_FILE_HEIGHT); + dX = oWindow.m_oX.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH); + dY = oWindow.m_oY.ToDouble(NSCSS::Pixel, SVG_FILE_HEIGHT); dWidth = 0.; dHeight = 0.; if (!oWindow.m_oWidth.Empty() && !oWindow.m_oWidth.Zero()) { - if (NSCSS::Percent != oWindow.m_oWidth.GetUnitMeasure() && !m_oContainer.GetViewBox().m_oWidth.Empty() && !m_oContainer.GetViewBox().m_oWidth.Zero()) - dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, m_oContainer.GetViewBox().m_oWidth.ToDouble(NSCSS::Pixel)); + if (NSCSS::Percent == oWindow.m_oWidth.GetUnitMeasure()) + { + if (!m_oContainer.GetViewBox().m_oWidth.Empty() && !m_oContainer.GetViewBox().m_oWidth.Zero()) + dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, m_oContainer.GetViewBox().m_oWidth.ToDouble(NSCSS::Pixel)); + else + dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH); + } else dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel); } - else if (!m_oContainer.GetViewBox().m_oWidth.Empty() && !m_oContainer.GetViewBox().m_oWidth.Zero()) + else dWidth = m_oContainer.GetViewBox().m_oWidth.ToDouble(NSCSS::Pixel); if (!oWindow.m_oHeight.Empty() && !oWindow.m_oHeight.Zero()) { - if (NSCSS::Percent != oWindow.m_oHeight.GetUnitMeasure() && !m_oContainer.GetViewBox().m_oHeight.Empty() && !m_oContainer.GetViewBox().m_oHeight.Zero()) - dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, m_oContainer.GetViewBox().m_oHeight.ToDouble(NSCSS::Pixel)); + if (NSCSS::Percent == oWindow.m_oHeight.GetUnitMeasure()) + { + if (!m_oContainer.GetViewBox().m_oHeight.Empty() && !m_oContainer.GetViewBox().m_oHeight.Zero()) + dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, m_oContainer.GetViewBox().m_oHeight.ToDouble(NSCSS::Pixel)); + else + dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH); + } else dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel); } - else if (!m_oContainer.GetViewBox().m_oHeight.Empty() && !m_oContainer.GetViewBox().m_oHeight.Zero()) + else dHeight = m_oContainer.GetViewBox().m_oHeight.ToDouble(NSCSS::Pixel); if (0. == dWidth) From ee85c3597ee45599a2aa5e74b24c977bb8a801b0 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 3 May 2024 15:06:19 +0300 Subject: [PATCH 28/88] fix bug #67011 --- OOXML/PPTXFormat/Logic/GraphicFrame.cpp | 8 ++++++++ OOXML/PPTXFormat/Logic/Pic.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/OOXML/PPTXFormat/Logic/GraphicFrame.cpp b/OOXML/PPTXFormat/Logic/GraphicFrame.cpp index 5ac86fbd34..4b34dc8e6f 100644 --- a/OOXML/PPTXFormat/Logic/GraphicFrame.cpp +++ b/OOXML/PPTXFormat/Logic/GraphicFrame.cpp @@ -530,6 +530,14 @@ namespace PPTX if (olePic.is_init()) { + if (nvGraphicFramePr.IsInit()) + { + if (olePic->nvPicPr.cNvPr.id < 1) + olePic->nvPicPr.cNvPr.id = nvGraphicFramePr->cNvPr.id; + + if (olePic->nvPicPr.cNvPr.name.empty()) + olePic->nvPicPr.cNvPr.name = nvGraphicFramePr->cNvPr.name; + } olePic->toPPTY(pWriter); return; } diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 65b40dfdd6..163df8d7f7 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -912,7 +912,7 @@ namespace PPTX bOle = true; pWriter->WriteString(L""); - pWriter->WriteString(L"WriteString(L"WriteString(L" name=\"" + nvPicPr.cNvPr.name + L"\""); pWriter->WriteString(L"/>"); From d516c625eb1b06713e5c544711267207021d3710 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 3 May 2024 13:39:03 +0300 Subject: [PATCH 29/88] Fix EditPage when adding Link in edit mode --- PdfFile/PdfFile.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index 62e04cd775..c69218d3b1 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -1177,6 +1177,13 @@ HRESULT CPdfFile::AdvancedCommand(IAdvancedCommand* command) case IAdvancedCommand::AdvancedCommandType::Link: { CLinkCommand* pCommand = (CLinkCommand*)command; + if (m_pInternal->pEditor && m_pInternal->pEditor->IsEditPage()) + { + PdfWriter::CPage* pCurrent = m_pInternal->pWriter->GetPage(); + m_pInternal->pEditor->EditPage(pCommand->GetPage()); + m_pInternal->pWriter->GetDocument()->SetCurPage(pCurrent); + m_pInternal->pWriter->EditPage(pCurrent); + } return m_pInternal->pWriter->AddLink(pCommand->GetX(), pCommand->GetY(), pCommand->GetW(), pCommand->GetH(), pCommand->GetDestX(), pCommand->GetDestY(), pCommand->GetPage()); } From 30e09e731bf87adcdd4704c00857386a98485bd1 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 3 May 2024 15:36:14 +0300 Subject: [PATCH 30/88] Fix delete Link annot in edit mode --- PdfFile/PdfEditor.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/PdfFile/PdfEditor.cpp b/PdfFile/PdfEditor.cpp index ecd6e54ec3..5b0dc80aae 100644 --- a/PdfFile/PdfEditor.cpp +++ b/PdfFile/PdfEditor.cpp @@ -868,8 +868,33 @@ bool CPdfEditor::EditPage(int nPageIndex) { Object oTemp; char* chKey = pageObj.dictGetKey(nIndex); - if (strcmp("Resources", chKey) == 0 || strcmp("Annots", chKey) == 0) + if (strcmp("Resources", chKey) == 0) pageObj.dictGetVal(nIndex, &oTemp); + else if (strcmp("Annots", chKey) == 0) + { + // ВРЕМЕНО удаление Link аннотаций при редактировании + pageObj.dictGetVal(nIndex, &oTemp); + if (oTemp.isArray()) + { + PdfWriter::CArrayObject* pArray = new PdfWriter::CArrayObject(); + pPage->Add("Annots", pArray); + for (int nIndex = 0; nIndex < oTemp.arrayGetLength(); ++nIndex) + { + Object oAnnot, oSubtype; + if (oTemp.arrayGet(nIndex, &oAnnot)->isDict("Annot") && oAnnot.dictLookup("Subtype", &oSubtype)->isName("Link")) + { + oAnnot.free(); oSubtype.free(); + continue; + } + oAnnot.free(); oSubtype.free(); + oTemp.arrayGetNF(nIndex, &oAnnot); + DictToCDictObject(&oAnnot, pArray, false, ""); + oAnnot.free(); + } + oTemp.free(); + continue; + } + } else if (strcmp("Contents", chKey) == 0) { pageObj.dictGetVal(nIndex, &oTemp); From 6de671ccd51d44eb5fab6ba24a567464e359c0fa Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 3 May 2024 15:57:29 +0300 Subject: [PATCH 31/88] Added language consideration when converting EPUB files --- EpubFile/src/CBookInfo.cpp | 7 ++++ EpubFile/src/CBookInfo.h | 1 + EpubFile/src/CEpubFile.cpp | 12 +++--- HtmlFile2/HtmlFile2.pro | 3 +- HtmlFile2/htmlfile2.cpp | 37 +++++++++++++---- HtmlFile2/htmlfile2.h | 6 +++ HtmlFile2/src/Languages.h | 84 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 HtmlFile2/src/Languages.h diff --git a/EpubFile/src/CBookInfo.cpp b/EpubFile/src/CBookInfo.cpp index 928f4ed924..0f31c89958 100644 --- a/EpubFile/src/CBookInfo.cpp +++ b/EpubFile/src/CBookInfo.cpp @@ -146,6 +146,13 @@ const std::wstring CBookInfo::GetLanguages() const return sLanguages; } +const std::wstring CBookInfo::GetLanguage() const +{ + if (m_arLanguages.empty()) + return L""; + return m_arLanguages.front(); +} + const std::wstring CBookInfo::GetContibutors() const { if (m_arContributors.empty()) diff --git a/EpubFile/src/CBookInfo.h b/EpubFile/src/CBookInfo.h index 86023084d0..343adc8067 100644 --- a/EpubFile/src/CBookInfo.h +++ b/EpubFile/src/CBookInfo.h @@ -30,6 +30,7 @@ public: const std::wstring GetCreators() const; const std::wstring GetPublishers() const; const std::wstring GetLanguages() const; + const std::wstring GetLanguage() const; const std::wstring GetContibutors() const; const std::wstring GetDescriptions() const; const std::wstring GetSubjects() const; diff --git a/EpubFile/src/CEpubFile.cpp b/EpubFile/src/CEpubFile.cpp index 0dc7da562b..7ef264aef4 100644 --- a/EpubFile/src/CEpubFile.cpp +++ b/EpubFile/src/CEpubFile.cpp @@ -137,11 +137,13 @@ HRESULT CEpubFile::Convert(const std::wstring& sInputFile, const std::wstring& s CHtmlFile2 oFile; CHtmlParams oFileParams; - oFileParams.SetAuthors(m_oBookInfo.GetCreators()); - oFileParams.SetGenres (m_oBookInfo.GetSubjects()); - oFileParams.SetTitle (m_oBookInfo.GetTitle()); - oFileParams.SetDate (m_oBookInfo.GetDate()); - oFileParams.SetDescription(m_oBookInfo.GetDescriptions()); + oFileParams.SetAuthors (m_oBookInfo.GetCreators()); + oFileParams.SetGenres (m_oBookInfo.GetSubjects()); + oFileParams.SetTitle (m_oBookInfo.GetTitle()); + oFileParams.SetDate (m_oBookInfo.GetDate()); + oFileParams.SetDescription (m_oBookInfo.GetDescriptions()); + oFileParams.SetLanguage (m_oBookInfo.GetLanguage()); + oFileParams.SetPageBreakBefore(true); std::wstring sDocxFileTempDir = m_sTempDir + L"/tmp"; diff --git a/HtmlFile2/HtmlFile2.pro b/HtmlFile2/HtmlFile2.pro index f4ffd80449..97f6dd3cde 100644 --- a/HtmlFile2/HtmlFile2.pro +++ b/HtmlFile2/HtmlFile2.pro @@ -31,4 +31,5 @@ ADD_DEPENDENCY(kernel, UnicodeConverter, graphics, kernel_network) SOURCES += htmlfile2.cpp HEADERS += htmlfile2.h \ - ./src/StringFinder.h + ./src/StringFinder.h \ + ./src/Languages.h diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index fa9624a57b..d9174dbde8 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -27,6 +27,7 @@ #include "../DesktopEditor/raster/Metafile/svg/CSvgFile.h" #include "htmlfile2.h" +#include "src/Languages.h" #include @@ -41,16 +42,14 @@ #define DEFAULT_PAGE_WIDTH 12240 // Значение в Twips #define DEFAULT_PAGE_HEIGHT 15840 // Значение в Twips +#define DEFAULT_LANGUAGE std::wstring(L"en-US") +#define DEFAULT_FONT_FAMILY std::wstring(L"Times New Roman") +#define DEFAULT_FONT_SIZE 24 + #define SAVE_NORMALIZED_HTML 0 std::wstring rStyle = L" a area b strong bdo bdi big br center cite dfn em i var code kbd samp tt del s font img ins u mark q rt sup small sub svg input basefont button label data object noscript output abbr time ruby progress hgroup meter span acronym "; -//struct CTree -//{ -// NSCSS::CNode m_oNode; -// std::vector m_arrChild; -//}; - // Ячейка таблицы struct CTc { @@ -1055,6 +1054,8 @@ public: m_oNumberXml.AddCharSafe(167); m_oNumberXml += L"\"/>"; + std::wstring wsCurrentLanguage; + // core.xml std::wstring sCore = L""; if(oParams) @@ -1089,6 +1090,14 @@ public: sCore += EncodeXmlString(oParams->m_sDescription); sCore += L""; } + if (!oParams->m_sLanguage.empty()) + { + wsCurrentLanguage = IndentifyLanguage(oParams->m_sLanguage); + + sCore += L""; + sCore += wsCurrentLanguage; + sCore += L""; + } } sCore += L""; NSFile::CFileBinary oCoreWriter; @@ -1117,13 +1126,25 @@ public: if(oParams && !oParams->m_sdocDefaults.empty()) m_oStylesXml += oParams->m_sdocDefaults; else - m_oStylesXml += L""; + { + m_oStylesXml += L""; + m_oStylesXml += L""; + m_oStylesXml += L""; + m_oStylesXml += L""; + m_oStylesXml += L""; + + m_oStylesXml += L""; + } // normal по умолчанию if(oParams && !oParams->m_sNormal.empty()) m_oStylesXml += oParams->m_sNormal; else - m_oStylesXml += L""; + { + m_oStylesXml += L""; + m_oStylesXml += L""; + m_oStylesXml += L""; + } // Маркированный список m_oStylesXml += L""; diff --git a/HtmlFile2/htmlfile2.h b/HtmlFile2/htmlfile2.h index 9ecb12486d..80ed8f1214 100644 --- a/HtmlFile2/htmlfile2.h +++ b/HtmlFile2/htmlfile2.h @@ -19,6 +19,7 @@ struct CHtmlParams std::wstring m_sBookTitle; // Название std::wstring m_sDate; // Дата std::wstring m_sDescription; // описание + std::wstring m_sLanguage; // Язык bool m_bNeedPageBreakBefore; // Новый html с новой страницы std::wstring m_sdocDefaults; // Стиль docDefaults std::wstring m_sNormal; // Стиль normal @@ -64,6 +65,11 @@ struct CHtmlParams { m_sBookTitle = sTitle; } + + void SetLanguage(const std::wstring& sLanguage) + { + m_sLanguage = sLanguage; + } }; class CHtmlFile2_Private; diff --git a/HtmlFile2/src/Languages.h b/HtmlFile2/src/Languages.h new file mode 100644 index 0000000000..e267415ebe --- /dev/null +++ b/HtmlFile2/src/Languages.h @@ -0,0 +1,84 @@ +#ifndef LANGUAGES_LIST_H +#define LANGUAGES_LIST_H + +#include +#include +#include + +const static std::map m_Languages_HTML +{ + //Язык, Регион + {L"en", L"US"}, // Английский - США + {L"ru", L"RU"}, // Русский - Россия + {L"es", L"ES"}, // Испанский - Испания + {L"de", L"DE"}, // Немецкий - Германия + {L"fr", L"FR"}, // Французский - Франция + {L"it", L"IT"}, // Итальянский - Италия + {L"pt", L"PT"}, // Португальский - Португалия + {L"pl", L"PL"}, // Польский - Польша + {L"nl", L"NL"}, // Нидерландский - Нидерланды + {L"sv", L"SE"}, // Шведский - Швеция + {L"nb", L"NO"}, // Норвежский - Новегия + {L"da", L"DK"}, // Датский - Дания + {L"fi", L"FI"}, // Финский - Финляндия + {L"el", L"GR"}, // Греческий - Греция + {L"tr", L"TR"}, // Турецкий - Турция + {L"ar", L"SA"}, // Арабский - Саудовская Аравия + {L"he", L"IL"}, // Иврит - Израиль + {L"ja", L"JP"}, // Японский - Япония + {L"zh", L"CN"}, // Китайский (упрощенный) - Китай + {L"hu", L"HU"}, // Венгерский - Венгрия + {L"cs", L"CZ"}, // Чешский - Чехия + {L"ro", L"RO"}, // Румынский - Румыния + {L"bg", L"BG"}, // Болгарский - Болгария + {L"hr", L"HR"}, // Хорватский - Хорватия + {L"sr", L"Latn-RS"}, //Сербский - Сербия + {L"sl", L"SI"}, // Словенский - Словения + {L"lt", L"LT"}, // Литовский - Литва + {L"lv", L"LV"}, // Латышский - Латвия + {L"et", L"EE"}, // Эстонский - Эстония + {L"uk", L"UA"}, // Украинский - Украина + {L"be", L"BY"}, // Белорусский - Беларусь + {L"kk", L"KZ"}, // Казахский - Казахстан + {L"hi", L"IN"}, // Хинди - Индия + {L"th", L"TH"}, // Тайский - Таиланд + {L"vi", L"VN"}, // Вьетнамский - Вьетнам + {L"id", L"ID"}, // Индонезийский - Индонезия + {L"ms", L"MY"}, // Малайский - Малайзия + {L"fil", L"PH"}, // Филиппинский - Филиппины + {L"ko", L"KR"}, // Корейский - Южная Корея + {L"is", L"IS"}, // Исландский - Исландия + {L"ga", L"IE"}, // Ирландский - Ирландия + {L"cy", L"GB"}, // Валлийский - Великобритания + {L"ca", L"ES"}, // Каталанский - Испания + {L"eu", L"ES"}, // Баскский - Испания + {L"gl", L"ES"}, // Галисийский - Испания + {L"af", L"ZA"}, // Африкаанс - Южная Африка + {L"zu", L"ZA"}, // Зулу - Южная Африка + {L"ha", L"Latn-NG"}, // Хауса - Нигерия + {L"yo", L"NG"}, // Йоруба - Нигерия + {L"sw", L"KE"}, // Суахили - Кения + {L"am", L"ET"}, // Амхарский - Эфиопия + {L"ti", L"ET"}, // Тигринья - Эфиопия + {L"ur", L"PK"}, // Урду - Пакистан + {L"pa", L"IN"}, // Панджаби - Индия + {L"gu", L"IN"}, // Гуджарати - Индия + {L"ta", L"IN"}, // Тамильский - Индия + {L"te", L"IN"}, // Телугу - Индия + {L"ml", L"IN"}, // Малаялам - Индия + {L"kn", L"IN"} // Каннада - Индия +}; + +static std::wstring IndentifyLanguage(std::wstring wsLanguage) +{ + std::transform(wsLanguage.begin(), wsLanguage.end(), wsLanguage.begin(), towlower); + + std::map::const_iterator itFounded = m_Languages_HTML.find(wsLanguage); + + if (m_Languages_HTML.end() != itFounded) + return itFounded->first + L"-" + itFounded->second; + + return std::wstring(); +} + +#endif // LANGUAGES_LIST_H From f1544a6f6c21fed5835e11a024495cadd7672798 Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 3 May 2024 22:50:16 +0300 Subject: [PATCH 32/88] Fix bug#67829 --- .../3dParty/html/css/src/StyleProperties.cpp | 23 ++++++++++- Common/3dParty/html/css/src/StyleProperties.h | 3 ++ HtmlFile2/htmlfile2.cpp | 38 ++++++++++++++----- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 4b1aa1f659..e4b8be90b5 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -25,7 +25,7 @@ namespace NSCSS } CString::CString() - : CValue(L"", 0, false) + : CValue(L"", 0, false) {} CString::CString(const std::wstring &wsValue, unsigned int unLevel, bool bImportant) @@ -1508,6 +1508,15 @@ namespace NSCSS m_oColor == oBorderSide.m_oColor; } + CBorderSide &CBorderSide::operator =(const CBorderSide &oBorderSide) + { + m_oWidth = oBorderSide.m_oWidth; + m_oStyle = oBorderSide.m_oStyle; + m_oColor = oBorderSide.m_oColor; + + return *this; + } + // BORDER CBorder::CBorder() { @@ -1744,6 +1753,18 @@ namespace NSCSS m_oBottom == oBorder.m_oBottom; } + CBorder &CBorder::operator =(const CBorder &oBorder) + { + m_oLeft = oBorder.m_oLeft; + m_oTop = oBorder.m_oTop; + m_oRight = oBorder.m_oRight; + m_oBottom = oBorder.m_oBottom; + + m_enCollapse = oBorder.m_enCollapse; + + return *this; + } + // TEXT CText::CText() {} diff --git a/Common/3dParty/html/css/src/StyleProperties.h b/Common/3dParty/html/css/src/StyleProperties.h index 1d3e2c762f..cfe494a916 100644 --- a/Common/3dParty/html/css/src/StyleProperties.h +++ b/Common/3dParty/html/css/src/StyleProperties.h @@ -444,6 +444,7 @@ namespace NSCSS CBorderSide& operator+=(const CBorderSide& oBorderSide); bool operator==(const CBorderSide& oBorderSide) const; + CBorderSide& operator =(const CBorderSide& oBorderSide); private: CDigit m_oWidth; CString m_oStyle; @@ -513,6 +514,8 @@ namespace NSCSS CBorder& operator+=(const CBorder& oBorder); bool operator==(const CBorder& oBorder) const; + + CBorder& operator =(const CBorder& oBorder); private: CBorderSide m_oLeft; CBorderSide m_oTop; diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index d9174dbde8..e2bdf5d29f 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -196,34 +196,49 @@ struct TTableCellStyle std::wstring m_wsVAlign; TTableCellStyle(){} - + bool Empty() { return m_oWidth.Empty() && m_oHeight.Empty() && m_oBorder.Empty() && m_oPadding.Empty() && m_wsVAlign.empty() && m_wsVAlign.empty(); } + + void Copy(const TTableCellStyle* pTableCellStyle) + { + if (NULL == pTableCellStyle) + return; + + m_oWidth = pTableCellStyle->m_oWidth; + m_oHeight = pTableCellStyle->m_oHeight; + m_oBorder = pTableCellStyle->m_oBorder; + m_oPadding = pTableCellStyle->m_oPadding; + m_oBackground = pTableCellStyle->m_oBackground; + + m_wsHAlign = pTableCellStyle->m_wsHAlign; + m_wsVAlign = pTableCellStyle->m_wsVAlign; + } }; class CTableCell { public: CTableCell() - : m_unColspan(1), m_unRowSpan(1), m_bIsMerged(false), m_enMode(ParseModeBody) + : m_unColspan(1), m_unRowSpan(1), m_bIsMerged(false), m_bIsEmpty(false), m_enMode(ParseModeBody) {} - CTableCell(UINT unColspan, UINT unRowspan, bool bIsMerged) - : m_unColspan(unColspan), m_unRowSpan(unRowspan), m_bIsMerged(bIsMerged), m_enMode(ParseModeBody) + CTableCell(UINT unColspan, UINT unRowspan, bool bIsMerged, bool bIsEmpty) + : m_unColspan(unColspan), m_unRowSpan(unRowspan), m_bIsMerged(bIsMerged), m_bIsEmpty(bIsEmpty), m_enMode(ParseModeBody) {} CTableCell(CTableCell& oCell) : m_unColspan(oCell.m_unColspan), m_unRowSpan(oCell.m_unRowSpan), m_bIsMerged(oCell.m_bIsMerged), - m_enMode(oCell.m_enMode), m_oStyles(oCell.m_oStyles) + m_bIsEmpty(oCell.m_bIsEmpty), m_enMode(oCell.m_enMode), m_oStyles(oCell.m_oStyles) { m_oData.SetText(oCell.m_oData.GetData()); } bool Empty() { - return 0 == m_oData.GetCurSize(); + return m_bIsEmpty; } CTableCell* Copy() @@ -233,10 +248,9 @@ public: static CTableCell* CreateEmpty(UINT unColspan = 1, bool m_bIsMerged = false, const TTableCellStyle* pStyle = NULL) { - CTableCell *pCell = new CTableCell(unColspan, 1, m_bIsMerged); + CTableCell *pCell = new CTableCell(unColspan, 1, m_bIsMerged, true); - if (NULL != pStyle) - pCell->m_oStyles = *pStyle; + pCell->m_oStyles.Copy(pStyle); return pCell; } @@ -413,6 +427,7 @@ private: UINT m_unRowSpan; bool m_bIsMerged; + bool m_bIsEmpty; ERowParseMode m_enMode; TTableCellStyle m_oStyles; @@ -2206,7 +2221,7 @@ private: void ParseTableRows(CTable& oTable, std::vector& sSelectors, const CTextSettings& oTS, ERowParseMode eMode) { std::vector arRowspanElements; - + int nDeath = m_oLightReader.GetDepth(); while (m_oLightReader.ReadNextSiblingNode(nDeath)) { @@ -2234,6 +2249,9 @@ private: { CTableCell *pCell = new CTableCell(); + if (NULL == pCell) + continue; + pCell->SetMode(eMode); GetSubClass(pCell->GetData(), sSelectors); From 051ae3fab6449708aafdfca99efa64dae94573fe Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Sat, 4 May 2024 00:33:35 +0300 Subject: [PATCH 33/88] Fix bug #67836 --- .../3dParty/html/css/src/CCompiledStyle.cpp | 5 ++ Common/3dParty/html/css/src/CCompiledStyle.h | 1 + .../html/css/src/CCssCalculator_Private.cpp | 29 ++--------- .../html/css/src/CCssCalculator_Private.h | 2 +- .../html/css/src/xhtml/CDocumentStyle.cpp | 50 ++++++++++++------- .../html/css/src/xhtml/CDocumentStyle.h | 13 ++--- .../html/css/src/xhtml/CXmlElement.cpp | 2 +- .../3dParty/html/css/src/xhtml/CXmlElement.h | 2 +- 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/Common/3dParty/html/css/src/CCompiledStyle.cpp b/Common/3dParty/html/css/src/CCompiledStyle.cpp index 8504f7ee07..76617ed6a1 100644 --- a/Common/3dParty/html/css/src/CCompiledStyle.cpp +++ b/Common/3dParty/html/css/src/CCompiledStyle.cpp @@ -488,6 +488,11 @@ namespace NSCSS return arParentsName; } + std::set CCompiledStyle::GetParentsNamesSet() const + { + return m_arParentsStyles; + } + void CCompiledStyle::SetID(const std::wstring& sId) { m_sId = sId; diff --git a/Common/3dParty/html/css/src/CCompiledStyle.h b/Common/3dParty/html/css/src/CCompiledStyle.h index 73cca6b0f6..7877945a6b 100644 --- a/Common/3dParty/html/css/src/CCompiledStyle.h +++ b/Common/3dParty/html/css/src/CCompiledStyle.h @@ -48,6 +48,7 @@ namespace NSCSS void AddParent(const std::wstring& sParentName); std::vector GetParentsName() const; + std::set GetParentsNamesSet() const; void SetID(const std::wstring& sId); std::wstring GetId() const; diff --git a/Common/3dParty/html/css/src/CCssCalculator_Private.cpp b/Common/3dParty/html/css/src/CCssCalculator_Private.cpp index 085e945bc2..d4d6621dba 100644 --- a/Common/3dParty/html/css/src/CCssCalculator_Private.cpp +++ b/Common/3dParty/html/css/src/CCssCalculator_Private.cpp @@ -52,13 +52,6 @@ namespace NSCSS m_mData.clear(); - #ifdef CSS_CALCULATOR_WITH_XHTML - for (std::map, CCompiledStyle*>::iterator iter = m_mUsedStyles.begin(); iter != m_mUsedStyles.end(); ++iter) - delete iter->second; - - m_mUsedStyles.clear(); - #endif - if (NULL != m_mStatictics) delete m_mStatictics; } @@ -494,11 +487,11 @@ namespace NSCSS if (!bIsSettings) { - const std::map, CCompiledStyle*>::iterator oItem = m_mUsedStyles.find(arSelectors); + const std::map, CCompiledStyle>::iterator oItem = m_mUsedStyles.find(arSelectors); if (oItem != m_mUsedStyles.end()) { - oStyle = *oItem->second; + oStyle = oItem->second; return true; } } @@ -562,22 +555,10 @@ namespace NSCSS oStyle += oTempStyle; } - if (!bIsSettings) - { - std::map, CCompiledStyle*>::const_iterator itFound = std::find_if(m_mUsedStyles.begin(), m_mUsedStyles.end(), [oStyle](const std::pair, CCompiledStyle*>& oValue){ return (*oValue.second) == oStyle; }); - - if (m_mUsedStyles.end() != itFound) - { - oStyle = *itFound->second; - return true; - } + oStyle.SetID(arSelectors.back().m_wsName + ((!arSelectors.back().m_wsClass.empty()) ? L'.' + arSelectors.back().m_wsClass : L"") + ((arSelectors.back().m_wsId.empty()) ? L"" : L'#' + arSelectors.back().m_wsId) + L'-' + std::to_wstring(++m_nCountNodes)); - oStyle.SetID(arSelectors.back().m_wsName + ((!arSelectors.back().m_wsClass.empty()) ? L'.' + arSelectors.back().m_wsClass : L"") + ((arSelectors.back().m_wsId.empty()) ? L"" : L'#' + arSelectors.back().m_wsId) + L'-' + std::to_wstring(++m_nCountNodes)); - - CCompiledStyle *pTemp = new CCompiledStyle(oStyle); - - m_mUsedStyles[arSelectors] = pTemp; - } + if (!bIsSettings && !oStyle.Empty()) + m_mUsedStyles[arSelectors] = oStyle; return true; } diff --git a/Common/3dParty/html/css/src/CCssCalculator_Private.h b/Common/3dParty/html/css/src/CCssCalculator_Private.h index 814da70b58..7bda5a7937 100644 --- a/Common/3dParty/html/css/src/CCssCalculator_Private.h +++ b/Common/3dParty/html/css/src/CCssCalculator_Private.h @@ -37,7 +37,7 @@ namespace NSCSS std::map *m_mStatictics; // Количество повторений свойств id и style у селекторов #ifdef CSS_CALCULATOR_WITH_XHTML - std::map, CCompiledStyle*> m_mUsedStyles; + std::map, CCompiledStyle> m_mUsedStyles; std::map GetPageData(const std::wstring& wsPageName); void SetPageData(NSProperties::CPage& oPage, const std::map& mData, unsigned int unLevel, bool bHardMode = false); diff --git a/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp b/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp index a7cead51ae..8adb0dab1e 100644 --- a/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp +++ b/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp @@ -12,31 +12,47 @@ namespace NSCSS { - CStyleUsed::CStyleUsed(const std::wstring &wsId, bool bIsPStyle) - : m_bIsPStyle(bIsPStyle), m_wsId(wsId) + CStyleUsed::CStyleUsed(const CCompiledStyle &oStyle, bool bIsPStyle) + : m_oStyle(oStyle), m_bIsPStyle(bIsPStyle) {} + bool CheckArrays(const std::vector& arInitial, const std::set& arFirst, const std::set& arSecond) + { + std::set arInitialSet(arInitial.begin(), arInitial.end()); + + std::vector arCommonElements1; + std::vector arCommonElements2; + + std::set_intersection(arInitialSet.begin(), arInitialSet.end(), arFirst.begin(), arFirst.end(), std::back_inserter(arCommonElements1)); + std::set_intersection(arInitialSet.begin(), arInitialSet.end(), arSecond.begin(), arSecond.end(), std::back_inserter(arCommonElements2)); + + if (arCommonElements1.size() != arCommonElements2.size()) + return false; + + return arCommonElements1 == arCommonElements2; + } + bool CStyleUsed::operator==(const CStyleUsed &oUsedStyle) const { - return (m_bIsPStyle == oUsedStyle.m_bIsPStyle) && (m_wsId == oUsedStyle.m_wsId); + return m_bIsPStyle == oUsedStyle.m_bIsPStyle && + CheckArrays(Names_Standard_Styles, m_oStyle.GetParentsNamesSet(), oUsedStyle.m_oStyle.GetParentsNamesSet()) && + m_oStyle == oUsedStyle.m_oStyle; } std::wstring CStyleUsed::getId() { if (m_bIsPStyle) - return m_wsId; + return m_oStyle.GetId(); - return m_wsId + L"-c"; + return m_oStyle.GetId() + L"-c"; } - void CStyleUsed::setId(const std::wstring &sId) + CDocumentStyle::CDocumentStyle() : m_arStandardStyles(Names_Standard_Styles) { - m_wsId = sId; + for (const std::wstring& oNameStandardStyle : Names_Standard_Styles) + m_arStandardStyles.push_back(oNameStandardStyle + L"-c"); } - CDocumentStyle::CDocumentStyle() : m_arStandardStyles({L"a", L"li", L"h1", L"h2", L"h3", L"h4", L"h5", L"h6", L"h1-c", - L"h2-c", L"h3-c", L"h4-c", L"h5-c", L"h6-c", L"p-c", L"p", L"div-c", L"div", L"a-c"}) {} - CDocumentStyle::~CDocumentStyle() { m_arStandardStyles. clear(); @@ -438,6 +454,7 @@ namespace NSCSS void CDocumentStyle::SetRStyle(const NSCSS::CCompiledStyle& oStyle, CXmlElement& oXmlElement) { ConvertStyle(oStyle, oXmlElement, false); + if (oStyle.Empty() && oXmlElement.Empty()) return; @@ -482,9 +499,9 @@ namespace NSCSS return false; } - CStyleUsed structStyle(oStyle.GetId(), false); + CStyleUsed structStyle(oStyle, false); - std::list::iterator oItem = std::find(m_arStyleUsed.begin(), m_arStyleUsed.end(), structStyle); + std::vector::iterator oItem = std::find(m_arStyleUsed.begin(), m_arStyleUsed.end(), structStyle); if (oItem != m_arStyleUsed.end()) { @@ -544,8 +561,8 @@ namespace NSCSS return true; } - CStyleUsed structStyle(oStyle.GetId(), true); - std::list::iterator oItem = std::find(m_arStyleUsed.begin(), m_arStyleUsed.end(), structStyle); + CStyleUsed structStyle(oStyle, true); + std::vector::iterator oItem = std::find(m_arStyleUsed.begin(), m_arStyleUsed.end(), structStyle); if (oItem != m_arStyleUsed.end()) { @@ -559,11 +576,6 @@ namespace NSCSS if (oXmlElement.Empty()) return false; - structStyle.setId(oXmlElement.GetStyleId()); - - if (structStyle.getId().empty()) - structStyle.setId(m_sId); - m_arStyleUsed.push_back(structStyle); m_sStyle += oXmlElement.GetPStyle(); diff --git a/Common/3dParty/html/css/src/xhtml/CDocumentStyle.h b/Common/3dParty/html/css/src/xhtml/CDocumentStyle.h index 87b132bd9b..470e306e7b 100644 --- a/Common/3dParty/html/css/src/xhtml/CDocumentStyle.h +++ b/Common/3dParty/html/css/src/xhtml/CDocumentStyle.h @@ -10,27 +10,28 @@ namespace NSCSS { class CStyleUsed { + CCompiledStyle m_oStyle; bool m_bIsPStyle; - std::wstring m_wsId; public: - CStyleUsed(const std::wstring& wsId, bool bIsPStyle); + CStyleUsed(const CCompiledStyle& oStyle, bool bIsPStyle); bool operator==(const CStyleUsed& oUsedStyle) const; std::wstring getId(); - void setId(const std::wstring& sId); }; + static const std::vector Names_Standard_Styles = {L"a", L"li", L"h1", L"h2", L"h3", L"h4", L"h5", L"h6",L"p", L"div"}; + class CSSCALCULATOR_EXPORT CDocumentStyle { typedef NSConstValues::NSProperties::BasicProperties BProperties; typedef NSConstValues::NSProperties::ParagraphProperties PProperties; typedef NSConstValues::NSProperties::RunnerProperties RProperties; - std::list m_arStandardStylesUsed; - std::list m_arStandardStyles; - std::list m_arStyleUsed; + std::vector m_arStandardStylesUsed; + std::vector m_arStandardStyles; + std::vector m_arStyleUsed; std::wstring m_sStyle; std::wstring m_sId; diff --git a/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp b/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp index 8341aba31f..199e1f2dd4 100644 --- a/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp +++ b/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp @@ -298,7 +298,7 @@ CXmlElement& CXmlElement::operator=(const CXmlElement& oElement) return *this; } -bool CXmlElement::operator==(const CXmlElement &oElement) +bool CXmlElement::operator==(const CXmlElement &oElement) const { return m_mBasicValues == oElement.m_mBasicValues && m_mPStyleValues == oElement.m_mPStyleValues && diff --git a/Common/3dParty/html/css/src/xhtml/CXmlElement.h b/Common/3dParty/html/css/src/xhtml/CXmlElement.h index 4a7b0fa4bd..8c5835abe7 100644 --- a/Common/3dParty/html/css/src/xhtml/CXmlElement.h +++ b/Common/3dParty/html/css/src/xhtml/CXmlElement.h @@ -47,7 +47,7 @@ public: CXmlElement& operator+=(const CXmlElement& oElement); CXmlElement& operator= (const CXmlElement& oelement); - bool operator== (const CXmlElement& oElement); + bool operator== (const CXmlElement& oElement) const; }; #endif // CXMLELEMENT_H From a2e76364e9e90e1728260df60d43e8c62cbba7d1 Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Sat, 4 May 2024 15:19:06 +0300 Subject: [PATCH 34/88] Fix bug #67827 --- .../3dParty/html/css/src/StyleProperties.cpp | 4 +- Common/3dParty/html/htmltoxhtml.h | 67 ++++++++++------- HtmlFile2/htmlfile2.cpp | 33 ++------- HtmlFile2/src/StringFinder.h | 73 ++++++++++--------- 4 files changed, 86 insertions(+), 91 deletions(-) diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index e4b8be90b5..c2ffb22901 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -63,7 +63,7 @@ namespace NSCSS if (m_bImportant && !bImportant) return false; - if (arValiableValues.end() != std::find(arValiableValues.begin(), arValiableValues.end(), wsNewValue))\ + if (arValiableValues.end() != std::find(arValiableValues.begin(), arValiableValues.end(), wsNewValue)) { m_oValue = wsNewValue; m_unLevel = unLevel; @@ -1131,7 +1131,7 @@ namespace NSCSS bool CDisplay::SetDisplay(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { - return m_oHAlign.SetValue(wsValue, NSConstValues::DISPLAY_VALUES, unLevel, bHardMode); + return m_oDisplay.SetValue(wsValue, NSConstValues::DISPLAY_VALUES, unLevel, bHardMode); } const CDigit& CDisplay::GetX() const diff --git a/Common/3dParty/html/htmltoxhtml.h b/Common/3dParty/html/htmltoxhtml.h index c1c1b38442..b417716bcf 100644 --- a/Common/3dParty/html/htmltoxhtml.h +++ b/Common/3dParty/html/htmltoxhtml.h @@ -40,10 +40,10 @@ static std::wstring htmlToXhtml(std::string& sFileContent, bool bNeedConvert) { if (bNeedConvert) { // Определение кодировки - std::string sEncoding = NSStringFinder::FindPropety(sFileContent, "charset", {"="}, {";", "\\n", "\\r", " ", "\""}); + std::string sEncoding = NSStringFinder::FindPropety(sFileContent, "charset", {"="}, {";", "\\n", "\\r", " ", "\""}).m_sValue; if (sEncoding.empty()) - sEncoding = NSStringFinder::FindPropety(sFileContent, "encoding", {"="}, {";", "\\n", "\\r", " "}); + sEncoding = NSStringFinder::FindPropety(sFileContent, "encoding", {"="}, {";", "\\n", "\\r", " "}).m_sValue; if (!sEncoding.empty() && !NSStringFinder::Equals("utf-8", sEncoding)) { @@ -204,49 +204,60 @@ static std::string QuotedPrintableDecode(const std::string& sContent, std::strin static void ReadMht(const std::string& sMhtContent, std::map& sRes, NSStringUtils::CStringBuilderA& oRes) { - size_t unContentPosition = 0, unLastPosition = 0; + size_t unContentPosition = 0, unCharsetBegin = 0, unCharsetEnd = std::string::npos; + NSStringFinder::TFoundedData oData; + // Content-Type - std::string sContentType = NSStringFinder::FindPropety(sMhtContent, "content-type", {":"}, {";", "\\n", "\\r"}, 0, unLastPosition); + oData = NSStringFinder::FindPropety(sMhtContent, "content-type", {":"}, {";", "\\n", "\\r"}); + const std::string sContentType{oData.m_sValue}; if (sContentType.empty()) return; - + if (NSStringFinder::Equals(sContentType, "multipart/alternative")) { - oRes.WriteString(mhtTohtml(sMhtContent.substr(unLastPosition, sMhtContent.length() - unLastPosition))); + oRes.WriteString(mhtTohtml(sMhtContent.substr(oData.m_unEndPosition, sMhtContent.length() - oData.m_unEndPosition))); return; } - unContentPosition = std::max(unContentPosition, unLastPosition); + unContentPosition = std::max(unContentPosition, oData.m_unEndPosition); + unCharsetBegin = oData.m_unEndPosition; // name // std::string sName = NSStringFinder::FindPropety(sMhtContent, "name", {"="}, {";", "\\n", "\\r"}, 0, unLastPosition); // unContentPosition = std::max(unContentPosition, unLastPosition); - // charset - std::string sCharset = NSStringFinder::FindPropety(sMhtContent, "charset", {"="}, {";", "\\n", "\\r"}, 0, unLastPosition); - unContentPosition = std::max(unContentPosition, unLastPosition); - NSStringFinder::CutInside(sCharset, "\""); - // Content-Location - std::string sContentLocation = NSStringFinder::FindPropety(sMhtContent, "content-location", {":"}, {";", "\\n", "\\r"}, 0, unLastPosition); - unContentPosition = std::max(unContentPosition, unLastPosition); + oData = NSStringFinder::FindPropety(sMhtContent, "content-location", {":"}, {";", "\\n", "\\r"}); + std::string sContentLocation{oData.m_sValue}; + unContentPosition = std::max(unContentPosition, oData.m_unEndPosition); + unCharsetEnd = std::min(unCharsetEnd, oData.m_unBeginPosition); - if (sContentLocation.empty()) - { - // Content-ID - std::string sContentID = NSStringFinder::FindPropety(sMhtContent, "content-id", {":"}, {";", "\\n", "\\r"}, 0, unLastPosition); - unContentPosition = std::max(unContentPosition, unLastPosition); - NSStringFinder::CutInside(sCharset, "<", ">"); + // Content-ID + oData = NSStringFinder::FindPropety(sMhtContent, "content-id", {":"}, {";", "\\n", "\\r"}); + std::string sContentID{oData.m_sValue}; + unContentPosition = std::max(unContentPosition, oData.m_unEndPosition); + unCharsetEnd = std::min(unCharsetEnd, oData.m_unBeginPosition); + NSStringFinder::CutInside(sContentID, "<", ">"); - if (!sContentID.empty()) - sContentLocation = "cid:" + sContentID; - } + if (sContentLocation.empty() && !sContentID.empty()) + sContentLocation = "cid:" + sContentID; // Content-Transfer-Encoding - std::string sContentEncoding = NSStringFinder::FindPropety(sMhtContent, "content-transfer-encoding", {":"}, {";", "\\n", "\\r"}, 0, unLastPosition); - unContentPosition = std::max(unContentPosition, unLastPosition); + oData = NSStringFinder::FindPropety(sMhtContent, "content-transfer-encoding", {":"}, {";", "\\n", "\\r"}); + const std::string sContentEncoding{oData.m_sValue}; + unContentPosition = std::max(unContentPosition, oData.m_unEndPosition); + unCharsetEnd = std::min(unCharsetEnd, oData.m_unBeginPosition); + + // charset + std::string sCharset = "utf-8"; + + if (unCharsetBegin < unCharsetEnd) + { + sCharset = NSStringFinder::FindPropety(sMhtContent.substr(unCharsetBegin, unCharsetEnd - unCharsetBegin), "charset", {"="}, {";", "\\n", "\\r"}).m_sValue; + NSStringFinder::CutInside(sCharset, "\""); + } // Content std::string sContent = sMhtContent.substr(unContentPosition, sMhtContent.length() - unContentPosition); @@ -312,9 +323,11 @@ static std::string mhtTohtml(const std::string& sFileContent) std::map sRes; NSStringUtils::CStringBuilderA oRes; - size_t nFound = 0; // Поиск boundary - std::string sBoundary = NSStringFinder::FindPropety(sFileContent, "boundary", {"="}, {"\\r", "\\n", "\""}, 0, nFound); + NSStringFinder::TFoundedData oData{NSStringFinder::FindPropety(sFileContent, "boundary", {"="}, {"\\r", "\\n", "\""})}; + + size_t nFound{oData.m_unEndPosition}; + std::string sBoundary{oData.m_sValue}; if (sBoundary.empty()) { diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index e2bdf5d29f..077447b99f 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -1580,21 +1580,6 @@ private: m_bInT = false; } - void CheckA(NSStringUtils::CStringBuilder* pXml, const std::vector& arSelectors) - { - for (std::vector::const_reverse_iterator itNode = arSelectors.crbegin(); itNode < arSelectors.crend(); ++itNode) - { - if (NodeBelongToTable(itNode->m_wsName)) - break; - - if (L"a" == itNode->m_wsName) - { - pXml->WriteString(L""); - break; - } - } - } - void CloseP(NSStringUtils::CStringBuilder* pXml, const std::vector& arSelectors) { m_bWasSpace = true; @@ -1602,8 +1587,6 @@ private: if (!m_bInP) return; - CheckA(pXml, arSelectors); - CloseT(pXml); CloseR(pXml); @@ -2934,8 +2917,10 @@ private: std::wstring sImageName = sImageId + L'.' + sExtention; CBgraFrame oBgraFrame; if (!oBgraFrame.OpenFile(m_sDst + L"/word/media/i" + sImageName)) + { + NSFile::CFileBinary::Remove(m_sDst + L"/word/media/i" + sImageName); return; - + } // Прописать рельсы if (bNew) { @@ -2995,15 +2980,9 @@ private: { if(sNote.empty()) return; - if (!m_bInP) - { - oXml->WriteString(L""); - for (const NSCSS::CNode& item : sSelectors) - if (item.m_wsName == L"a") - oXml->WriteString(L""); - m_bInP = true; - m_bWasPStyle = false; - } + + OpenP(oXml); + oXml->WriteString(L"WriteString(std::to_wstring(m_nFootnoteId)); oXml->WriteString(L"\"/>"); diff --git a/HtmlFile2/src/StringFinder.h b/HtmlFile2/src/StringFinder.h index e66b1b0045..01479d3725 100644 --- a/HtmlFile2/src/StringFinder.h +++ b/HtmlFile2/src/StringFinder.h @@ -13,6 +13,18 @@ namespace NSStringFinder { + template, std::allocator>> + struct TFoundedData + { + size_t m_unBeginPosition; + size_t m_unEndPosition; + StringType m_sValue; + + TFoundedData() + : m_unBeginPosition(0), m_unEndPosition(0) + {} + }; + template, std::allocator>> StringType FindPropetyTemplate(const StringType& sString, const StringType& sProperty, const StringType& sDelimiter, const StringType& sEnding, const size_t& unStarting, size_t& unEndPosition) { @@ -66,70 +78,61 @@ namespace NSStringFinder } template, std::allocator>> - StringType FindPropetyTemplate(const StringType& sString, const StringType& sProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting, size_t& unEndPosition) + TFoundedData FindPropetyTemplate(const StringType& sString, const StringType& sProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting) { if (sString.length() < unStarting) - return StringType(); + return TFoundedData(); - std::string sRegexValue = "(?i)" + std::string(sProperty.begin(), sProperty.end()); + std::wstring wsRegexValue = L"(?i)" + std::wstring(sProperty.begin(), sProperty.end()); if (!arDelimiters.empty()) { - sRegexValue += "\\s*["; - for (const StringType& sDelimiter : arDelimiters) - sRegexValue += std::string(sDelimiter.begin(), sDelimiter.end()) + "|"; - sRegexValue.pop_back(); - sRegexValue += "]{1}"; + wsRegexValue += L"\\s*["; + for (const StringType& wsDelimiter : arDelimiters) + wsRegexValue += std::wstring(wsDelimiter.begin(), wsDelimiter.end()) + L"|"; + wsRegexValue.pop_back(); + wsRegexValue += L"]{1}"; } if (!arEndings.empty()) { - std::string sEndingValue; + std::wstring wsEndingValue; for (const StringType& sEnding : arEndings) - sEndingValue += std::string(sEnding.begin(), sEnding.end()) + "|"; + wsEndingValue += std::wstring(sEnding.begin(), sEnding.end()) + L"|"; - sEndingValue.pop_back(); + wsEndingValue.pop_back(); - sRegexValue += "\\s*(.[^" + sEndingValue + "]*)\\s*[" + sEndingValue + "]?"; + wsRegexValue += L"\\s*(.[^" + wsEndingValue + L"]*)\\s*[" + wsEndingValue + L"]?"; } else - sRegexValue += "\\s*(.*)[\\n|\\r]?"; + wsRegexValue += L"\\s*(.*)[\\n|\\r]?"; - boost::regex oRegex(sRegexValue); + boost::wregex oRegex(wsRegexValue); boost::match_results oResult; if (!boost::regex_search(sString.begin() + unStarting, sString.end(), oResult, oRegex)) - return StringType(); + return TFoundedData(); - unEndPosition = unStarting + oResult.position() + oResult.length(); + TFoundedData oData; - StringType sValue(oResult[1]); - boost::algorithm::trim(sValue); + oData.m_unBeginPosition = unStarting + oResult.position(); + oData.m_unEndPosition = unStarting + oResult.position() + oResult.length(); - return sValue; + oData.m_sValue = oResult[1]; + boost::algorithm::trim(oData.m_sValue); + + return oData; } - std::string FindPropety(const std::string& sString, const std::string& sProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting, size_t& unEndPosition) + TFoundedData FindPropety(const std::string& sString, const std::string& sProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting = 0) { - return FindPropetyTemplate(sString, sProperty, arDelimiters, arEndings, unStarting, unEndPosition); + return FindPropetyTemplate(sString, sProperty, arDelimiters, arEndings, unStarting); } - std::wstring FindPropety(const std::wstring& wsString, const std::wstring& wsProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting, size_t& unEndPosition) + TFoundedData FindPropety(const std::wstring& wsString, const std::wstring& wsProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting = 0) { - return FindPropetyTemplate(wsString, wsProperty, arDelimiters, arEndings, unStarting, unEndPosition); - } - - std::string FindPropety(const std::string& sString, const std::string& sProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting = 0) - { - size_t unEndPosition = 0; - return FindPropetyTemplate(sString, sProperty, arDelimiters, arEndings, unStarting, unEndPosition); - } - - std::wstring FindPropety(const std::wstring& wsString, const std::wstring& wsProperty, const std::vector& arDelimiters, const std::vector& arEndings, const size_t& unStarting = 0) - { - size_t unEndPosition = 0; - return FindPropetyTemplate(wsString, wsProperty, arDelimiters, arEndings, unStarting, unEndPosition); + return FindPropetyTemplate(wsString, wsProperty, arDelimiters, arEndings, unStarting); } template From c88c1aac9624bda0efe1b5f7a3ce93df70ccef69 Mon Sep 17 00:00:00 2001 From: Michael Efremov Date: Sat, 4 May 2024 20:52:51 +0300 Subject: [PATCH 35/88] [android] Fix copy libs and build --- .../build/Android/libx2t/build.gradle.kts | 25 +++++++------------ .../libx2t/src/main/cpp/CMakeLists.txt | 15 ----------- 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/X2tConverter/build/Android/libx2t/build.gradle.kts b/X2tConverter/build/Android/libx2t/build.gradle.kts index ba6e880f93..8f2c3dcb39 100644 --- a/X2tConverter/build/Android/libx2t/build.gradle.kts +++ b/X2tConverter/build/Android/libx2t/build.gradle.kts @@ -58,7 +58,6 @@ android { "-DANDROID_STL=c++_static", "-DANDROID_ARM_NEON=TRUE", "-DARG_PATH_LIB_BUILD_TOOLS=${getProjectPath(extra.get("PATH_LIB_BUILD_TOOLS") as String)}", - "-DARG_PATH_LIB_DST=${getProjectPath(extra.get("PATH_LIB_DST") as String, true)}", "-DARG_PATH_SRC_CORE=${getProjectPath(extra.get("PATH_SRC_CORE") as String)}", "-DARG_NAME_LIB=${extra.get("NAME_LIB")}" ) @@ -83,12 +82,6 @@ android { sourceSets { getByName("main") { java.srcDir("src/main/java") - jniLibs.srcDirs( - arrayOf( - extra.get("PATH_LIB_DST") as String, - extra.get("PATH_LIB_BUILD_TOOLS") as String - ) - ) } } @@ -113,15 +106,15 @@ android { packaging { jniLibs.useLegacyPackaging = true - arrayOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64").forEach { abi -> - val dh = file("${extra.get("PATH_LIB_BUILD_TOOLS")}/$abi") - dh.listFiles()?.forEach { - if (it.name.contains(".so")) - jniLibs.pickFirsts.add("lib/$abi/${it.name}") - } - jniLibs.pickFirsts.add("lib/$abi/lib${extra.get("NAME_LIB")}.so") - jniLibs.pickFirsts.add("lib/$abi/lib${extra.get("NAME_LIB_KERNEL_NETWORK")}.so") - } +// arrayOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64").forEach { abi -> +// val dh = file("${extra.get("PATH_LIB_BUILD_TOOLS")}/$abi") +// dh.listFiles()?.forEach { +// if (it.name.contains(".so")) +// jniLibs.pickFirsts.add("lib/$abi/${it.name}") +// } +// jniLibs.pickFirsts.add("lib/$abi/lib${extra.get("NAME_LIB")}.so") +// jniLibs.pickFirsts.add("lib/$abi/lib${extra.get("NAME_LIB_KERNEL_NETWORK")}.so") +// } } } diff --git a/X2tConverter/build/Android/libx2t/src/main/cpp/CMakeLists.txt b/X2tConverter/build/Android/libx2t/src/main/cpp/CMakeLists.txt index a3cc89735c..0ce57130a3 100644 --- a/X2tConverter/build/Android/libx2t/src/main/cpp/CMakeLists.txt +++ b/X2tConverter/build/Android/libx2t/src/main/cpp/CMakeLists.txt @@ -47,13 +47,6 @@ elseif (NOT EXISTS ${ARG_PATH_LIB_BUILD_TOOLS}) message(STATUS "Destination 3dParty path doesn't exist, created!") endif() -# X2t destination path -if (NOT DEFINED ARG_PATH_LIB_DST) - message(FATAL_ERROR "You must set argument \"ARG_PATH_LIB_DST\" with path to x2t.so destination...") -elseif (NOT EXISTS ${ARG_PATH_LIB_DST}) - file(MAKE_DIRECTORY ${ARG_PATH_LIB_DST}) - message(STATUS "Destination library path doesn't exist, created!") -endif() # Core source path if (NOT DEFINED ARG_PATH_SRC_CORE) @@ -72,8 +65,6 @@ set(LIB_NAME_X2T_CONVERTER ${ARG_NAME_LIB}) # ---------- Paths sources ---------- # Core src dir path set(CORE_DIR ${ARG_PATH_SRC_CORE}) -set(X2T_CONVERTER_DEST ${ARG_PATH_LIB_DST}/${ANDROID_ABI}) -message(STATUS "X2t Converter destination path: ${X2T_CONVERTER_DEST}") # Prebuild libraries path set(X2T_CONVERTER_LIBS ${ARG_PATH_LIB_BUILD_TOOLS}/${ANDROID_ABI}) @@ -157,12 +148,6 @@ FOREACH(lib ${libs_list}) ${X2T_CONVERTER_LIBS}/${lib}) ENDFOREACH() - -# Export lib to common libs path -set_target_properties(${LIB_NAME_X2T_CONVERTER} - PROPERTIES LIBRARY_OUTPUT_DIRECTORY - ${X2T_CONVERTER_DEST} -) # Searches for a specified prebuilt library and stores the path as a # variable. Because CMake includes system libraries in the search path by # default, you only need to specify the name of the public NDK library From 63bd2a1cbfb1314b22b9cc90ea19810790024254 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Mon, 6 May 2024 15:49:48 +0500 Subject: [PATCH 36/88] Fix bug #67815 --- OdfFile/Reader/Converter/oox_drawing.cpp | 1 + OdfFile/Writer/Format/odf_drawing_context.cpp | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/OdfFile/Reader/Converter/oox_drawing.cpp b/OdfFile/Reader/Converter/oox_drawing.cpp index 42b27e2049..19b7ec5113 100644 --- a/OdfFile/Reader/Converter/oox_drawing.cpp +++ b/OdfFile/Reader/Converter/oox_drawing.cpp @@ -239,6 +239,7 @@ void oox_serialize_effects(std::wostream & strm, const std::vectorcurrent_graphic_properties->common_shadow_attlist_.draw_shadow_offset_x_ = length(length(dist_pt, length::pt).get_value_unit(length::cm), length::cm); - - if (dist_pt_y > 0) - impl_->current_graphic_properties->common_shadow_attlist_.draw_shadow_offset_y_ = length(length(dist_pt_y, length::pt).get_value_unit(length::cm), length::cm); - else - impl_->current_graphic_properties->common_shadow_attlist_.draw_shadow_offset_y_ = length(length(dist_pt, length::pt).get_value_unit(length::cm), length::cm); + impl_->current_graphic_properties->common_shadow_attlist_.draw_shadow_offset_y_ = length(length(dist_pt_y, length::pt).get_value_unit(length::cm), length::cm); impl_->current_graphic_properties->common_shadow_attlist_.draw_shadow_ = shadow_type1(shadow_type1::Visible); if (opacity) impl_->current_graphic_properties->common_shadow_attlist_.draw_shadow_opacity_ = *opacity; From a44e22c726167d3d1e573d8653908589abccb2e6 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 6 May 2024 14:34:06 +0300 Subject: [PATCH 37/88] fix bug #67818 --- MsBinaryFile/PptFile/Drawing/Attributes.h | 3 ++- MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp | 11 ++++++----- MsBinaryFile/PptFile/PPTXWriter/ImageManager.h | 4 ++-- .../PptFile/Reader/PPTDocumentInfoOneUser.cpp | 3 ++- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/MsBinaryFile/PptFile/Drawing/Attributes.h b/MsBinaryFile/PptFile/Drawing/Attributes.h index 701ef71cf0..7029dedc8d 100644 --- a/MsBinaryFile/PptFile/Drawing/Attributes.h +++ b/MsBinaryFile/PptFile/Drawing/Attributes.h @@ -91,8 +91,9 @@ namespace PPT _UINT32 m_dwID = 0; std::wstring m_strFilePath; + std::wstring m_strFileExt; - std::wstring m_name; + std::wstring m_name; std::wstring m_progName; // clip diff --git a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp index 6bee2915ff..a13e0b41a9 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp @@ -72,14 +72,14 @@ void CMediaManager::SetTempMedia(const std::wstring& strSrc) OOX::CPath pathSrc(strSrc); m_strTempMedia = pathSrc.GetPath(); } -std::wstring CMediaManager::GenerateVideo(const std::wstring &strInput) +std::wstring CMediaManager::GenerateVideo(const std::wstring &strInput, const std::wstring& strExt) { - return GenerateMedia(strInput, L"video", m_lIndexNextVideo, L".avi"); + return GenerateMedia(strInput, L"video", m_lIndexNextVideo, strExt.empty() ? L".avi" : strExt); } -std::wstring CMediaManager::GenerateAudio(const std::wstring &strInput) +std::wstring CMediaManager::GenerateAudio(const std::wstring &strInput, const std::wstring& strExt) { - return GenerateMedia(strInput, L"audio", m_lIndexNextAudio, L".wav"); + return GenerateMedia(strInput, L"audio", m_lIndexNextAudio, strExt.empty() ? L".wav" : strExt); } std::wstring CMediaManager::GenerateImage(const std::wstring &strInput) @@ -195,6 +195,7 @@ std::wstring CMediaManager::GenerateMedia(const std::wstring& strInput, const st { return L""; } + //todooo ? test format if (strOutput != strInput) { NSDirectory::CreateDirectory(m_strDstMedia); @@ -214,7 +215,7 @@ void CMediaManager::WriteAudioCollection(const std::vector &a for (auto& audio : audioCont) { - auto pathAudio = GenerateAudio(audio.m_strFilePath); + auto pathAudio = GenerateAudio(audio.m_strFilePath, audio.m_strFileExt); } } diff --git a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h index bf0bcae024..5e357909ec 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h +++ b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h @@ -64,8 +64,8 @@ public: void SetDstMedia(const std::wstring& strDst); void SetTempMedia(const std::wstring& strSrc); - std::wstring GenerateVideo(const std::wstring& strInput); - std::wstring GenerateAudio(const std::wstring& strInput); + std::wstring GenerateVideo(const std::wstring& strInput, const std::wstring& strExt = L""); + std::wstring GenerateAudio(const std::wstring& strInput, const std::wstring& strExt = L""); std::wstring GenerateOleObject(const std::wstring& strInput); std::wstring GenerateImage(const std::wstring& strInput); std::wstring GenerateImageJPEG(const std::wstring& strInput); diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp index bb3ed69f99..695ef503be 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp @@ -2353,9 +2353,10 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects) { PPT::CExFilesInfo oInfo; - oInfo.m_strFilePath = m_oExMedia.m_strPresentationDirectory + FILE_SEPARATOR_STR + oArrayStrings[0]->m_strText + L".audio"; + oInfo.m_strFilePath = m_oExMedia.m_strPresentationDirectory + FILE_SEPARATOR_STR + L"audio" + std::to_wstring(m_oExMedia.m_arAudioCollection.size() + 1) + L".audio"; oInfo.m_dwID = (_UINT32)XmlUtils::GetInteger(oArrayStrings[2]->m_strText.c_str()); oInfo.m_name = oArrayStrings[0]->m_strText; + oInfo.m_strFileExt = oArrayStrings[1]->m_strText; m_oExMedia.m_arAudioCollection.push_back(oInfo); oArrayData[0]->SaveToFile(oInfo.m_strFilePath); From 441716773fb62340143230f7d8572d326927d307 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Mon, 6 May 2024 15:12:02 +0300 Subject: [PATCH 38/88] Add property for strip x2t library --- X2tConverter/build/Qt/X2tConverter.pro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/X2tConverter/build/Qt/X2tConverter.pro b/X2tConverter/build/Qt/X2tConverter.pro index da91d2545d..28349a3c88 100644 --- a/X2tConverter/build/Qt/X2tConverter.pro +++ b/X2tConverter/build/Qt/X2tConverter.pro @@ -22,6 +22,10 @@ build_x2t_as_library { CONFIG += plugin !core_debug:shared:QMAKE_LFLAGS += -exported_symbols_list $$PWD/../../src/dylib/export + + build_strip_debug { + QMAKE_LFLAGS += -Wl,--strip-debug + } } include(X2tConverter.pri) From 0439347bc3d006a9e3595ea1483b4cf73ab0e631 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 6 May 2024 15:49:01 +0300 Subject: [PATCH 39/88] fix bug #67782 --- OdfFile/Reader/Format/styles.cpp | 5 + OdfFile/Reader/Format/styles.h | 3 +- OdfFile/Writer/Converter/DocxConverter.cpp | 168 +++++++++++---------- OdfFile/Writer/Format/styles.cpp | 1 + OdfFile/Writer/Format/styles.h | 3 +- 5 files changed, 95 insertions(+), 85 deletions(-) diff --git a/OdfFile/Reader/Format/styles.cpp b/OdfFile/Reader/Format/styles.cpp index 1128147ca7..df767c6442 100644 --- a/OdfFile/Reader/Format/styles.cpp +++ b/OdfFile/Reader/Format/styles.cpp @@ -2160,6 +2160,7 @@ void text_linenumbering_configuration::add_attributes(const xml::attributes_wc_p CP_APPLY_ATTR(L"text:number-position", text_number_position_); //inner, left, outer, right CP_APPLY_ATTR(L"text:offset", text_offset_); CP_APPLY_ATTR(L"text:restart-on-page", text_restart_on_page_); + CP_APPLY_ATTR(L"text:start", text_start_); } void text_linenumbering_configuration::add_child_element(xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) { @@ -2187,6 +2188,10 @@ void text_linenumbering_configuration::docx_serialize(std::wostream & strm, oox: { CP_XML_ATTR(L"w:restart", L"continuous"); } + if (text_start_) + { + CP_XML_ATTR(L"w:start", *text_start_); + } if (text_offset_) { CP_XML_ATTR(L"w:distance", 20. * text_offset_->get_value_unit(length::pt)); diff --git a/OdfFile/Reader/Format/styles.h b/OdfFile/Reader/Format/styles.h index 61cf51eaaa..a68f51ff38 100644 --- a/OdfFile/Reader/Format/styles.h +++ b/OdfFile/Reader/Format/styles.h @@ -1024,7 +1024,8 @@ public: _CP_OPT(bool) text_count_empty_lines_; _CP_OPT(bool) text_count_in_text_boxes_; _CP_OPT(unsigned int) text_increment_; - _CP_OPT(std::wstring) text_number_position_; //inner, left, outer, right + _CP_OPT(unsigned int) text_start_; + _CP_OPT(std::wstring) text_number_position_; //inner, left, outer, right _CP_OPT(odf_types::length) text_offset_; _CP_OPT(bool) text_restart_on_page_; diff --git a/OdfFile/Writer/Converter/DocxConverter.cpp b/OdfFile/Writer/Converter/DocxConverter.cpp index 8f349f14d6..e5bb5d18c8 100644 --- a/OdfFile/Writer/Converter/DocxConverter.cpp +++ b/OdfFile/Writer/Converter/DocxConverter.cpp @@ -1869,38 +1869,38 @@ void DocxConverter::apply_HF_from(OOX::Logic::CSectionProperty *props, OOX::Logi } } } -void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool bSection, const std::wstring & master_name, bool bAlways) +void DocxConverter::convert(OOX::Logic::CSectionProperty* oox_section_pr, bool bSection, const std::wstring& master_name, bool bAlways) { if (oox_section_pr == NULL) return; current_section_properties = NULL; odt_context->text_context()->set_type_break(-1, 0); - + bool continuous = false; if (oox_section_pr->m_oType.IsInit() && oox_section_pr->m_oType->m_oVal.IsInit()) { - switch(oox_section_pr->m_oType->m_oVal->GetValue()) - { - case SimpleTypes::sectionmarkContinious : - continuous = true; + switch (oox_section_pr->m_oType->m_oVal->GetValue()) + { + case SimpleTypes::sectionmarkContinious: + continuous = true; break; - case SimpleTypes::sectionmarkNextColumn : - case SimpleTypes::sectionmarkEvenPage : - case SimpleTypes::sectionmarkNextPage : - case SimpleTypes::sectionmarkOddPage : + case SimpleTypes::sectionmarkNextColumn: + case SimpleTypes::sectionmarkEvenPage: + case SimpleTypes::sectionmarkNextPage: + case SimpleTypes::sectionmarkOddPage: // возможен разрыв break; } } - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool bDefault = (master_name == L"Standard"); - + if (!bDefault) { if (!last_section_properties && (!bSection || continuous == false || oox_section_pr->m_oTitlePg.IsInit())) - { + { last_section_properties = oox_section_pr; } else if (!bSection || continuous == false) @@ -1908,7 +1908,7 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b apply_HF_from(last_section_properties, oox_section_pr); } } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if (!bSection || continuous == false) { odt_context->page_layout_context()->add_master_page(master_name); @@ -1918,14 +1918,14 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b { _CP_OPT(odf_types::length) top, left, right, bottom, header, footer, gutter, header_min, footer_min; - convert(oox_section_pr->m_oPgMar->m_oBottom.GetPointer(), bottom); - convert(oox_section_pr->m_oPgMar->m_oLeft.GetPointer(), left); - convert(oox_section_pr->m_oPgMar->m_oRight.GetPointer(), right); - convert(oox_section_pr->m_oPgMar->m_oTop.GetPointer(), top); - convert(oox_section_pr->m_oPgMar->m_oHeader.GetPointer(), header); - convert(oox_section_pr->m_oPgMar->m_oFooter.GetPointer(), footer); - convert(oox_section_pr->m_oPgMar->m_oGutter.GetPointer(), gutter); - + convert(oox_section_pr->m_oPgMar->m_oBottom.GetPointer(), bottom); + convert(oox_section_pr->m_oPgMar->m_oLeft.GetPointer(), left); + convert(oox_section_pr->m_oPgMar->m_oRight.GetPointer(), right); + convert(oox_section_pr->m_oPgMar->m_oTop.GetPointer(), top); + convert(oox_section_pr->m_oPgMar->m_oHeader.GetPointer(), header); + convert(oox_section_pr->m_oPgMar->m_oFooter.GetPointer(), footer); + convert(oox_section_pr->m_oPgMar->m_oGutter.GetPointer(), gutter); + footer_min = footer; header_min = header; @@ -1934,8 +1934,8 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b double bottom_cm = bottom->get_value_unit(length::cm); double footer_cm = footer ? footer->get_value_unit(length::cm) : 0; double length_cm = bottom_cm - footer_cm; - - if ( length_cm < 0 ) + + if (length_cm < 0) { footer_min = length(-length_cm, length::cm); footer.reset(); @@ -1953,13 +1953,13 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b if (top) { double length_cm = top->get_value_unit(length::cm) - (header ? header->get_value_unit(length::cm) : 0); - - if ( length_cm > 2.4 ) + + if (length_cm > 2.4) { top = header; header = length(fabs(length_cm), length::cm); } - else if ( length_cm < 0 ) + else if (length_cm < 0) { header_min = length(-length_cm, length::cm); header.reset(); @@ -1979,14 +1979,14 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b std::wstring top, left, right, bottom; convert(oox_section_pr->m_oPgBorders->m_oBottom.GetPointer(), bottom); - convert(oox_section_pr->m_oPgBorders->m_oLeft.GetPointer() , left); - convert(oox_section_pr->m_oPgBorders->m_oRight.GetPointer() , right); - convert(oox_section_pr->m_oPgBorders->m_oTop.GetPointer() , top); - + convert(oox_section_pr->m_oPgBorders->m_oLeft.GetPointer(), left); + convert(oox_section_pr->m_oPgBorders->m_oRight.GetPointer(), right); + convert(oox_section_pr->m_oPgBorders->m_oTop.GetPointer(), top); + odt_context->page_layout_context()->set_page_border(top, left, bottom, right); - - if (oox_section_pr->m_oPgBorders->m_oOffsetFrom.IsInit() && + + if (oox_section_pr->m_oPgBorders->m_oOffsetFrom.IsInit() && (oox_section_pr->m_oPgBorders->m_oOffsetFrom->GetValue() == SimpleTypes::pageborderoffsetPage)) { odt_context->page_layout_context()->set_page_border_offset(2); @@ -2010,14 +2010,14 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b if (oox_section_pr->m_oPgBorders->m_oLeft.IsInit()) { int type = (oox_section_pr->m_oPgBorders->m_oBottom->m_oVal.IsInit() ? oox_section_pr->m_oPgBorders->m_oLeft->m_oVal->GetValue() : SimpleTypes::bordervalueSingle); - + if (oox_section_pr->m_oPgBorders->m_oLeft->m_oSpace.IsInit()) odt_context->page_layout_context()->set_page_border_padding(3, oox_section_pr->m_oPgBorders->m_oLeft->m_oSpace->ToPoints()); } if (oox_section_pr->m_oPgBorders->m_oRight.IsInit()) { int type = (oox_section_pr->m_oPgBorders->m_oBottom->m_oVal.IsInit() ? oox_section_pr->m_oPgBorders->m_oRight->m_oVal->GetValue() : SimpleTypes::bordervalueSingle); - + if (oox_section_pr->m_oPgBorders->m_oRight->m_oSpace.IsInit()) odt_context->page_layout_context()->set_page_border_padding(4, oox_section_pr->m_oPgBorders->m_oRight->m_oSpace->ToPoints()); } @@ -2028,9 +2028,9 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b if (oox_section_pr->m_oPgBorders->m_oTop.IsInit() && oox_section_pr->m_oPgBorders->m_oTop->m_oShadow.IsInit() && oox_section_pr->m_oPgBorders->m_oTop->m_oShadow->ToBool()) shadow = true; if (oox_section_pr->m_oPgBorders->m_oLeft.IsInit() && oox_section_pr->m_oPgBorders->m_oLeft->m_oShadow.IsInit() && oox_section_pr->m_oPgBorders->m_oLeft->m_oShadow->ToBool()) shadow = true; if (oox_section_pr->m_oPgBorders->m_oRight.IsInit() && oox_section_pr->m_oPgBorders->m_oRight->m_oShadow.IsInit() && oox_section_pr->m_oPgBorders->m_oRight->m_oShadow->ToBool()) shadow = true; - + if (shadow) odt_context->page_layout_context()->set_page_border_shadow(true); - + if (oox_section_pr->m_oPgBorders->m_oDisplay.IsInit()) { // todooo @@ -2065,9 +2065,9 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b { convert(docx_flat_document->m_pBgPict.GetPointer(), 1); } - //nullable m_oTextDirection; - //nullable m_oRtlGutter; - //nullable m_oVAlign; + //nullable m_oTextDirection; + //nullable m_oRtlGutter; + //nullable m_oVAlign; if (oox_section_pr->m_oPgNumType.IsInit()) { @@ -2075,23 +2075,23 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b _CP_OPT(int) start; if (oox_section_pr->m_oPgNumType->m_oFmt.IsInit()) format = oox_section_pr->m_oPgNumType->m_oFmt->GetValue(); - if (oox_section_pr->m_oPgNumType->m_oStart.IsInit()) start = oox_section_pr->m_oPgNumType->m_oStart->GetValue(); + if (oox_section_pr->m_oPgNumType->m_oStart.IsInit()) start = oox_section_pr->m_oPgNumType->m_oStart->GetValue(); - odt_context->page_layout_context()->set_page_number_format( format, start); - //nullable > m_oChapSep; - //nullable > m_oChapStyle; + odt_context->page_layout_context()->set_page_number_format(format, start); + //nullable > m_oChapSep; + //nullable > m_oChapStyle; } - + if (continuous == false || oox_section_pr->m_oTitlePg.IsInit() || bAlways) { - OOX::Logic::CSectionProperty* s = last_section_properties ? last_section_properties : oox_section_pr; - - bool present_title_page = s->m_oTitlePg.IsInit() ? true : false; - bool present_odd_even_pages = odt_context->page_layout_context()->even_and_left_headers_; - - bool add_title_header = false, add_title_footer = false; - bool add_odd_even_pages_header = false, add_odd_even_pages_footer = false; - bool add_default_header = false, add_default_footer = false; + OOX::Logic::CSectionProperty* s = last_section_properties ? last_section_properties : oox_section_pr; + + bool present_title_page = s->m_oTitlePg.IsInit() ? true : false; + bool present_odd_even_pages = odt_context->page_layout_context()->even_and_left_headers_; + + bool add_title_header = false, add_title_footer = false; + bool add_odd_even_pages_header = false, add_odd_even_pages_footer = false; + bool add_default_header = false, add_default_footer = false; std::vector types; @@ -2099,14 +2099,14 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b { if (s->m_arrHeaderReference[i] == NULL) continue; - int type = s->m_arrHeaderReference[i]->m_oType.IsInit() ? s->m_arrHeaderReference[i]->m_oType->GetValue() : 0 ; + int type = s->m_arrHeaderReference[i]->m_oType.IsInit() ? s->m_arrHeaderReference[i]->m_oType->GetValue() : 0; if (type == 2 && !present_title_page) continue; if (type == 1 && !present_odd_even_pages) continue; - if (type == 2 && present_title_page) add_title_header = true; - if (type == 1 && present_odd_even_pages) add_odd_even_pages_header = true; //swap even & odd ? - if (type == 0) add_default_header = true; + if (type == 2 && present_title_page) add_title_header = true; + if (type == 1 && present_odd_even_pages) add_odd_even_pages_header = true; //swap even & odd ? + if (type == 0) add_default_header = true; if (odt_context->start_header(type)) { @@ -2122,22 +2122,22 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b odt_context->end_header_footer(); } } - if (!add_title_header && present_title_page) odt_context->add_empty_header(2); - if (!add_odd_even_pages_header && present_odd_even_pages) odt_context->add_empty_header(1); - if (!add_default_header && (present_odd_even_pages || present_title_page)) odt_context->add_empty_header(0); + if (!add_title_header && present_title_page) odt_context->add_empty_header(2); + if (!add_odd_even_pages_header && present_odd_even_pages) odt_context->add_empty_header(1); + if (!add_default_header && (present_odd_even_pages || present_title_page)) odt_context->add_empty_header(0); - for (size_t i=0; i< s->m_arrFooterReference.size(); i++) + for (size_t i = 0; i < s->m_arrFooterReference.size(); i++) { if (s->m_arrFooterReference[i] == NULL) continue; - int type = s->m_arrFooterReference[i]->m_oType.IsInit() ? s->m_arrFooterReference[i]->m_oType->GetValue() :0 ; + int type = s->m_arrFooterReference[i]->m_oType.IsInit() ? s->m_arrFooterReference[i]->m_oType->GetValue() : 0; if (type == 2 && !present_title_page) continue; if (type == 1 && !present_odd_even_pages) continue; - if (type == 2 && present_title_page) add_title_footer = true; - if (type == 1 && present_odd_even_pages) add_odd_even_pages_footer = true; - if (type == 0) add_default_footer = true; + if (type == 2 && present_title_page) add_title_footer = true; + if (type == 1 && present_odd_even_pages) add_odd_even_pages_footer = true; + if (type == 0) add_default_footer = true; if (odt_context->start_footer(type)) { @@ -2150,12 +2150,12 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b } } - odt_context->end_header_footer(); + odt_context->end_header_footer(); } } - if (!add_title_footer && present_title_page) odt_context->add_empty_footer(2); - if (!add_odd_even_pages_footer && present_odd_even_pages) odt_context->add_empty_footer(1); - if (!add_default_footer && (present_odd_even_pages || present_title_page)) odt_context->add_empty_footer(0); + if (!add_title_footer && present_title_page) odt_context->add_empty_footer(2); + if (!add_odd_even_pages_footer && present_odd_even_pages) odt_context->add_empty_footer(1); + if (!add_default_footer && (present_odd_even_pages || present_title_page)) odt_context->add_empty_footer(0); if (!bDefault) odt_context->is_paragraph_in_current_section_ = true; @@ -2164,16 +2164,17 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b // odt_context->page_layout_context()->last_master()->get_name() : L""); } if (oox_section_pr->m_oLnNumType.IsInit()) - {//linenumbering-configuration один для всех секций и всех разметок страниц ((( - хуевый OpenOffice (также не начала нумерации) - //Ms Office тоже фуфло - нет нумерации алфавитами и римскими, нет разделителей + { odf_writer::office_element_ptr lnNum_elm; odf_writer::create_element(L"text", L"linenumbering-configuration", lnNum_elm, odf_context()); - odf_writer::text_linenumbering_configuration *linenumbering = dynamic_cast(lnNum_elm.get()); + odf_writer::text_linenumbering_configuration* linenumbering = dynamic_cast(lnNum_elm.get()); if (!linenumbering) return; linenumbering->text_style_name_ = odt_context->styles_context()->find_free_name(style_family::LineNumbering); linenumbering->text_number_lines_ = true; + linenumbering->style_num_format_ = odf_types::style_numformat::arabic; + linenumbering->text_number_position_ = L"left"; if (oox_section_pr->m_oLnNumType->m_oCountBy.IsInit()) { @@ -2182,19 +2183,20 @@ void DocxConverter::convert(OOX::Logic::CSectionProperty *oox_section_pr, bool b if (oox_section_pr->m_oLnNumType->m_oDistance.IsInit()) { linenumbering->text_offset_ = odf_types::length(oox_section_pr->m_oLnNumType->m_oDistance->ToPoints(), odf_types::length::pt); - } - if (oox_section_pr->m_oLnNumType->m_oRestart.IsInit()) - { - if (oox_section_pr->m_oLnNumType->m_oRestart->GetValue() == SimpleTypes::linenumberrestartNewPage) - { - linenumbering->text_restart_on_page_ = true; - } - else - { - } } - if (oox_section_pr->m_oLnNumType->m_oStart.IsInit()) + else { + linenumbering->text_offset_ = odf_types::length(0.5, odf_types::length::cm); + } + if ((oox_section_pr->m_oLnNumType->m_oRestart.IsInit() && (oox_section_pr->m_oLnNumType->m_oRestart->GetValue() == SimpleTypes::linenumberrestartNewPage)) + || false == oox_section_pr->m_oLnNumType->m_oRestart.IsInit()) + { + linenumbering->text_restart_on_page_ = true; + } + + if (oox_section_pr->m_oLnNumType->m_oStart.IsInit()) + {//нет в формате ??? + linenumbering->text_start_ = oox_section_pr->m_oLnNumType->m_oStart->GetValue(); } odt_context->styles_context()->add_style(lnNum_elm, false, true, style_family::LineNumbering); diff --git a/OdfFile/Writer/Format/styles.cpp b/OdfFile/Writer/Format/styles.cpp index 053ea2984e..9408af114d 100644 --- a/OdfFile/Writer/Format/styles.cpp +++ b/OdfFile/Writer/Format/styles.cpp @@ -1423,6 +1423,7 @@ void text_linenumbering_configuration::serialize(std::wostream & strm) CP_XML_ATTR_OPT(L"text:count-empty-lines", text_count_empty_lines_); CP_XML_ATTR_OPT(L"text:count-in-text-boxes", text_count_in_text_boxes_); CP_XML_ATTR_OPT(L"text:increment", text_increment_); + CP_XML_ATTR_OPT(L"text:start", text_start_); CP_XML_ATTR_OPT(L"text:number-position", text_number_position_); //inner, left, outer, right CP_XML_ATTR_OPT(L"text:offset", text_offset_); CP_XML_ATTR_OPT(L"text:restart-on-page", text_restart_on_page_); diff --git a/OdfFile/Writer/Format/styles.h b/OdfFile/Writer/Format/styles.h index c0acce8f6e..a932d5dc1f 100644 --- a/OdfFile/Writer/Format/styles.h +++ b/OdfFile/Writer/Format/styles.h @@ -841,7 +841,8 @@ public: _CP_OPT(odf_types::Bool) text_count_empty_lines_; _CP_OPT(odf_types::Bool) text_count_in_text_boxes_; _CP_OPT(unsigned int) text_increment_; - _CP_OPT(std::wstring) text_number_position_; //inner, left, outer, right + _CP_OPT(unsigned int) text_start_; + _CP_OPT(std::wstring) text_number_position_; //inner, left, outer, right _CP_OPT(odf_types::length) text_offset_; _CP_OPT(odf_types::Bool) text_restart_on_page_; From 045ca4ad9e32481c970f2b612f55c52e4f5c21e0 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 6 May 2024 16:03:34 +0300 Subject: [PATCH 40/88] . --- Common/OfficeFileFormatChecker2.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 7ae78c1763..9d9caba130 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -1118,35 +1118,38 @@ bool COfficeFileFormatChecker::isOpenOfficeFormatFile(const std::wstring &fileNa hresult = OfficeUtils.LoadFileFromArchive(fileName, L"mimetype", &pBuffer, nBufferSize); if (hresult == S_OK && pBuffer != NULL) { - if (NULL != strstr((char *)pBuffer, ottFormatLine)) + if (48 <= nBufferSize && NULL != strstr((char *)pBuffer, ottFormatLine)) { nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_OTT; } - else if (NULL != strstr((char *)pBuffer, otsFormatLine)) + else if (55 <= nBufferSize && NULL != strstr((char *)pBuffer, otsFormatLine)) { nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS; } - else if (NULL != strstr((char *)pBuffer, otpFormatLine)) + else if (56 <= nBufferSize && NULL != strstr((char *)pBuffer, otpFormatLine)) { nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP; } - else if (NULL != strstr((char *)pBuffer, odtFormatLine) || NULL != strstr((char *)pBuffer, sxwFormatLine)) + else if ((39 <= nBufferSize && NULL != strstr((char *)pBuffer, odtFormatLine)) || + (30 <= nBufferSize && NULL != strstr((char *)pBuffer, sxwFormatLine))) { nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT; } - else if (NULL != strstr((char *)pBuffer, odsFormatLine) || NULL != strstr((char *)pBuffer, sxcFormatLine)) + else if ((46 <= nBufferSize && NULL != strstr((char *)pBuffer, odsFormatLine)) || + (28 <= nBufferSize && NULL != strstr((char *)pBuffer, sxcFormatLine))) { nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS; } - else if (NULL != strstr((char *)pBuffer, odpFormatLine) || NULL != strstr((char *)pBuffer, sxiFormatLine)) + else if ((47 <= nBufferSize && NULL != strstr((char *)pBuffer, odpFormatLine)) || + (31 <= nBufferSize && NULL != strstr((char *)pBuffer, sxiFormatLine))) { nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP; } - else if (NULL != strstr((char*)pBuffer, odgFormatLine)) + else if (43 <= nBufferSize && NULL != strstr((char*)pBuffer, odgFormatLine)) { nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODG; } - else if (NULL != strstr((char *)pBuffer, epubFormatLine)) + else if (20 <= nBufferSize && NULL != strstr((char *)pBuffer, epubFormatLine)) { nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB; } @@ -1683,7 +1686,8 @@ bool COfficeFileFormatChecker::isXpsFile(const std::wstring &fileName) { // http://schemas.microsoft.com/xps/2005/06/fixedrepresentation // http://schemas.openxps.org/oxps/v1.0/fixedrepresentation - if (NULL != strstr((char *)pBuffer, "fixedrepresentation") && (NULL != strstr((char *)pBuffer, "/xps/") || NULL != strstr((char *)pBuffer, "/oxps/"))) + if ((19 <= nBufferSize && NULL != strstr((char *)pBuffer, "fixedrepresentation") && (NULL != strstr((char *)pBuffer, "/xps/")) || + (6 <= nBufferSize && NULL != strstr((char *)pBuffer, "/oxps/")))) { nFileType = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS; } From 283d611ad76c76c60c0af8ff9e3e3ed1829cfeaf Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 6 May 2024 20:44:19 +0600 Subject: [PATCH 41/88] Fix sparkline conversion --- OOXML/XlsxFormat/Worksheets/Sparkline.cpp | 99 +++++++++++++++++++++-- OOXML/XlsxFormat/Worksheets/Sparkline.h | 2 + 2 files changed, 94 insertions(+), 7 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp index ca5d524267..d407a3461f 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp @@ -92,6 +92,32 @@ namespace OOX m_oSqRef = oReader.GetText3(); } } + XLS::BaseObjectPtr CSparkline::toBin() + { + auto ptr(new XLSB::Sparkline); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->FRTheader.fFormula = false; + ptr->FRTheader.fRef = false; + ptr->FRTheader.fRelID = false; + ptr->FRTheader.fSqref = false; + + if(m_oRef.IsInit()) + { + XLSB::FRTFormula formula; + formula.formula = m_oRef.get(); + ptr->FRTheader.rgFormulas.array.push_back(formula); + ptr->FRTheader.fFormula = true; + } + if(m_oSqRef.IsInit()) + { + XLSB::FRTSqref sqref; + sqref.sqrfx.strValue = m_oSqRef.get(); + ptr->FRTheader.rgSqrefs.array.push_back(sqref); + ptr->FRTheader.fSqref = true; + } + + return objectPtr; + } void CSparkline::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -175,6 +201,17 @@ namespace OOX m_arrItems.push_back(new CSparkline(sparkline)); } } + std::vector CSparklines::toBin() + { + std::vector sparclineVector; + + for(auto i:m_arrItems) + { + sparclineVector.push_back(i->toBin()); + } + + return sparclineVector; + } EElementType CSparklines::getType () const { return et_x_Sparklines; @@ -422,9 +459,21 @@ namespace OOX else ptr->fDateAxis = 0; if(m_oDisplayEmptyCellsAs.IsInit()) - ptr->fShowEmptyCellAsZero = (m_oDisplayEmptyCellsAs == OOX::Spreadsheet::ST_DispBlanksAs::st_dispblanksasZERO) ? 0x01 : 0x00; - else - ptr->fShowEmptyCellAsZero = false; + { + switch(m_oDisplayEmptyCellsAs.get()) + { + case st_dispblanksasZERO: + ptr->fShowEmptyCellAsZero = 0; + break; + case st_dispblanksasSPAN: + ptr->fShowEmptyCellAsZero = 2; + break; + case st_dispblanksasGAP: + default: + ptr->fShowEmptyCellAsZero = 1; + break; + } + } if(m_oMarkers.IsInit()) ptr->fMarkers = m_oMarkers->GetValue(); else @@ -461,11 +510,43 @@ namespace OOX ptr->fRTL = m_oRightToLeft->GetValue(); else ptr->fRTL = false; - if(m_oMaxAxisType.IsInit() && m_oMaxAxisType == SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Individual) + if(m_oMaxAxisType.IsInit()) + { + + if(m_oMaxAxisType.get()== SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Group) + { + ptr->fIndividualAutoMax = false; + ptr->fGroupAutoMax = true; + } + else + { + ptr->fIndividualAutoMax = true; + ptr->fGroupAutoMax = false; + } + } + else + { ptr->fIndividualAutoMax = true; - else - ptr->fIndividualAutoMax = false; - + ptr->fGroupAutoMax = false; + } + if(m_oMinAxisType.IsInit()) + { + if(m_oMinAxisType.get()== SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Group) + { + ptr->fIndividualAutoMin = false; + ptr->fGroupAutoMin = true; + } + else + { + ptr->fIndividualAutoMin = true; + ptr->fGroupAutoMin = false; + } + } + else + { + ptr->fIndividualAutoMin = true; + ptr->fGroupAutoMin = false; + } if(m_oColorSeries.IsInit()) ptr->brtcolorSeries = m_oColorSeries->toColor(); @@ -518,6 +599,10 @@ namespace OOX ptr->FRTheader.rgFormulas.array[0].formula = m_oRef.get(); ptr->FRTheader.fFormula = true; } + for(auto i:m_oSparklines->m_arrItems) + { + ptr1->m_arBrtSparkline.push_back(i->toBin()); + } return objectPtr; } diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.h b/OOXML/XlsxFormat/Worksheets/Sparkline.h index 938fc399d0..7c1c8086f4 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.h +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.h @@ -62,6 +62,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -88,6 +89,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + std::vector toBin(); virtual EElementType getType () const; private: From bce25e97882f01daba5851a5680f92c79bcaad72 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Mon, 6 May 2024 22:14:57 +0300 Subject: [PATCH 42/88] Fix mac build --- Common/3dParty/boost/boost.pri | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Common/3dParty/boost/boost.pri b/Common/3dParty/boost/boost.pri index 919b60a42b..7a0278cea4 100644 --- a/Common/3dParty/boost/boost.pri +++ b/Common/3dParty/boost/boost.pri @@ -1,16 +1,18 @@ INCLUDEPATH += $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/include CORE_BOOST_LIBS = $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/lib +core_ios:CONFIG += disable_enum_constexpr_conversion +core_android:CONFIG += disable_enum_constexpr_conversion +core_mac:CONFIG += disable_enum_constexpr_conversion + core_android { INCLUDEPATH += $$PWD/build/android/include CORE_BOOST_LIBS = $$PWD/build/android/lib/$$CORE_BUILDS_PLATFORM_PREFIX DEFINES += "_HAS_AUTO_PTR_ETC=0" - QMAKE_CFLAGS += -Wno-enum-constexpr-conversion - QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion } -core_ios { +disable_enum_constexpr_conversion { QMAKE_CFLAGS += -Wno-enum-constexpr-conversion QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion } From c03ec969669dc2c9eb74eec50733c51ff923ae0c Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 7 May 2024 10:40:24 +0300 Subject: [PATCH 43/88] . --- .../XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp index 675f3c8943..e0b11daa65 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ListParsedFormula.cpp @@ -31,7 +31,7 @@ */ #include "ListParsedFormula.h" -#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.h" +#include "PtgList.h" namespace XLS { From fd664bafaed4898da62d6be3ae072d9864267dc4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 7 May 2024 14:20:46 +0600 Subject: [PATCH 44/88] Fix bug #67867 --- OOXML/XlsbFormat/WorkBookStream.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/OOXML/XlsbFormat/WorkBookStream.cpp b/OOXML/XlsbFormat/WorkBookStream.cpp index f0ef887440..050304b305 100644 --- a/OOXML/XlsbFormat/WorkBookStream.cpp +++ b/OOXML/XlsbFormat/WorkBookStream.cpp @@ -492,6 +492,7 @@ void WorkBookStream::UpdateXti(XLS::GlobalWorkbookInfo* global_info_) { XTI* xti = dynamic_cast(extern_sheet->rgXTI[i].get()); if (!xti) continue; + if(externals->m_arSUP.size() <= xti->iSupBook) continue; SUP* index_book = dynamic_cast(externals->m_arSUP[xti->iSupBook].get()); if (!index_book) continue; From 194d1c220865de6676af6414227acb09d0af39fc Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 7 May 2024 15:04:29 +0600 Subject: [PATCH 45/88] Fix bug #67864 --- .../XlsFile/Format/Logic/Biff_structures/PtgList.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.cpp index fae7a7ed1c..f43c6ce751 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgList.cpp @@ -135,7 +135,12 @@ void PtgList::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool ful case 0x00: break; case 0x01: case 0x02: - formula += L",['" + arrColumn->second[colFirst] + L"]"; if(columns == 0x01) break; + if(colFirst >= arrColumn->second.size()) + break; + formula += L",['" + arrColumn->second[colFirst] + L"]"; + if(columns == 0x01) break; + if(colLast >= arrColumn->second.size()) + break; formula += L":[" + arrColumn->second[colLast] + L"]"; break; } } From 680c3824f7c003ba592c8dd37e164666b6b2dfe2 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 7 May 2024 16:00:34 +0600 Subject: [PATCH 46/88] Fix bug #67860 --- .../XlsFile/Format/Logic/Biff_structures/PtgArea3d.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea3d.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea3d.cpp index c30bc9c4a1..38aef91d89 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea3d.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea3d.cpp @@ -161,7 +161,8 @@ void PtgArea3d::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool f if (ixals == 0xffff) { std::wstring strRange; - if(-1 == itabFirst) + if(-1 == itabFirst || global_info->sheets_info.size() <= itabFirst + || global_info->sheets_info.size() <= itabLast) { strRange = L"#REF"; } From 10afcda7a3849b68b4a23d3d23750d78f694cf4b Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 7 May 2024 14:31:02 +0400 Subject: [PATCH 47/88] Add new signal to `CVlcPlayer` --- Common/3dParty/libvlc/vlcmedia.cpp | 1 - Common/3dParty/libvlc/vlcplayer.cpp | 10 ++++++++-- Common/3dParty/libvlc/vlcplayer.h | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Common/3dParty/libvlc/vlcmedia.cpp b/Common/3dParty/libvlc/vlcmedia.cpp index 1516189b75..b7be6b3522 100644 --- a/Common/3dParty/libvlc/vlcmedia.cpp +++ b/Common/3dParty/libvlc/vlcmedia.cpp @@ -1,6 +1,5 @@ #include "vlcmedia.h" -#include #include CVlcMedia::CVlcMedia(libvlc_instance_t* pVlcInstance, const QString& sFile, bool bEventForwarding) diff --git a/Common/3dParty/libvlc/vlcplayer.cpp b/Common/3dParty/libvlc/vlcplayer.cpp index d6addf4f9e..3763504147 100644 --- a/Common/3dParty/libvlc/vlcplayer.cpp +++ b/Common/3dParty/libvlc/vlcplayer.cpp @@ -1,7 +1,5 @@ #include "vlcplayer.h" -#include - CVlcPlayer::CVlcPlayer(QWidget* parent) : QWidget(parent) { // initialize vlc media player @@ -19,6 +17,8 @@ CVlcPlayer::CVlcPlayer(QWidget* parent) : QWidget(parent) } libvlc_event_attach(m_pEventManager, libvlc_MediaPlayerTimeChanged , onTimeChanged, this); libvlc_event_attach(m_pEventManager, libvlc_MediaPlayerPositionChanged , onPositionChanged, this); + + libvlc_event_attach(m_pEventManager, libvlc_MediaPlayerVout , onVideoOutputChanged, this); } CVlcPlayer::~CVlcPlayer() @@ -45,6 +45,12 @@ void CVlcPlayer::onPositionChanged(const libvlc_event_t* pEvent, void* pData) emit pVlcPlayer->positionChanged(pEvent->u.media_player_position_changed.new_position); } +void CVlcPlayer::onVideoOutputChanged(const libvlc_event_t* pEvent, void* pData) +{ + CVlcPlayer* pVlcPlayer = reinterpret_cast(pData); + emit pVlcPlayer->videoOutputChanged(pEvent->u.media_player_vout.new_count); +} + void CVlcPlayer::integrateIntoWidget(QWidget* pWidget) { #if defined(_MAC) diff --git a/Common/3dParty/libvlc/vlcplayer.h b/Common/3dParty/libvlc/vlcplayer.h index c0563ce858..b23cd5abb9 100644 --- a/Common/3dParty/libvlc/vlcplayer.h +++ b/Common/3dParty/libvlc/vlcplayer.h @@ -20,6 +20,7 @@ public: static void onStateChanged(const libvlc_event_t* pEvent, void *pData); static void onTimeChanged(const libvlc_event_t* pEvent, void *pData); static void onPositionChanged(const libvlc_event_t* pEvent, void *pData); + static void onVideoOutputChanged(const libvlc_event_t* pEvent, void *pData); public: void integrateIntoWidget(QWidget* pWidget); @@ -37,6 +38,7 @@ public: void setPosition(float fPos); float position(); + // NOTE: isAudio() will always return true until event libvlc_MediaPlayerVout is occurred (see onVideoOutputChanged()) bool isAudio(); bool isPlaying(); libvlc_state_t getState(); @@ -45,6 +47,7 @@ signals: void stateChanged(int newState); void timeChanged(qint64 nNewTime); void positionChanged(float fNewPos); + void videoOutputChanged(int nVoutCount); public: libvlc_media_player_t* m_pVlcPlayer; From a68f18c9f25dc54421b7cede4093302ffe242d4d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 7 May 2024 19:55:22 +0600 Subject: [PATCH 48/88] Fix bug #67897 --- OOXML/XlsbFormat/WorkBookStream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsbFormat/WorkBookStream.cpp b/OOXML/XlsbFormat/WorkBookStream.cpp index 050304b305..c9f2c30062 100644 --- a/OOXML/XlsbFormat/WorkBookStream.cpp +++ b/OOXML/XlsbFormat/WorkBookStream.cpp @@ -522,7 +522,7 @@ void WorkBookStream::UpdateXti(XLS::GlobalWorkbookInfo* global_info_) else if (xti->itabFirst < global_info_->sheets_info.size()) { strRange = XMLSTUFF::name2sheet_name(global_info_->sheets_info[xti->itabFirst].name, L""); - if (xti->itabFirst != xti->itabLast) + if (xti->itabFirst != xti->itabLast && xti->itabLast < global_info_->sheets_info.size()) { strRange += std::wstring(L":") + XMLSTUFF::name2sheet_name(global_info_->sheets_info[xti->itabLast].name, L""); } From de1c08d65a2ba012f7550ae92000d1d76700c42a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 7 May 2024 20:40:12 +0600 Subject: [PATCH 49/88] Fix bug #67898 --- MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp b/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp index ca0dabd042..2ff7d550bf 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp @@ -807,8 +807,8 @@ void GlobalsSubstream::UpdateDefineNames() else { std::vector ar(ind_sheet + 1); - - ar[ind_sheet] = value; + if(ar.size() > ind_sheet) + ar[ind_sheet] = value; //ar.push_back(value); global_info_->mapDefineNames.insert(std::make_pair(name, ar)); From 3104f84768906391fd63827edcc01132338ed5b9 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 8 May 2024 10:53:05 +0300 Subject: [PATCH 50/88] fix bug #67876 --- OOXML/Binary/Document/BinReader/Readers.h | 3 +- .../Document/DocWrapper/DocxSerializer.cpp | 282 +++++++++--------- .../Document/DocWrapper/DocxSerializer.h | 4 +- .../Document/DocWrapper/XlsxSerializer.cpp | 4 + .../Document/DocWrapper/XlsxSerializer.h | 2 + OOXML/Binary/Presentation/PPTXWriter.cpp | 4 + OOXML/Binary/Presentation/PPTXWriter.h | 5 +- OOXML/Binary/Sheets/Writer/BinaryReader.cpp | 8 +- OOXML/Binary/Sheets/Writer/BinaryReader.h | 2 +- .../DrawingConverter/ASCOfficePPTXFile.h | 6 +- .../ASCOfficePPTXFileRealization.cpp | 8 +- OOXML/PPTXFormat/Presentation.cpp | 3 +- X2tConverter/src/lib/docx.h | 1 + X2tConverter/src/lib/pptx.h | 1 + X2tConverter/src/lib/xlsx.h | 1 + 15 files changed, 185 insertions(+), 149 deletions(-) diff --git a/OOXML/Binary/Document/BinReader/Readers.h b/OOXML/Binary/Document/BinReader/Readers.h index d04c875f17..d32e5bde64 100644 --- a/OOXML/Binary/Document/BinReader/Readers.h +++ b/OOXML/Binary/Document/BinReader/Readers.h @@ -509,9 +509,10 @@ private: Writers::FileWriter& m_oFileWriter; std::wstring m_sFileInDir; bool m_bMacro = false; - bool m_bMacroRead = false; bool m_bOForm = false; public: + bool m_bMacroRead = false; + BinaryFileReader(std::wstring& sFileInDir, NSBinPptxRW::CBinaryFileReader& oBufferedStream, Writers::FileWriter& oFileWriter, bool bMacro = false, bool bOForm = false); int ReadFile(); int ReadMainTable(); diff --git a/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp b/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp index b4d887a3e6..20b1760ee0 100644 --- a/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp +++ b/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp @@ -320,165 +320,167 @@ bool BinDocxRW::CDocxSerializer::CreateDocxFolders(std::wstring strDirectory, st } bool BinDocxRW::CDocxSerializer::loadFromFile(const std::wstring& sSrcFileName, const std::wstring& sDstPath, const std::wstring& sXMLOptions, const std::wstring& sThemePath, const std::wstring& sMediaPath, const std::wstring& sEmbedPath) { - bool bResultOk = false; RELEASEOBJECT(m_pCurFileWriter); NSFile::CFileBinary oFile; - if(oFile.OpenFile(sSrcFileName)) + if (false == oFile.OpenFile(sSrcFileName)) return false; + + bool bResultOk = false; + + DWORD nBase64DataSize = 0; + BYTE* pBase64Data = new BYTE[oFile.GetFileSize()]; + oFile.ReadFile(pBase64Data, oFile.GetFileSize(), nBase64DataSize); + oFile.CloseFile(); + + //проверяем формат + bool bValidFormat = false; + std::wstring sSignature(g_sFormatSignature); + int nSigLength = (int)sSignature.length(); + + if ((int)nBase64DataSize > nSigLength) { - DWORD nBase64DataSize = 0; - BYTE* pBase64Data = new BYTE[oFile.GetFileSize()]; - oFile.ReadFile(pBase64Data, oFile.GetFileSize(), nBase64DataSize); - oFile.CloseFile(); - - //проверяем формат - bool bValidFormat = false; - std::wstring sSignature(g_sFormatSignature); - int nSigLength = (int)sSignature.length(); - - if ((int)nBase64DataSize > nSigLength) + std::string sCurSig((char*)pBase64Data, nSigLength); + if (sSignature == std::wstring(sCurSig.begin(), sCurSig.end())) { - std::string sCurSig((char*)pBase64Data, nSigLength); - if(sSignature == std::wstring(sCurSig.begin(), sCurSig.end())) - { - bValidFormat = true; - } + bValidFormat = true; } - if(bValidFormat) - { - //Читаем из файла версию и длину base64 - int nIndex = nSigLength; - int nType = 0; - std::string version = ""; - std::string dst_len = ""; - - while (nIndex < nBase64DataSize) - { - nIndex++; - BYTE _c = pBase64Data[nIndex]; - if (_c == ';') - { - if(0 == nType) - { - nType = 1; - continue; - } - else - { - nIndex++; - break; - } - } - if(0 == nType) - version += _c; - else - dst_len += _c; - } - int nVersion = g_nFormatVersion; - if(!version.empty()) - { - version = version.substr(1); - g_nCurFormatVersion = nVersion = std::stoi(version.c_str()); - } - bool bIsNoBase64 = nVersion == g_nFormatVersionNoBase64; + } + if (bValidFormat) + { + //Читаем из файла версию и длину base64 + int nIndex = nSigLength; + int nType = 0; + std::string version = ""; + std::string dst_len = ""; - NSBinPptxRW::CDrawingConverter oDrawingConverter; - NSBinPptxRW::CBinaryFileReader& oBufferedStream = *oDrawingConverter.m_pReader; - int nDataSize = 0; - BYTE* pData = NULL; - if (!bIsNoBase64) + while (nIndex < nBase64DataSize) + { + nIndex++; + BYTE _c = pBase64Data[nIndex]; + if (_c == ';') { - nDataSize = atoi(dst_len.c_str()); - pData = new BYTE[nDataSize]; - if(Base64::Base64Decode((const char*)(pBase64Data + nIndex), nBase64DataSize - nIndex, pData, &nDataSize)) + if (0 == nType) { - oBufferedStream.Init(pData, 0, nDataSize); + nType = 1; + continue; } else { - RELEASEARRAYOBJECTS(pData); + nIndex++; + break; } } + if (0 == nType) + version += _c; + else + dst_len += _c; + } + int nVersion = g_nFormatVersion; + if (!version.empty()) + { + version = version.substr(1); + g_nCurFormatVersion = nVersion = std::stoi(version.c_str()); + } + bool bIsNoBase64 = nVersion == g_nFormatVersionNoBase64; + + NSBinPptxRW::CDrawingConverter oDrawingConverter; + NSBinPptxRW::CBinaryFileReader& oBufferedStream = *oDrawingConverter.m_pReader; + int nDataSize = 0; + BYTE* pData = NULL; + if (!bIsNoBase64) + { + nDataSize = atoi(dst_len.c_str()); + pData = new BYTE[nDataSize]; + if (Base64::Base64Decode((const char*)(pBase64Data + nIndex), nBase64DataSize - nIndex, pData, &nDataSize)) + { + oBufferedStream.Init(pData, 0, nDataSize); + } else - { - nDataSize = nBase64DataSize; - pData = pBase64Data; - oBufferedStream.Init(pData, 0, nDataSize); - oBufferedStream.Seek(nIndex); - } - - - if (NULL != pData) - { - oDrawingConverter.SetMainDocument(this); - oDrawingConverter.SetDstPath(sDstPath + FILE_SEPARATOR_STR + L"word"); - - oDrawingConverter.SetMediaDstPath(sMediaPath); - oDrawingConverter.SetEmbedDstPath(sEmbedPath); - - m_pCurFileWriter = new Writers::FileWriter(sDstPath, m_sFontDir, false, nVersion, &oDrawingConverter, sThemePath); - - //папка с картинками - std::wstring strFileInDir = NSSystemPath::GetDirectoryName(sSrcFileName); - std::wstring sFileInDir = strFileInDir.c_str(); - - oDrawingConverter.SetSrcPath(sFileInDir); - - BinaryFileReader oBinaryFileReader(sFileInDir, oBufferedStream, *m_pCurFileWriter, m_bIsMacro, m_bIsOForm); - oBinaryFileReader.ReadFile(); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //themes - m_pCurFileWriter->m_oTheme.Write(sThemePath); - - OOX::CContentTypes *pContentTypes = oDrawingConverter.GetContentTypes(); - //docProps - OOX::CPath pathDocProps = sDstPath + FILE_SEPARATOR_STR + _T("docProps"); - NSDirectory::CreateDirectory(pathDocProps.GetPath()); - - OOX::CPath DocProps = std::wstring(_T("docProps")); - - if (NULL != m_pCurFileWriter->m_pApp) - { - m_pCurFileWriter->m_pApp->write(pathDocProps + FILE_SEPARATOR_STR + _T("app.xml"), DocProps, *pContentTypes); - } - else - { - OOX::CApp pApp(NULL); - pApp.SetDefaults(); - pApp.write(pathDocProps + FILE_SEPARATOR_STR + _T("app.xml"), DocProps, *pContentTypes); - } - - if (NULL != m_pCurFileWriter->m_pCore) - { - m_pCurFileWriter->m_pCore->write(pathDocProps + FILE_SEPARATOR_STR + _T("core.xml"), DocProps, *pContentTypes); - } - else - { - OOX::CCore pCore(NULL); - pCore.SetDefaults(); - pCore.write(pathDocProps + FILE_SEPARATOR_STR + _T("core.xml"), DocProps, *pContentTypes); - } - - if (NULL != m_pCurFileWriter->m_pCustomProperties) - { - m_pCurFileWriter->m_pCustomProperties->write(pathDocProps + FILE_SEPARATOR_STR + _T("custom.xml"), DocProps, *pContentTypes); - } - -///////////////////////////////////////////////////////////////////////////////////// - m_pCurFileWriter->Write(); - pContentTypes->Write(sDstPath); - - bResultOk = true; - - } - if (!bIsNoBase64) { RELEASEARRAYOBJECTS(pData); } + } + else + { + nDataSize = nBase64DataSize; + pData = pBase64Data; + oBufferedStream.Init(pData, 0, nDataSize); + oBufferedStream.Seek(nIndex); + } + + if (NULL != pData) + { + oDrawingConverter.SetMainDocument(this); + oDrawingConverter.SetDstPath(sDstPath + FILE_SEPARATOR_STR + L"word"); + + oDrawingConverter.SetMediaDstPath(sMediaPath); + oDrawingConverter.SetEmbedDstPath(sEmbedPath); + + m_pCurFileWriter = new Writers::FileWriter(sDstPath, m_sFontDir, false, nVersion, &oDrawingConverter, sThemePath); + + //папка с картинками + std::wstring strFileInDir = NSSystemPath::GetDirectoryName(sSrcFileName); + std::wstring sFileInDir = strFileInDir.c_str(); + + oDrawingConverter.SetSrcPath(sFileInDir); + + BinaryFileReader oBinaryFileReader(sFileInDir, oBufferedStream, *m_pCurFileWriter, m_bIsMacro, m_bIsOForm); + oBinaryFileReader.ReadFile(); + + m_bIsMacro = m_bIsMacro && oBinaryFileReader.m_bMacroRead; + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //themes + m_pCurFileWriter->m_oTheme.Write(sThemePath); + + OOX::CContentTypes* pContentTypes = oDrawingConverter.GetContentTypes(); + //docProps + OOX::CPath pathDocProps = sDstPath + FILE_SEPARATOR_STR + _T("docProps"); + NSDirectory::CreateDirectory(pathDocProps.GetPath()); + + OOX::CPath DocProps = std::wstring(_T("docProps")); + + if (NULL != m_pCurFileWriter->m_pApp) + { + m_pCurFileWriter->m_pApp->write(pathDocProps + FILE_SEPARATOR_STR + _T("app.xml"), DocProps, *pContentTypes); + } + else + { + OOX::CApp pApp(NULL); + pApp.SetDefaults(); + pApp.write(pathDocProps + FILE_SEPARATOR_STR + _T("app.xml"), DocProps, *pContentTypes); + } + + if (NULL != m_pCurFileWriter->m_pCore) + { + m_pCurFileWriter->m_pCore->write(pathDocProps + FILE_SEPARATOR_STR + _T("core.xml"), DocProps, *pContentTypes); + } + else + { + OOX::CCore pCore(NULL); + pCore.SetDefaults(); + pCore.write(pathDocProps + FILE_SEPARATOR_STR + _T("core.xml"), DocProps, *pContentTypes); + } + + if (NULL != m_pCurFileWriter->m_pCustomProperties) + { + m_pCurFileWriter->m_pCustomProperties->write(pathDocProps + FILE_SEPARATOR_STR + _T("custom.xml"), DocProps, *pContentTypes); + } + + ///////////////////////////////////////////////////////////////////////////////////// + m_pCurFileWriter->Write(); + pContentTypes->Write(sDstPath); + + bResultOk = true; } - RELEASEARRAYOBJECTS(pBase64Data); + if (!bIsNoBase64) + { + RELEASEARRAYOBJECTS(pData); + } + } + RELEASEARRAYOBJECTS(pBase64Data); + return bResultOk; } bool BinDocxRW::CDocxSerializer::getXmlContent(NSBinPptxRW::CBinaryFileReader& oBufferedStream, long lLength, std::wstring& sOutputXml) @@ -613,6 +615,10 @@ void BinDocxRW::CDocxSerializer::setMacroEnabled(bool val) { m_bIsMacro = val; } +bool BinDocxRW::CDocxSerializer::getMacroEnabled() +{ + return m_bIsMacro; +} void BinDocxRW::CDocxSerializer::setOFormEnabled(bool val) { m_bIsOForm = val; diff --git a/OOXML/Binary/Document/DocWrapper/DocxSerializer.h b/OOXML/Binary/Document/DocWrapper/DocxSerializer.h index 57d7935976..bd03c346f1 100644 --- a/OOXML/Binary/Document/DocWrapper/DocxSerializer.h +++ b/OOXML/Binary/Document/DocWrapper/DocxSerializer.h @@ -82,7 +82,9 @@ namespace BinDocxRW void setIsNoBase64Save (bool val); void setIsNoBase64 (bool val); void setSaveChartAsImg (bool val); - void setMacroEnabled (bool val); void setOFormEnabled (bool val); + + void setMacroEnabled (bool val); + bool getMacroEnabled(); }; } diff --git a/OOXML/Binary/Document/DocWrapper/XlsxSerializer.cpp b/OOXML/Binary/Document/DocWrapper/XlsxSerializer.cpp index 962160cd71..8155853ffa 100644 --- a/OOXML/Binary/Document/DocWrapper/XlsxSerializer.cpp +++ b/OOXML/Binary/Document/DocWrapper/XlsxSerializer.cpp @@ -286,6 +286,10 @@ namespace BinXlsxRW{ { m_bIsMacro = val; } + bool CXlsxSerializer::getMacroEnabled() + { + return m_bIsMacro; + } bool CXlsxSerializer::writeChartXlsx(const std::wstring& sDstFile, NSCommon::smart_ptr &file) { diff --git a/OOXML/Binary/Document/DocWrapper/XlsxSerializer.h b/OOXML/Binary/Document/DocWrapper/XlsxSerializer.h index d0b3c381c0..e0d4fc0417 100644 --- a/OOXML/Binary/Document/DocWrapper/XlsxSerializer.h +++ b/OOXML/Binary/Document/DocWrapper/XlsxSerializer.h @@ -71,7 +71,9 @@ namespace BinXlsxRW { void setEmbeddedFontsDir(const std::wstring& sEmbeddedFontsDir); void setDrawingConverter(NSBinPptxRW::CDrawingConverter* pDrawingConverter); void setIsNoBase64 (bool val); + void setMacroEnabled (bool val); + bool getMacroEnabled (); _UINT32 xml2Xlsx (const std::wstring& sSrcFileName, const std::wstring& sDstPath, const std::wstring& sXMLOptions); diff --git a/OOXML/Binary/Presentation/PPTXWriter.cpp b/OOXML/Binary/Presentation/PPTXWriter.cpp index 2d9fd164ff..47d45c37b0 100644 --- a/OOXML/Binary/Presentation/PPTXWriter.cpp +++ b/OOXML/Binary/Presentation/PPTXWriter.cpp @@ -57,6 +57,10 @@ namespace NSBinPptxRW CPPTXWriter::~CPPTXWriter() { } + bool CPPTXWriter::GetMacroEnabled() + { + return m_oPresentation.m_bMacroEnabled; + } void CPPTXWriter::Init(std::wstring strFolder, bool bMacro) { m_strDstFolder = strFolder; diff --git a/OOXML/Binary/Presentation/PPTXWriter.h b/OOXML/Binary/Presentation/PPTXWriter.h index 51194a45a5..b14c951cfa 100644 --- a/OOXML/Binary/Presentation/PPTXWriter.h +++ b/OOXML/Binary/Presentation/PPTXWriter.h @@ -88,10 +88,13 @@ namespace NSBinPptxRW void Init(std::wstring strFolder, bool bMacro = false); void OpenPPTY(BYTE* pBuffer, int len, std::wstring srcFolder, std::wstring strThemesFolder); void ReadMasterInfo(LONG nIndexMaster); + void SetRequiredDefaultsApp(); - void CreateDefaultApp(); void SetRequiredDefaultsCore(); + bool GetMacroEnabled(); + + void CreateDefaultApp(); void CreateDefaultCore(); void CreateDefaultViewProps(); void CreateDefaultTableStyles(); diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp index bd0089227d..5b9d8f61d8 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp @@ -8552,7 +8552,7 @@ int BinaryFileReader::Xml2Xlsx(const std::wstring& sSrcFileName, std::wstring sD delete pXlsxFlat; return 0; } -int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sDstPath, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sXMLOptions, bool bMacro) +int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sDstPath, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sXMLOptions, bool &bMacro) { bool bResultOk = false; @@ -8689,6 +8689,8 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD oXlsx.PrepareToWrite(); oXlsx.Write(sDstPath, *oSaveParams.pContentTypes); + + bMacro = oSaveParams.bMacroEnabled; } else if (BinXlsxRW::c_oFileTypes::XLSB == fileType) { @@ -8708,6 +8710,8 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD oXlsb.PrepareToWrite(); oXlsb.WriteBin(sDstPath, *oSaveParams.pContentTypes); + + bMacro = oSaveParams.bMacroEnabled; } else { @@ -8719,7 +8723,7 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD bResultOk = oCSVWriter.Start(sDstPathCSV); if (!bResultOk) return AVS_FILEUTILS_ERROR_CONVERT; - SaveParams oSaveParams(drawingsPath, embeddingsPath, themePath, pOfficeDrawingConverter->GetContentTypes(), &oCSVWriter); + SaveParams oSaveParams(drawingsPath, embeddingsPath, themePath, pOfficeDrawingConverter->GetContentTypes(), &oCSVWriter, false); try { diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.h b/OOXML/Binary/Sheets/Writer/BinaryReader.h index 17ede45e95..d1551af149 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.h +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.h @@ -448,7 +448,7 @@ namespace BinXlsxRW { public: BinaryFileReader(); - int ReadFile(const std::wstring& sSrcFileName, std::wstring sDstPath, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sXMLOptions, bool bMacro = false); + int ReadFile(const std::wstring& sSrcFileName, std::wstring sDstPath, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sXMLOptions, bool &bMacro); int ReadMainTable(OOX::Spreadsheet::CXlsx& oXlsx, NSBinPptxRW::CBinaryFileReader& oBufferedStream, const std::wstring& sFileInDir, const std::wstring& sOutDir, SaveParams& oSaveParams, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter); void initWorkbook(OOX::Spreadsheet::CWorkbook* pWorkbook); diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFile.h b/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFile.h index a4f61a6edb..1516e09660 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFile.h +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFile.h @@ -74,8 +74,10 @@ public: void SetThemesDir (std::wstring bsDir); void SetUseSystemFonts (bool useSystemFonts); - void SetIsNoBase64 (bool val); - void SetMacroEnabled (bool val); + void SetIsNoBase64 (bool val); + + void SetMacroEnabled (bool val); + bool GetMacroEnabled (); _UINT32 OpenFileToPPTY (std::wstring bsInput, std::wstring bsOutput); _UINT32 OpenDirectoryToPPTY (std::wstring bsInput, std::wstring bsOutput); diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFileRealization.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFileRealization.cpp index ba599090a9..091a4cb702 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFileRealization.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficePPTXFileRealization.cpp @@ -176,6 +176,10 @@ void CPPTXFile::SetMacroEnabled(bool val) { m_bIsMacro = val; } +bool CPPTXFile::GetMacroEnabled() +{ + return m_bIsMacro; +} _UINT32 CPPTXFile::OpenFileToPPTY(std::wstring bsInput, std::wstring bsOutput) { if (m_strTempDir.empty()) m_strTempDir = NSDirectory::GetTempPath(); @@ -261,7 +265,7 @@ _UINT32 CPPTXFile::ConvertPPTYToPPTX(std::wstring bsInput, std::wstring bsOutput BYTE* pSrcBuffer = new BYTE[lFileSize]; oFileBinary.ReadFile(pSrcBuffer, (DWORD)lFileSize); oFileBinary.CloseFile(); - + std::wstring strBsInput = bsInput; std::wstring srcFolder = NSDirectory::GetFolderPath(strBsInput); @@ -275,8 +279,8 @@ _UINT32 CPPTXFile::ConvertPPTYToPPTX(std::wstring bsInput, std::wstring bsOutput { hRes = S_FALSE; } - RELEASEARRAYOBJECTS(pSrcBuffer); + m_bIsMacro = oWriter.GetMacroEnabled(); return hRes; } diff --git a/OOXML/PPTXFormat/Presentation.cpp b/OOXML/PPTXFormat/Presentation.cpp index d7eb9890b7..46ba195f6b 100644 --- a/OOXML/PPTXFormat/Presentation.cpp +++ b/OOXML/PPTXFormat/Presentation.cpp @@ -371,8 +371,9 @@ namespace PPTX } } } - pReader->Seek(_end_pos); + + m_bMacroEnabled = m_pVbaProject.IsInit(); } void Presentation::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const diff --git a/X2tConverter/src/lib/docx.h b/X2tConverter/src/lib/docx.h index 66148a5f70..224935cdfc 100644 --- a/X2tConverter/src/lib/docx.h +++ b/X2tConverter/src/lib/docx.h @@ -180,6 +180,7 @@ namespace NExtractTools if (SUCCEEDED_X2T(nRes)) { nRes = m_oCDocxSerializer.loadFromFile(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, sXmlOptions, sThemePath, sMediaPath, sEmbedPath) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + params.m_bMacro = m_oCDocxSerializer.getMacroEnabled(); } // удаляем EditorWithChanges, потому что он не в Temp if (sFrom != sTargetBin) diff --git a/X2tConverter/src/lib/pptx.h b/X2tConverter/src/lib/pptx.h index aedc08340b..9da4314f32 100644 --- a/X2tConverter/src/lib/pptx.h +++ b/X2tConverter/src/lib/pptx.h @@ -169,6 +169,7 @@ namespace NExtractTools pptx_file->SetFontDir(params.getFontPath()); nRes = (S_OK == pptx_file->ConvertPPTYToPPTX(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, convertParams.m_sThemesDir)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + params.m_bMacro = pptx_file->GetMacroEnabled(); delete pptx_file; } // удаляем EditorWithChanges, потому что он не в Temp diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index 3e7e5e8132..5a894bff43 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -284,6 +284,7 @@ namespace NExtractTools if (SUCCEEDED_X2T(nRes)) { nRes = oCXlsxSerializer.loadFromFile(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, sXmlOptions, sMediaPath, sEmbedPath); + params.m_bMacro = oCXlsxSerializer.getMacroEnabled(); } // удаляем EditorWithChanges, потому что он не в Temp if (sFrom != sTargetBin) From dabe547fb41cbac0850bf169ab991be14b9976cf Mon Sep 17 00:00:00 2001 From: Michael Efremov Date: Wed, 8 May 2024 11:32:29 +0300 Subject: [PATCH 51/88] [android] Build only arm arch --- X2tConverter/build/Android/libx2t/build.gradle.kts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/X2tConverter/build/Android/libx2t/build.gradle.kts b/X2tConverter/build/Android/libx2t/build.gradle.kts index 8f2c3dcb39..458116abac 100644 --- a/X2tConverter/build/Android/libx2t/build.gradle.kts +++ b/X2tConverter/build/Android/libx2t/build.gradle.kts @@ -63,19 +63,25 @@ android { ) } } - - ndk { - abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) - } } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + ndk { + abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) + } } debug { isJniDebuggable = true + ndk { + if (System.getProperty("os.arch") == "aarch64") { + abiFilters.add("arm64-v8a") + } else { + abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) + } + } } } From 39748f9d9e3526425c4c9d86c41ccad5ea368962 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 8 May 2024 11:49:04 +0300 Subject: [PATCH 52/88] fix bug #67895 --- MsBinaryFile/PptFile/Drawing/Document.h | 4 +- MsBinaryFile/PptFile/Main/PPTFormatLib.cpp | 6 +-- MsBinaryFile/PptFile/PPTXWriter/Converter.cpp | 4 +- MsBinaryFile/PptFile/Reader/ClassesAtom.cpp | 4 +- .../PptFile/Reader/PPTDocumentInfo.cpp | 12 +++--- MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h | 2 +- .../PptFile/Reader/PPTDocumentInfoOneUser.cpp | 40 ++++++++++--------- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/MsBinaryFile/PptFile/Drawing/Document.h b/MsBinaryFile/PptFile/Drawing/Document.h index a3dff96e2c..62a5c11fbf 100644 --- a/MsBinaryFile/PptFile/Drawing/Document.h +++ b/MsBinaryFile/PptFile/Drawing/Document.h @@ -52,10 +52,10 @@ public: CThemePtr m_pNotesMaster; CThemePtr m_pHandoutMaster; - bool m_bMacros; + bool m_bMacroEnabled; std::wstring m_sVbaProjectFile; - CDocument() : m_bMacros (true) + CDocument() : m_bMacroEnabled(true) { m_lSlideWidth = 0; m_lSlideHeight = 0; diff --git a/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp b/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp index c985bfa9f9..4a20e696f3 100644 --- a/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp +++ b/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp @@ -53,7 +53,7 @@ COfficePPTFile::~COfficePPTFile() CloseFile(); } -_UINT32 COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring & password, bool &bMacros) +_UINT32 COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring & password, bool &bMacro) { CloseFile(); @@ -76,7 +76,7 @@ _UINT32 COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstr PPT::CPPTFileReader* pptReader = (PPT::CPPTFileReader*)m_pReader; pptReader->m_oDocumentInfo.m_strPassword = password; - pptReader->m_oDocumentInfo.m_bMacros = bMacros; + pptReader->m_oDocumentInfo.m_bMacroEnabled = bMacro; if (pptReader->IsPowerPoint() == false) { @@ -98,7 +98,7 @@ _UINT32 COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstr //pptReader->ReadEncryptedSummary(); pptReader->ReadDocument(); - bMacros = pptReader->m_oDocumentInfo.m_bMacros; + bMacro = pptReader->m_oDocumentInfo.m_bMacroEnabled; m_Status = READMODE; return S_OK; diff --git a/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp b/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp index f68adec4da..943564f3c6 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp @@ -239,7 +239,7 @@ namespace PPT \ "; - if (m_pDocument->m_bMacros) + if (m_pDocument->m_bMacroEnabled) { strContentTypes += L"\ "; @@ -535,7 +535,7 @@ namespace PPT strPresRels += L""; strPresRels += L""; - if (m_pDocument->m_bMacros) + if (m_pDocument->m_bMacroEnabled) { std::wstring strVbaProject = m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"vbaProject.bin"; diff --git a/MsBinaryFile/PptFile/Reader/ClassesAtom.cpp b/MsBinaryFile/PptFile/Reader/ClassesAtom.cpp index c22eabd85d..e173a623cb 100644 --- a/MsBinaryFile/PptFile/Reader/ClassesAtom.cpp +++ b/MsBinaryFile/PptFile/Reader/ClassesAtom.cpp @@ -68,8 +68,8 @@ void CUserEdit::FromAtom(CRecordUserEditAtom *pAtom) CCurrentUser::CCurrentUser() { - m_bIsEncrypt = false; - m_nOffsetToCurrentEdit = 0; + m_bIsEncrypt = false; + m_nOffsetToCurrentEdit = 0; } CCurrentUser::~CCurrentUser() diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp index 8814c00b2e..067edc0275 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp @@ -33,7 +33,7 @@ using namespace PPT; -CPPTDocumentInfo::CPPTDocumentInfo() : m_oCurrentUser(), m_bMacros(true), m_pStream(NULL) +CPPTDocumentInfo::CPPTDocumentInfo() : m_oCurrentUser(), m_bMacroEnabled(true), m_pStream(NULL) { } @@ -79,14 +79,13 @@ bool CPPTDocumentInfo::ReadFromStream(CRecordCurrentUserAtom *pCurrentUser, POLE pInfo->m_pDocumentInfo = this; - pInfo->m_bEncrypt = m_oCurrentUser.m_bIsEncrypt; - pInfo->m_strPassword = m_strPassword; - pInfo->m_bMacros = m_bMacros; + pInfo->m_bEncrypt = m_oCurrentUser.m_bIsEncrypt; + pInfo->m_strPassword = m_strPassword; + pInfo->m_bMacroEnabled = m_bMacroEnabled; bool bResult = pInfo->ReadFromStream(&oUserAtom, pStream); - m_bMacros = pInfo->m_bMacros; - offsetToEdit = pInfo->m_oUser.m_nOffsetLastEdit; + offsetToEdit = pInfo->m_oUser.m_nOffsetLastEdit; m_oCurrentUser.m_bIsEncrypt = pInfo->m_bEncrypt; if (bResult == false) @@ -106,7 +105,6 @@ bool CPPTDocumentInfo::ReadFromStream(CRecordCurrentUserAtom *pCurrentUser, POLE pInfo = NULL; } - return true; } std::wstring CPPTDocumentInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h index 40dde44c55..dfa8caa5eb 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h @@ -47,7 +47,7 @@ public: std::vector m_arUsers; std::map m_mapStoreImageFile; std::wstring m_strPassword; - bool m_bMacros; + bool m_bMacroEnabled; std::wstring m_app_xml; std::wstring m_core_xml; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp index 695ef503be..70603dae79 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp @@ -409,26 +409,7 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) m_mapHandoutMasters.insert(std::pair<_UINT32, CRecordSlide*>(0, pSlide)); } } - if (m_bMacros) - { - m_bMacros = false; - std::vector oArrayDocInfo; - m_oDocument.GetRecordsByType(&oArrayDocInfo, true, true); - CRecordVBAInfoAtom* pVbaAtom = nullptr; - if (!oArrayDocInfo.empty()) - pVbaAtom = oArrayDocInfo[0]->getVBAInfoAtom(); - - if (pVbaAtom) - { - if (pVbaAtom->m_nHasMacros) - { - m_sVbaProjectFile = m_pDocumentInfo->GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); - - m_bMacros = (false == m_sVbaProjectFile.empty()); - } - } - } return true; } //-------------------------------------------------------------------------------------------- @@ -480,6 +461,27 @@ void CPPTUserInfo::ReadExtenalObjects() m_bIsSetupEmpty = TRUE; m_arrBlipStore[0]->SetUpPicturesInfos(&m_arOffsetPictures); } + + if (m_bMacroEnabled) + { + m_bMacroEnabled = false; + std::vector oArrayDocInfo; + m_oDocument.GetRecordsByType(&oArrayDocInfo, true, true); + + CRecordVBAInfoAtom* pVbaAtom = nullptr; + if (!oArrayDocInfo.empty()) + pVbaAtom = oArrayDocInfo[0]->getVBAInfoAtom(); + + if (pVbaAtom) + { + if (pVbaAtom->m_nHasMacros) + { + m_sVbaProjectFile = m_pDocumentInfo->GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); + + m_bMacroEnabled = (false == m_sVbaProjectFile.empty()); + } + } + } } void CPPTUserInfo::FromDocument() From b32728c9f0968ceac31a24ea358ff5543e883a3f Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 8 May 2024 12:06:28 +0300 Subject: [PATCH 53/88] fix bug #66842 --- OdfFile/DataTypes/iconset_type.cpp | 10 ++++++---- .../Reader/Converter/xlsx_conditionalFormatting.cpp | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/OdfFile/DataTypes/iconset_type.cpp b/OdfFile/DataTypes/iconset_type.cpp index 8239ab3a77..b2b1b8ec90 100644 --- a/OdfFile/DataTypes/iconset_type.cpp +++ b/OdfFile/DataTypes/iconset_type.cpp @@ -147,13 +147,15 @@ iconset_type iconset_type::parse(const std::wstring & Str) return iconset_type( Quarters5 ); else if (tmp == L"5rating") return iconset_type( Rating5 ); - else if (tmp == L"5Boxes") + else if (tmp == L"5boxes") return iconset_type( Boxes5 ); - else if (tmp == L"3Stars") + else if (tmp == L"3stars") return iconset_type(Stars3); - else if (tmp == L"3Triangles") + else if (tmp == L"3triangles") return iconset_type(Triangles3); - else + else if (tmp == L"4rating") + return iconset_type(Rating4); + else { return iconset_type( Arrows3 ); } diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index a6358c9f98..009df1e93f 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -266,6 +266,7 @@ public: { if (c.rules[j].icon_set_type) { + int h = *c.rules[j].icon_set_type; switch (*c.rules[j].icon_set_type) { case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; @@ -286,7 +287,7 @@ public: case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; case 17: CP_XML_ATTR(L"iconSet", L"3Triangles"); break; case 18: CP_XML_ATTR(L"iconSet", L"3Stars"); break; - case 19: CP_XML_ATTR(L"iconSet", L"5Boxes"); break; + case 19: CP_XML_ATTR(L"iconSet", L"5Boxes"); break; //todooo to ext case 0: default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; break; From 7e7bc0eb0eda2635434cfb68448c3c15930dfb4d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 8 May 2024 15:39:02 +0600 Subject: [PATCH 54/88] Fix bug #67891 --- MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp | 14 +++++++------- MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h | 6 +++--- .../Format/Logic/Biff_structures/CellRangeRef.cpp | 10 +++++----- OOXML/XlsxFormat/Worksheets/MergeCells.cpp | 2 +- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 8 ++++---- .../XlsxFormat/Worksheets/WorksheetChildOther.cpp | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index 74e5eb3547..38bbc1fdeb 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -73,9 +73,9 @@ const int normalizeColumn(const int column, const bool xlsb) } -const std::wstring column2str(const int column, const bool col_rel) +const std::wstring column2str(const int column, const bool col_rel, const bool xlsb) { - int column_value = normalizeColumn(column); + int column_value = normalizeColumn(column, xlsb); const int radix = L'Z' - L'A' + 1; std::wstring ret_val; ++column_value; @@ -90,7 +90,7 @@ const std::wstring column2str(const int column, const bool col_rel) } -const int normalizeRow(const int row, bool xlsb) +const int normalizeRow(const int row, const bool xlsb) { int maxRow = 0; if(xlsb) @@ -114,16 +114,16 @@ const int normalizeRow(const int row, bool xlsb) } -const std::wstring row2str(const int row, const bool row_rel) +const std::wstring row2str(const int row, const bool row_rel, const bool xlsb) { - int row_value = normalizeRow(row); + int row_value = normalizeRow(row, xlsb); return (row_rel ? L"" : L"$") + STR::int2wstr(row_value + 1, 10); } -const std::wstring loc2str(const int row, const bool row_rel, const int column, const bool col_rel) +const std::wstring loc2str(const int row, const bool row_rel, const int column, const bool col_rel, const bool xlsb) { - return column2str(column, col_rel) + row2str(row, row_rel); + return column2str(column, col_rel, xlsb) + row2str(row, row_rel, xlsb); } diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h index 93c60f4f19..305d406691 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h @@ -45,9 +45,9 @@ namespace AUX const int normalizeColumn (const int column, const bool xlsb = false); const int normalizeRow (const int row, const bool xlsb = false); - const std::wstring column2str (const int column, const bool col_rel); - const std::wstring row2str (const int row, const bool row_rel); - const std::wstring loc2str (const int row, const bool row_rel, const int column, const bool col_rel); + const std::wstring column2str (const int column, const bool col_rel, const bool xlsb = false); + const std::wstring row2str (const int row, const bool row_rel, const bool xlsb = false); + const std::wstring loc2str (const int row, const bool row_rel, const int column, const bool col_rel, const bool xlsb = false); void str2loc (const std::wstring& str, int& row, bool& row_rel, int& column, bool& col_rel); void str2loc (std::wstring::const_iterator& str_begin, std::wstring::const_iterator& str_end, int& row, bool& row_rel, int& column, bool& col_rel); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp index 5e7b73de5e..8c05c0ff1a 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp @@ -141,7 +141,7 @@ const std::wstring CellRangeRef::toString(const bool useShortForm, const bool xl { if(useShortForm) { - return to_string_cache = AUX::column2str(columnFirst_norm, columnFirstRelative) + L':' + AUX::column2str(columnLast_norm, columnLastRelative); + return to_string_cache = AUX::column2str(columnFirst_norm, columnFirstRelative, xlsb) + L':' + AUX::column2str(columnLast_norm, columnLastRelative, xlsb); } else { @@ -152,7 +152,7 @@ const std::wstring CellRangeRef::toString(const bool useShortForm, const bool xl { if(useShortForm) { - return to_string_cache = AUX::row2str(rowFirst_norm, rowFirstRelative) + L':' + AUX::row2str(rowLast_norm, rowLastRelative); + return to_string_cache = AUX::row2str(rowFirst_norm, rowFirstRelative, xlsb) + L':' + AUX::row2str(rowLast_norm, rowLastRelative, xlsb); } else { @@ -161,12 +161,12 @@ const std::wstring CellRangeRef::toString(const bool useShortForm, const bool xl } if(columnLast_norm == columnFirst_norm && rowFirst_norm == rowLast_norm) // single cell { - return to_string_cache = AUX::loc2str(rowFirst_norm, rowFirstRelative, columnFirst_norm, columnFirstRelative); + return to_string_cache = AUX::loc2str(rowFirst_norm, rowFirstRelative, columnFirst_norm, columnFirstRelative, xlsb); } else { - return to_string_cache = AUX::loc2str(rowFirst_norm, rowFirstRelative, columnFirst_norm, columnFirstRelative) + - L':' + AUX::loc2str(rowLast_norm, rowLastRelative, columnLast_norm, columnLastRelative); + return to_string_cache = AUX::loc2str(rowFirst_norm, rowFirstRelative, columnFirst_norm, columnFirstRelative, xlsb) + + L':' + AUX::loc2str(rowLast_norm, rowLastRelative, columnLast_norm, columnLastRelative, xlsb); } } return to_string_cache; diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp index b677a0291a..911b6499df 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp @@ -91,7 +91,7 @@ namespace OOX void CMergeCell::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); - m_oRef = ptr->rfx.toString(); + m_oRef = ptr->rfx.toString(true, true); } CMergeCells::CMergeCells(OOX::Document *pMain) : WritingElementWithChilds(pMain) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index d0da1cf9dd..58e2614856 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1050,7 +1050,7 @@ namespace OOX auto formula = dynamic_cast(obj.get()); m_sText = formula->formula.getAssembledFormula(); m_oRef.Init(); - m_oRef = formula->rfx.toString(); + m_oRef = formula->rfx.toString(true, true); } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeArray: @@ -1063,7 +1063,7 @@ namespace OOX m_oAca = formula->fAlwaysCalc; } m_oRef.Init(); - m_oRef = formula->rfx.toString(); + m_oRef = formula->rfx.toString(true, true); } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeDataTable: @@ -1078,7 +1078,7 @@ namespace OOX } m_oRef.Init(); - m_oRef = dataTable->rfx.toString(); + m_oRef = dataTable->rfx.toString(true, true); if(dataTable->fRw) { @@ -2501,7 +2501,7 @@ namespace OOX } - auto wRef = XLSB::RgceLoc(m_oRow.get(), m_oCol.get(), true, true).toString(); + auto wRef = XLSB::RgceLoc(m_oRow.get(), m_oCol.get(), true, true).toString(true); m_oRef = std::string(wRef.begin(), wRef.end()); if(pSource != nullptr) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 8fd1f88385..e5c54f10d4 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -933,7 +933,7 @@ namespace OOX { auto ptr = static_cast(obj.get()); if (ptr != nullptr) - m_oRef = ptr->rfx.toString(); + m_oRef = ptr->rfx.toString(true, true); } CSheetFormatPr::CSheetFormatPr() @@ -3105,7 +3105,7 @@ namespace OOX m_oName = ptr->xstrName.value(); if (!ptr->rfx.toString().empty()) - m_oRef = ptr->rfx.toString(); + m_oRef = ptr->rfx.toString(true, true); if (!ptr->xstrSheet.value().empty()) m_oSheet = ptr->xstrSheet.value(); From 7ae79f20b8d3f71632a52e15cdf37e88e3e2cec6 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 8 May 2024 15:12:22 +0500 Subject: [PATCH 55/88] Fix bug #67822 --- OdfFile/Reader/Format/draw_frame_pptx.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 83927b7898..c4bc03f11d 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -493,6 +493,10 @@ void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context) if (Context.get_mediaitems()->is_internal_path(href, folderPath)) { std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + NSFile::CFileBinary objectFile; + objectFile.OpenFile(objectPath); + if (objectFile.SizeFile() == 0) + return; std::wstring prog, extension; oox::_rels_type relsType; From d8bed77b679fcbc8d24b71c63086ad42b4f62d66 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 8 May 2024 17:05:49 +0500 Subject: [PATCH 56/88] Fix bug #67823 --- OdfFile/Reader/Converter/xlsx_drawing.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OdfFile/Reader/Converter/xlsx_drawing.cpp b/OdfFile/Reader/Converter/xlsx_drawing.cpp index 8648095719..e673b5fd07 100644 --- a/OdfFile/Reader/Converter/xlsx_drawing.cpp +++ b/OdfFile/Reader/Converter/xlsx_drawing.cpp @@ -174,6 +174,7 @@ void xml_serialize_image(std::wostream & strm, _xlsx_drawing & val, const std::w CP_XML_NODE(L"a:avLst"); } oox_serialize_ln(CP_XML_STREAM(), val.additional); + oox_serialize_effects(CP_XML_STREAM(), val.additional); } xml_serialize_text(CP_XML_STREAM(), val, ns); } @@ -209,6 +210,7 @@ void xml_serialize_shape(std::wostream & strm, _xlsx_drawing & val, const std::w val.serialize_shape(CP_XML_STREAM()); oox_serialize_ln(CP_XML_STREAM(),val.additional, val.lined); + oox_serialize_effects(CP_XML_STREAM(), val.additional); } // xdr:spPr xml_serialize_text(CP_XML_STREAM(), val, ns); From f32ace9737a881b83dc697b984d2526ed950b50b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 8 May 2024 18:50:17 +0600 Subject: [PATCH 57/88] Fix bug #67923 --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgParen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgParen.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgParen.cpp index 23e2649531..adceb38459 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgParen.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgParen.cpp @@ -51,7 +51,8 @@ BiffStructurePtr PtgParen::clone() void PtgParen::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref) { - ptg_stack.top() = L'(' + ptg_stack.top() + L')'; + if(!ptg_stack.empty()) + ptg_stack.top() = L'(' + ptg_stack.top() + L')'; } From aab5cfe30c02841a162e02a9eb82092b0a290df1 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 8 May 2024 19:15:45 +0600 Subject: [PATCH 58/88] Fix bug #67922 --- .../XlsFile/Format/Logic/Biff_structures/PtgRef3d.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef3d.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef3d.cpp index c035265ac9..5245262d0b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef3d.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef3d.cpp @@ -160,10 +160,10 @@ void PtgRef3d::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool fu { strRange = L"#REF"; } - else + else if(global_info->sheets_info.size() > itabFirst) { strRange = XMLSTUFF::name2sheet_name(global_info->sheets_info[itabFirst].name, L""); - if (itabFirst != itabLast) + if (itabFirst != itabLast && global_info->sheets_info.size() > itabLast) { strRange += std::wstring(L":") + XMLSTUFF::name2sheet_name(global_info->sheets_info[itabLast].name, L""); } From e2992c2a796da289932e2ca4edb06d4353594235 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 8 May 2024 19:33:43 +0600 Subject: [PATCH 59/88] Fix bug #67919 --- .../XlsFile/Format/Logic/Biff_structures/PtgRefErr3d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefErr3d.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefErr3d.cpp index 27a0749a50..98747d53de 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefErr3d.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefErr3d.cpp @@ -91,7 +91,7 @@ void PtgRefErr3d::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool return; } - if (ixti != 0xffff) + if (ixti != 0xffff && global_info->arXti_External.size() > ixti) { std::wstring link = global_info->arXti_External[ixti].link; if (!link.empty()) From 40e76857511270c1955a5fded2e245ed5cd9f23c Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 10 May 2024 10:40:07 +0300 Subject: [PATCH 60/88] fix bug #67941 --- MsBinaryFile/DocFile/OleObject.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/MsBinaryFile/DocFile/OleObject.cpp b/MsBinaryFile/DocFile/OleObject.cpp index 7d039d1e87..ce93658104 100644 --- a/MsBinaryFile/DocFile/OleObject.cpp +++ b/MsBinaryFile/DocFile/OleObject.cpp @@ -127,7 +127,6 @@ bool OleObject::processLinkInfoStream( const std::wstring& linkStream ) VirtualStreamReader reader( pLinkStream, 0, false); processLinkInfoStream(reader); - delete pLinkStream; res = true; } if (pLinkStream) delete pLinkStream; From 84e4797ddfe056cdaacf62b1e2b2409ecbc77f17 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 10 May 2024 10:53:02 +0300 Subject: [PATCH 61/88] fix bug #67940 --- OdfFile/Writer/Converter/MathConverter.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/OdfFile/Writer/Converter/MathConverter.cpp b/OdfFile/Writer/Converter/MathConverter.cpp index 775989c86d..abea02d0cd 100644 --- a/OdfFile/Writer/Converter/MathConverter.cpp +++ b/OdfFile/Writer/Converter/MathConverter.cpp @@ -529,6 +529,7 @@ namespace Oox2Odf bool OoxConverter::convert(OOX::Logic::COpEmu *oox_op_emu) { if (!oox_op_emu) return false; + if (!oox_op_emu->m_val.IsInit()) return false; if (oox_op_emu->m_val->ToBool())// == L"true") ||(oox_op_emu->m_val == L"1")) return true; @@ -854,6 +855,7 @@ namespace Oox2Odf std::wstring OoxConverter::convert(OOX::Logic::CType *oox_type) { if (!oox_type) return L""; + if (!oox_type->m_val.IsInit()) return L""; std::wstring val = oox_type->m_val->ToString(); @@ -1031,6 +1033,7 @@ namespace Oox2Odf bool OoxConverter::convert(OOX::Logic::CPos *oox_pos) { if (!oox_pos) return false; + if (!oox_pos->m_val.IsInit()) return false; if (oox_pos->m_val->ToString() == L"top") return true; else return false; @@ -1626,6 +1629,7 @@ std::wstring str1, str2; bool OoxConverter::convert(OOX::Logic::CSubHide *oox_subHide) { if (!oox_subHide) return false; + if (!oox_subHide->m_val.IsInit()) return false; bool result = oox_subHide->m_val->ToBool(); return result; @@ -1634,6 +1638,8 @@ std::wstring str1, str2; bool OoxConverter::convert(OOX::Logic::CSupHide *oox_supHide) { if (!oox_supHide) return false; + if (!oox_supHide->m_val.IsInit()) return false; + bool result = oox_supHide->m_val->ToBool(); return result; } @@ -1651,7 +1657,7 @@ std::wstring str1, str2; tmp->stretchy_ = false; } - if (!oox_chr) + if (!oox_chr || (oox_chr && !oox_chr->m_val.IsInit())) { annotation() += L"int "; elm->add_text(L"∫"); @@ -1747,7 +1753,8 @@ std::wstring str1, str2; bool OoxConverter::convert(OOX::Logic::CDegHide *oox_deg_hide) { if (!oox_deg_hide) return false; - + if (!oox_deg_hide->m_val.IsInit()) return false; + return oox_deg_hide->m_val->ToBool(); } From 83e020f4924e214d4d4b16793947329802a82a2d Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Thu, 9 May 2024 15:51:25 +0300 Subject: [PATCH 62/88] Fix bug #67916 --- .../raster/Metafile/Common/MetaFileUtils.h | 78 +++++++++++++------ .../Metafile/Emf/EmfParser/CEmfParser.cpp | 4 + .../Metafile/Emf/EmfParser/CEmfPlusParser.cpp | 3 + .../Metafile/Wmf/WmfParser/CWmfParser.cpp | 3 + 4 files changed, 64 insertions(+), 24 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h b/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h index ae76ba586d..7767bd9c97 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h @@ -93,7 +93,7 @@ namespace MetaFile { public: - CDataStream() : pBuffer(NULL) + CDataStream() : pBuffer(NULL), pBufferEnd(NULL), pEnd(NULL), pCur(NULL) { } @@ -103,10 +103,25 @@ namespace MetaFile void SetStream(BYTE* pBuf, unsigned int unSize) { - pBuffer = pBuf; - pCur = pBuf; - pEnd = pBuf + unSize; - }; + pBuffer = pBuf; + pCur = pBuf; + pBufferEnd = pBuf + unSize; + pEnd = pBufferEnd; + } + + void SetCurrentBlockSize(unsigned int unSize) + { + if (pCur + unSize >= pBufferEnd) + pEnd = pBufferEnd; + else + pEnd = pCur + unSize; + } + + void ClearCurrentBlockSize() + { + pEnd = pBufferEnd; + } + BYTE* GetCurPtr() { return pCur; @@ -120,7 +135,7 @@ namespace MetaFile unsigned char unResult = pCur[0]; pCur++; return unResult; - }; + } unsigned short ReadUShort() { if (pCur + 1 >= pEnd) @@ -129,7 +144,7 @@ namespace MetaFile unsigned short ushResult = (pCur[0]) | ((pCur[1]) << 8); pCur += 2; return ushResult; - }; + } unsigned int ReadULong() { if (pCur + 3 >= pEnd) @@ -138,7 +153,7 @@ namespace MetaFile unsigned int unResult = (unsigned int)((pCur[0] << 0) | ((pCur[1]) << 8) | ((pCur[2]) << 16) | ((pCur[3]) << 24)); pCur += 4; return unResult; - }; + } double ReadDouble() { if (pCur + 3 >= pEnd) @@ -159,19 +174,19 @@ namespace MetaFile int lFracValue = (int)(pCur[3]); pCur += 4; return (double)(lIntValue + (lFracValue / 16.0)); - }; + } char ReadChar() { return (char)ReadUChar(); - }; + } short ReadShort() { return (short)ReadUShort(); - }; + } int ReadLong() { return (int)ReadULong(); - }; + } void ReadBytes(unsigned char* pBuffer, unsigned int ulSize) { size_t ulRemainSize = (pEnd - pCur); @@ -181,7 +196,7 @@ namespace MetaFile { pBuffer[ulIndex] = ReadChar(); } - }; + } void ReadBytes(unsigned short* pBuffer, unsigned int ulSize) { size_t ulRemainSize = (pEnd - pCur) / 2; @@ -1047,7 +1062,7 @@ namespace MetaFile bool IsEof() const { - if (pCur >= pEnd) + if (pCur >= pBufferEnd) return true; return false; @@ -1060,7 +1075,10 @@ namespace MetaFile void Skip(unsigned int ulSkip) { - pCur += ulSkip; + if (pCur + ulSkip >= pEnd) + pCur = pEnd; + else + pCur += ulSkip; } void SeekBack(unsigned int ulSkipBack) @@ -1071,6 +1089,7 @@ namespace MetaFile void SeekToStart() { pCur = pBuffer; + ClearCurrentBlockSize(); } unsigned int CanRead() @@ -1085,21 +1104,31 @@ namespace MetaFile *this >> oText; // Читаем OutputString - const unsigned int unCharsCount = oText.unChars; - int nSkip = oText.unOffString - (unOffset + 40); // 40 - размер структуры TEmfEmrText - Skip(nSkip); - T* pString = new T[unCharsCount + 1]; + oText.unChars = std::min(oText.unChars, (UINT)(CanRead() / sizeof(T))); + + if (0 == oText.unChars) + return; + + if (oText.unOffString - 40 > unOffset) + Skip(oText.unOffString - (unOffset + 40)); // 40 - размер структуры TEmfEmrText + + T* pString = new T[oText.unChars + 1]; if (pString) { - pString[unCharsCount] = 0x00; - ReadBytes(pString, unCharsCount); + pString[oText.unChars] = 0x00; + ReadBytes(pString, oText.unChars); oText.pOutputString = pString; } // Читаем OutputDx - nSkip = oText.unOffDx - oText.unOffString - 2 * unCharsCount; - Skip(nSkip); - const unsigned int unDxCount = oText.unOptions & ETO_PDY ? 2 * unCharsCount : unCharsCount; + if (oText.unChars < (UINT32_MAX / 2) && (oText.unOffDx > oText.unOffString) && (oText.unOffDx - oText.unOffString > 2 * oText.unChars)) + Skip(oText.unOffDx - oText.unOffString - 2 * oText.unChars); + + const unsigned int unDxCount = (oText.unOptions & ETO_PDY ? 2 * oText.unChars : oText.unChars); + + if ((CanRead() / 4) < unDxCount || 0 == unDxCount) + return; + unsigned int* pDx = new unsigned int[unDxCount]; if (pDx) { @@ -1116,6 +1145,7 @@ namespace MetaFile private: BYTE *pBuffer; + BYTE *pBufferEnd; BYTE *pCur; BYTE *pEnd; }; diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp index 078a3bdac2..f46fecb4b5 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp @@ -63,6 +63,8 @@ namespace MetaFile m_ulRecordPos = m_oStream.Tell(); m_ulRecordSize = ulSize - 8; + m_oStream.SetCurrentBlockSize(m_ulRecordSize); + if (ulType < EMR_MIN || ulType > EMR_MAX) { if (ENHMETA_SIGNATURE != m_oHeader.ulSignature || 0x00010000 != m_oHeader.ulVersion) @@ -213,6 +215,8 @@ namespace MetaFile m_oStream.Skip(need_skip); ulRecordIndex++; + m_oStream.ClearCurrentBlockSize(); + } while (!CheckError()); if (!CheckError()) diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp index d0ef37afbb..542837ff1f 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp @@ -234,6 +234,8 @@ namespace MetaFile m_oStream >> unSize; m_oStream >> m_ulRecordSize; + m_oStream.SetCurrentBlockSize(m_ulRecordSize); + unsigned int unRecordPos = m_oStream.Tell(); LOGGING(ActionNamesEmfPlus[unShType] << L" DataSize = " << m_ulRecordSize) @@ -318,6 +320,7 @@ namespace MetaFile LOGGING(L"Skip: " << nNeedSkip) + m_oStream.ClearCurrentBlockSize(); m_ulRecordSize = 0; }while(m_oStream.CanRead() >= 12 && !m_bEof); diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp index 33803d513a..34ec3fa88c 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp @@ -52,6 +52,8 @@ namespace MetaFile m_unRecordSize = unSize * 2; // Размер указан в WORD + m_oStream.SetCurrentBlockSize(m_unRecordSize); + switch (ushType) { //----------------------------------------------------------- @@ -161,6 +163,7 @@ namespace MetaFile // Пропускаем лишние байты, которые могли быть в записи int need_skip = m_unRecordSize - (m_oStream.Tell() - m_unRecordPos); m_oStream.Skip(need_skip); + m_oStream.ClearCurrentBlockSize(); }; if (!m_bEof) From 9779e53fe77bdc22318bcb005378fc6ac96cf918 Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Sun, 12 May 2024 21:50:04 +0300 Subject: [PATCH 63/88] The algorithm for checking arrays has been rewritten --- .../html/css/src/xhtml/CDocumentStyle.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp b/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp index 8adb0dab1e..b544b16115 100644 --- a/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp +++ b/Common/3dParty/html/css/src/xhtml/CDocumentStyle.cpp @@ -1,6 +1,7 @@ #include "CDocumentStyle.h" #include +#include #include #include #include @@ -18,17 +19,29 @@ namespace NSCSS bool CheckArrays(const std::vector& arInitial, const std::set& arFirst, const std::set& arSecond) { - std::set arInitialSet(arInitial.begin(), arInitial.end()); + std::unordered_set arInitialSet(arInitial.begin(), arInitial.end()); std::vector arCommonElements1; std::vector arCommonElements2; - - std::set_intersection(arInitialSet.begin(), arInitialSet.end(), arFirst.begin(), arFirst.end(), std::back_inserter(arCommonElements1)); - std::set_intersection(arInitialSet.begin(), arInitialSet.end(), arSecond.begin(), arSecond.end(), std::back_inserter(arCommonElements2)); - + + for (const std::wstring& wsValue : arFirst) + { + if (arInitialSet.count(wsValue) > 0) + arCommonElements1.push_back(wsValue); + } + + for (const std::wstring& wsValue : arSecond) + { + if (arInitialSet.count(wsValue) > 0) + arCommonElements2.push_back(wsValue); + } + if (arCommonElements1.size() != arCommonElements2.size()) return false; + std::sort(arCommonElements1.begin(), arCommonElements1.end()); + std::sort(arCommonElements2.begin(), arCommonElements2.end()); + return arCommonElements1 == arCommonElements2; } From b53527c9fdb2316e597b481dab1de0ed27cd980f Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 13 May 2024 14:53:32 +0600 Subject: [PATCH 64/88] Fix bug #67936 --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp index cc3fad865b..5c695229e0 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp @@ -102,7 +102,7 @@ void PtgName::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool ful std::wstring ptg; - if ((global_info) && (nameindex <= global_info->arDefineNames.size())) + if ((global_info) && (nameindex <= global_info->arDefineNames.size()) && nameindex) { ptg = global_info->arDefineNames[nameindex-1]; } From 155103b40fd2b1afdad230f51cea3d638a3b471d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 13 May 2024 15:30:01 +0600 Subject: [PATCH 65/88] Fix bug #67933 --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgNameX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgNameX.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgNameX.cpp index 3628c065a6..547e7bd2c9 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgNameX.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgNameX.cpp @@ -126,7 +126,7 @@ void PtgNameX::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool fu } if (name.empty()) { - if (nameindex <= global_info->arDefineNames.size()) + if (global_info && nameindex && nameindex <= global_info->arDefineNames.size()) { name = global_info->arDefineNames[nameindex - 1]; From e6842f50b3a59622ef8dea9d567dddc41a96ae4e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 14 May 2024 15:20:51 +0600 Subject: [PATCH 66/88] Fix bug #bug66658 --- .../Worksheets/ConditionalFormatting.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 43b98d1981..8830027dfc 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -1967,59 +1967,59 @@ else if (m_oType == SimpleTypes::Spreadsheet::ECfType::timePeriod) { if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::today) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTODAY; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTODAY; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_TODAY; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::tomorrow) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTOMORROW; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTOMORROW; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_TOMORROW; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::yesterday) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODYESTERDAY; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODYESTERDAY; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_YESTERDAY; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::last7Days) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLAST7DAYS; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLAST7DAYS; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LAST7DAYS; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastMonth) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTMONTH; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTMONTH; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LASTMONTH; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextMonth) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTMONTH; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTMONTH; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_NEXTMONTH; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisWeek) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISWEEK; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISWEEK; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_THISWEEK; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextWeek) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTWEEK; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTWEEK; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_NEXTWEEK; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastWeek) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTWEEK; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTWEEK; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LASTWEEK; } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisMonth) { - ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISMONTH; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISMONTH; ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_THISMONTH; } } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::aboveAverage) { - ptr->iTemplate= XLSB::CFTemp::CF_TEMPLATE_ABOVEAVERAGE; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_ABOVEAVERAGE; ptr->iParam = m_oStdDev->GetValue(); } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::duplicateValues) From 46e56afa5c167225212a65a37e72d54e875e5c4d Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Tue, 14 May 2024 14:31:24 +0300 Subject: [PATCH 67/88] bug fix(crashes, parsing correction) --- .../StarMath2OOXML/TestSMConverter/main.cpp | 286 ++++++++++-------- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 112 +++---- .../StarMath2OOXML/cconversionsmtoooxml.h | 4 +- .../StarMath2OOXML/cstarmathpars.cpp | 151 ++++----- .../Converter/StarMath2OOXML/cstarmathpars.h | 49 +-- .../Converter/StarMath2OOXML/typeConversion.h | 7 +- OdfFile/Reader/Format/chart_build_oox.cpp | 2 +- OdfFile/Reader/Format/math_elements.cpp | 2 +- 8 files changed, 328 insertions(+), 285 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index a993e8d7a7..c0db5e051b 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -10,7 +10,7 @@ TEST(SMConvectorTest, BinOperatorPlus) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"2+3"; + std::wstring XmlString = L"2+3"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -20,7 +20,7 @@ TEST(SMConvectorTest,BinOperatorOver) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"23"; + std::wstring XmlString = L"23"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -30,7 +30,7 @@ TEST(SMConvectorTest,BinOperatorCdot) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"5\u00B78"; + std::wstring XmlString = L"5\u00B78"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -40,7 +40,7 @@ TEST(SMConvectorTest,BinOperatorTimes) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"5\u00D78"; + std::wstring XmlString = L"5\u00D78"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -50,7 +50,7 @@ TEST(SMConvectorTest,BinOperatorMultipl) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"4*2"; + std::wstring XmlString = L"4*2"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -60,7 +60,7 @@ TEST(SMConvectorTest,BinOperatorDiv) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"4\u00F72"; + std::wstring XmlString = L"4\u00F72"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -70,7 +70,7 @@ TEST(SMConvectorTest,BinOperatorDivision) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"42"; + std::wstring XmlString = L"42"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -80,7 +80,7 @@ TEST(SMConvectorTest,BinOperatorOplus) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"226\u2295179"; + std::wstring XmlString = L"226\u2295179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -90,7 +90,7 @@ TEST(SMConvectorTest,BinOperatorOdot) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"226\u2299179"; + std::wstring XmlString = L"226\u2299179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -100,7 +100,7 @@ TEST(SMConvectorTest,BinOperatorOtimes) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"226\u2297179"; + std::wstring XmlString = L"226\u2297179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -110,7 +110,7 @@ TEST(SMConvectorTest,OperatorSum) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"5"; + std::wstring XmlString = L"5"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -120,7 +120,7 @@ TEST(SMConvectorTest,OperatorSumFrom) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"105"; + std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -130,7 +130,7 @@ TEST(SMConvectorTest,OperatorSumTo) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"105"; + std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -140,7 +140,7 @@ TEST(SMConvectorTest,OperatorSumFromTo) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"666777567"; + std::wstring XmlString = L"666777567"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -150,7 +150,7 @@ TEST(SMConvectorTest,SetOperationUnion) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23\u22C345"; + std::wstring wsXmlString = L"23\u22C345"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -160,7 +160,7 @@ TEST(SMConvectorTest,SetOperationIntersection) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"15\u22C21234"; + std::wstring wsXmlString = L"15\u22C21234"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -170,7 +170,7 @@ TEST(SMConvectorTest,SetOperationSetminus) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"7\u221615745"; + std::wstring wsXmlString = L"7\u221615745"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -180,7 +180,7 @@ TEST(SMConvectorTest,SetOperationSetquotient) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"91\u221545"; + std::wstring wsXmlString = L"91\u221545"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -190,7 +190,7 @@ TEST(SMConvectorTest,SetOperationSubset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22822"; + std::wstring wsXmlString = L"1\u22822"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -200,7 +200,7 @@ TEST(SMConvectorTest,SetOperationSubseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"77\u228666"; + std::wstring wsXmlString = L"77\u228666"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -210,7 +210,7 @@ TEST(SMConvectorTest,SetOperationSupset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"11\u228322"; + std::wstring wsXmlString = L"11\u228322"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -220,7 +220,7 @@ TEST(SMConvectorTest,SetOperationSupseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22872"; + std::wstring wsXmlString = L"1\u22872"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -230,7 +230,7 @@ TEST(SMConvectorTest,SetOperationNsubset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"21\u22842"; + std::wstring wsXmlString = L"21\u22842"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -240,7 +240,7 @@ TEST(SMConvectorTest,SetOperationNsubseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"782\u2288250"; + std::wstring wsXmlString = L"782\u2288250"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -250,7 +250,7 @@ TEST(SMConvectorTest,SetOperationNsupset) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22852"; + std::wstring wsXmlString = L"1\u22852"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -260,7 +260,7 @@ TEST(SMConvectorTest,SetOperationNsupseteq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22892"; + std::wstring wsXmlString = L"1\u22892"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -270,7 +270,7 @@ TEST(SMConvectorTest,SetOperationIn) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1\u22082"; + std::wstring wsXmlString = L"1\u22082"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -280,7 +280,7 @@ TEST(SMConvectorTest,SetOperationNotin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3\u22094"; + std::wstring wsXmlString = L"3\u22094"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -290,7 +290,7 @@ TEST(SMConvectorTest,SetOperationOwns) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"5\u220B6"; + std::wstring wsXmlString = L"5\u220B6"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -300,7 +300,7 @@ TEST(SMConvectorTest,ConnectionDlarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"7\u21D08"; + std::wstring wsXmlString = L"7\u21D08"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -310,7 +310,7 @@ TEST(SMConvectorTest,ConnectionDlrarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"9\u21D410"; + std::wstring wsXmlString = L"9\u21D410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -320,7 +320,7 @@ TEST(SMConvectorTest,ConnectionDrarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"11\u21D212"; + std::wstring wsXmlString = L"11\u21D212"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -330,7 +330,7 @@ TEST(SMConvectorTest,ConnectionEquals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"13=14"; + std::wstring wsXmlString = L"13=14"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -340,7 +340,7 @@ TEST(SMConvectorTest,ConnectionNotequals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"15\u226016"; + std::wstring wsXmlString = L"15\u226016"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -350,7 +350,7 @@ TEST(SMConvectorTest,ConnectionLearrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"17<18"; + std::wstring wsXmlString = L"17<18"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -360,7 +360,7 @@ TEST(SMConvectorTest,ConnectionLearrowequals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"19\u226420"; + std::wstring wsXmlString = L"19\u226420"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -370,7 +370,7 @@ TEST(SMConvectorTest,ConnectionRiarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"21>22"; + std::wstring wsXmlString = L"21>22"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -380,7 +380,7 @@ TEST(SMConvectorTest,ConnectionRiarrowequals) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23\u226524"; + std::wstring wsXmlString = L"23\u226524"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -390,7 +390,7 @@ TEST(SMConvectorTest,ConnectionDllearrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"25\u226A26"; + std::wstring wsXmlString = L"25\u226A26"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -400,7 +400,7 @@ TEST(SMConvectorTest,ConnectionDlriarrow) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"27\u226B28"; + std::wstring wsXmlString = L"27\u226B28"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -410,7 +410,7 @@ TEST(SMConvectorTest,ConnectionApprox) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"29\u224830"; + std::wstring wsXmlString = L"29\u224830"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -420,7 +420,7 @@ TEST(SMConvectorTest,ConnectionSim) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"31\u223C32"; + std::wstring wsXmlString = L"31\u223C32"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -430,7 +430,7 @@ TEST(SMConvectorTest,ConnectionSimeq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"33\u224334"; + std::wstring wsXmlString = L"33\u224334"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -440,7 +440,7 @@ TEST(SMConvectorTest,ConnectionEquiv) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"35\u226136"; + std::wstring wsXmlString = L"35\u226136"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -450,7 +450,7 @@ TEST(SMConvectorTest,ConnectionProp) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"37\u221D38"; + std::wstring wsXmlString = L"37\u221D38"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -460,7 +460,7 @@ TEST(SMConvectorTest,ConnectionParallel) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"39\u222530"; + std::wstring wsXmlString = L"39\u222530"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -470,7 +470,7 @@ TEST(SMConvectorTest,ConnectionOrtho) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"41\u22A542"; + std::wstring wsXmlString = L"41\u22A542"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -480,7 +480,7 @@ TEST(SMConvectorTest,ConnectionDivides) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"43\u222344"; + std::wstring wsXmlString = L"43\u222344"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -490,7 +490,7 @@ TEST(SMConvectorTest,ConnectionNdivides) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"45\u222446"; + std::wstring wsXmlString = L"45\u222446"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -500,7 +500,7 @@ TEST(SMConvectorTest,ConnectionToward) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"47\u219248"; + std::wstring wsXmlString = L"47\u219248"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -510,7 +510,7 @@ TEST(SMConvectorTest,ConnectionTransl) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"49\u22B750"; + std::wstring wsXmlString = L"49\u22B750"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -520,7 +520,7 @@ TEST(SMConvectorTest,ConnectionTransr) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"51\u22B652"; + std::wstring wsXmlString = L"51\u22B652"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -530,7 +530,7 @@ TEST(SMConvectorTest,ConnectionDef) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"53\u225D54"; + std::wstring wsXmlString = L"53\u225D54"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -540,7 +540,7 @@ TEST(SMConvectorTest,ConnectionPrec) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"55\u227A56"; + std::wstring wsXmlString = L"55\u227A56"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -550,7 +550,7 @@ TEST(SMConvectorTest,ConnectionSucc) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"57\u227B58"; + std::wstring wsXmlString = L"57\u227B58"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -560,7 +560,7 @@ TEST(SMConvectorTest,ConnectionPreccurlyeq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"59\u227C60"; + std::wstring wsXmlString = L"59\u227C60"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -570,7 +570,7 @@ TEST(SMConvectorTest,ConnectionSucccurlyeq) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"61\u227D62"; + std::wstring wsXmlString = L"61\u227D62"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -580,7 +580,7 @@ TEST(SMConvectorTest,ConnectionPrecsim) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"63\u227E64"; + std::wstring wsXmlString = L"63\u227E64"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -590,7 +590,7 @@ TEST(SMConvectorTest,ConnectionSuccsim) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"65\u227F66"; + std::wstring wsXmlString = L"65\u227F66"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -600,7 +600,7 @@ TEST(SMConvectorTest,ConnectionNprec) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"67\u228068"; + std::wstring wsXmlString = L"67\u228068"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -610,7 +610,7 @@ TEST(SMConvectorTest,ConnectionNsucc) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"69\u228170"; + std::wstring wsXmlString = L"69\u228170"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -620,7 +620,7 @@ TEST(SMConvectorTest,BracketRound) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+3"; + std::wstring wsXmlString = L"2+3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -630,7 +630,7 @@ TEST(SMConvectorTest,BracketSquare) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"4-5"; + std::wstring wsXmlString = L"4-5"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -640,7 +640,7 @@ TEST(SMConvectorTest,BracketLdbracket) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"6+7"; + std::wstring wsXmlString = L"6+7"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -650,7 +650,7 @@ TEST(SMConvectorTest,BracketLbrace) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"8-9"; + std::wstring wsXmlString = L"8-9"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -660,7 +660,7 @@ TEST(SMConvectorTest,BracketLangle) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1011"; + std::wstring wsXmlString = L"1011"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -670,7 +670,7 @@ TEST(SMConvectorTest,BracketLceil) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"12\u229613"; + std::wstring wsXmlString = L"12\u229613"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -680,7 +680,7 @@ TEST(SMConvectorTest,BracketLfloor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"14\u22C315"; + std::wstring wsXmlString = L"14\u22C315"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -690,7 +690,7 @@ TEST(SMConvectorTest,BracketLline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1617"; + std::wstring wsXmlString = L"1617"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -700,7 +700,7 @@ TEST(SMConvectorTest,BracketLdline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"18\u229519"; + std::wstring wsXmlString = L"18\u229519"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -710,7 +710,7 @@ TEST(SMConvectorTest,FunctionCos) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cos2+3"; + std::wstring wsXmlString = L"cos2+3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -720,7 +720,7 @@ TEST(SMConvectorTest,FunctionSin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"sin45"; + std::wstring wsXmlString = L"sin45"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -730,7 +730,7 @@ TEST(SMConvectorTest,FunctionTan) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"tan67"; + std::wstring wsXmlString = L"tan67"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -740,7 +740,7 @@ TEST(SMConvectorTest,FunctionCot) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cot89"; + std::wstring wsXmlString = L"cot89"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -750,7 +750,7 @@ TEST(SMConvectorTest,FunctionSinh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"sinh2\u22833"; + std::wstring wsXmlString = L"sinh2\u22833"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -760,7 +760,7 @@ TEST(SMConvectorTest,FunctionCosh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cosh2+3"; + std::wstring wsXmlString = L"cosh2+3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -770,7 +770,7 @@ TEST(SMConvectorTest,FunctionTanh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"tanh11\u229712"; + std::wstring wsXmlString = L"tanh11\u229712"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -780,7 +780,7 @@ TEST(SMConvectorTest,FunctionCoth222) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"coth222"; + std::wstring wsXmlString = L"coth222"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -790,7 +790,7 @@ TEST(SMConvectorTest,FunctionArcsin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arcsin13\u229614"; + std::wstring wsXmlString = L"arcsin13\u229614"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -800,7 +800,7 @@ TEST(SMConvectorTest,FunctionArccos) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arccos15-16"; + std::wstring wsXmlString = L"arccos15-16"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -810,7 +810,7 @@ TEST(SMConvectorTest,FunctionArctan) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arctan1718"; + std::wstring wsXmlString = L"arctan1718"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -820,7 +820,7 @@ TEST(SMConvectorTest,FunctionArccot) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arccot20+30"; + std::wstring wsXmlString = L"arccot20+30"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -830,7 +830,7 @@ TEST(SMConvectorTest,FunctionArsinh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arsinh231510"; + std::wstring wsXmlString = L"arsinh231510"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -840,7 +840,7 @@ TEST(SMConvectorTest,FunctionArcosh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"35+27arcosh2378"; + std::wstring wsXmlString = L"35+27arcosh2378"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -850,7 +850,7 @@ TEST(SMConvectorTest,FunctionArtanhArcoth) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arcoth30\u2282artanh27"; + std::wstring wsXmlString = L"arcoth30\u2282artanh27"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -860,7 +860,7 @@ TEST(SMConvectorTest,MatrixBinom) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"27\u2283277arcoth89"; + std::wstring wsXmlString = L"27\u2283277arcoth89"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -870,7 +870,7 @@ TEST(SMConvectorTest,MatrixMatrix) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; + std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -880,7 +880,7 @@ TEST(SMConvectorTest,MatrixStack) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"210231234"; + std::wstring wsXmlString = L"210231234"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -890,7 +890,7 @@ TEST(SMConvectorTest,IndexLower) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2512"; + std::wstring wsXmlString = L"2512"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -900,7 +900,7 @@ TEST(SMConvectorTest,IndexUpper) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cos52410"; + std::wstring wsXmlString = L"cos52410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -910,7 +910,7 @@ TEST(SMConvectorTest,IndexLsup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+3cos1527"; + std::wstring wsXmlString = L"2+3cos1527"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -920,7 +920,7 @@ TEST(SMConvectorTest,IndexLsub) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"22222103"; + std::wstring wsXmlString = L"22222103"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -930,7 +930,7 @@ TEST(SMConvectorTest,BracketWithIndexOverbrace) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"231010010"; + std::wstring wsXmlString = L"231010010"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -940,7 +940,7 @@ TEST(SMConvectorTest,OperatorLllint) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2102+3100"; + std::wstring wsXmlString = L"2102+3100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -950,7 +950,7 @@ TEST(SMConvectorTest,BracketLdlineAttribute) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"10100+3+10"; + std::wstring wsXmlString = L"10100+3+10"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -960,7 +960,7 @@ TEST(SMConvectorTest,Example11) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"fx=n=0\u221Efnx0n\u0021x-x0n"; + std::wstring wsXmlString = L"fx=n=0\u221Efnx0n\u0021x-x0n"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -970,7 +970,7 @@ TEST(SMConvectorTest,AttributeGrade) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"E=mc2ba\u221E"; + std::wstring wsXmlString = L"E=mc2ba\u221E"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -980,7 +980,7 @@ TEST(SMConvectorTest,Example2) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"C=\u03C0\u00B7d=2\u00B7\u03C0\u00B7r"; + std::wstring wsXmlString =L"C=\u03C0\u00B7d=2\u00B7\u03C0\u00B7r"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -990,7 +990,7 @@ TEST(SMConvectorTest,Example3) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"c=a2+b2"; + std::wstring wsXmlString =L"c=a2+b2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1000,7 +1000,7 @@ TEST(SMConvectorTest,Example4) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"F=m\u00D7a"; + std::wstring wsXmlString =L"F=m\u00D7a"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1010,7 +1010,7 @@ TEST(SMConvectorTest,Example5) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"E=mc2"; + std::wstring wsXmlString =L"E=mc2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1020,7 +1020,7 @@ TEST(SMConvectorTest,Example6) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"G\u03BC\u03BD+\u039Bg\u03BC\u03BD=8\u03C0Gc4T\u03BC\u03BD"; + std::wstring wsXmlString =L"G\u03BC\u03BD+\u039Bg\u03BC\u03BD=8\u03C0Gc4T\u03BC\u03BD"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1030,7 +1030,7 @@ TEST(SMConvectorTest,Example8) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"ddt\u2202L\u2202q=\u2202L\u2202q"; + std::wstring wsXmlString =L"ddt\u2202L\u2202q=\u2202L\u2202q"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1040,7 +1040,7 @@ TEST(SMConvectorTest,Example9) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"abf'xdx=fb-fa"; + std::wstring wsXmlString =L"abf'xdx=fb-fa"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1050,7 +1050,7 @@ TEST(SMConvectorTest,Example10) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"\u03B4rt\u2248e\u03BBt\u03B4r0"; + std::wstring wsXmlString =L"\u03B4rt\u2248e\u03BBt\u03B4r0"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1060,7 +1060,7 @@ TEST(SMConvectorTest,LimAndCsub) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"lim21015244"; + std::wstring wsXmlString =L"lim21015244"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1070,7 +1070,7 @@ TEST(SMConvectorTest,LimSupAndCsup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"lim sup10210100"; + std::wstring wsXmlString =L"lim sup10210100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1080,7 +1080,7 @@ TEST(SMConvectorTest,OverWithoutLeft) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"\u00B12105"; + std::wstring wsXmlString =L"\u00B12105"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1090,7 +1090,7 @@ TEST(SMConvectorTest,Newline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23102"; + std::wstring wsXmlString = L"23102"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1100,7 +1100,7 @@ TEST(SMConvectorTest,IndexAndBinOp) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2\u22C33410"; + std::wstring wsXmlString = L"2\u22C33410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1110,7 +1110,7 @@ TEST(SMConvectorTest,Example7) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"\u0394t'=\u0394t1-v2c2"; + std::wstring wsXmlString = L"\u0394t'=\u0394t1-v2c2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1120,7 +1120,7 @@ TEST(SMConvectorTest,UnarySign) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3+69\u2213510"; + std::wstring wsXmlString = L"3+69\u2213510"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1130,7 +1130,7 @@ TEST(SMConvectorTest,Example13) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3x3-7x2+14x-8+78+49+378+49"; + std::wstring wsXmlString = L"3x3-7x2+14x-8+78+49+378+49"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1140,7 +1140,7 @@ TEST(SMConvectorTest,Example14) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"i=0\u221E-1i2i+1x2i+1=sinx"; + std::wstring wsXmlString = L"i=0\u221E-1i2i+1x2i+1=sinx"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1150,7 +1150,7 @@ TEST(SMConvectorTest,Example15) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"limx->0sinxx=1"; + std::wstring wsXmlString = L"limx\u27940sinxx=1"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1160,7 +1160,7 @@ TEST(SMConvectorTest,Example16) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"0\u221Ex2e-xdx=2"; + std::wstring wsXmlString = L"0\u221Ex2e-xdx=2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1170,7 +1170,7 @@ TEST(SMConvectorTest,Example17) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"a2b+b2a\u22652ab"; + std::wstring wsXmlString = L"a2b+b2a\u22652ab"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1180,7 +1180,7 @@ TEST(SMConvectorTest,Example18) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"541021"; + std::wstring wsXmlString = L"541021"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1190,7 +1190,7 @@ TEST(SMConvectorTest,IndexWithColor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"5867243"; + std::wstring wsXmlString = L"5867243"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1200,7 +1200,7 @@ TEST(SMConvectorTest,FunctionWithColor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"10e2723"; + std::wstring wsXmlString = L"10e2723"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1210,7 +1210,7 @@ TEST(SMConvectorTest,IncorrectSizeAndFontInput) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"bolt2"; + std::wstring wsXmlString = L"bolt2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1220,7 +1220,7 @@ TEST(SMConvectorTest,IncorrectRGBColorInput) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2550257210"; + std::wstring wsXmlString = L"2550257210"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1230,7 +1230,7 @@ TEST(SMConvectorTest,IncorrectHexColorInput) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"RGBRGBRGBRGBRGB"; + std::wstring wsXmlString = L"RGBRGBRGBRGBRGB"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1240,7 +1240,7 @@ TEST(SMConvectorTest,IndexWithoutElement) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"23"; + std::wstring wsXmlString = L"23"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1250,7 +1250,7 @@ TEST(SMConvectorTest,Neg) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"-1\u00AC105\u22287"; + std::wstring wsXmlString = L"-1\u00AC105\u22287"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1260,7 +1260,7 @@ TEST(SMConvectorTest,Frac) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"n=1\u221E1n2+1n3=pi26+zeta3"; + std::wstring wsXmlString = L"n=1\u221E1n2+1n3=pi26+zeta3"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1270,7 +1270,7 @@ TEST(SMConvectorTest,BracketIndexOnTopAndOperationOnSet) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"3+105\u221612"; + std::wstring wsXmlString = L"3+105\u221612"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1280,7 +1280,7 @@ TEST(SMConvectorTest,SqrtWithIndex) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2log28=4"; + std::wstring wsXmlString = L"2log28=4"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1290,7 +1290,7 @@ TEST(SMConvectorTest,Binom) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2=432+1abc5"; + std::wstring wsXmlString = L"2=432+1abc5"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1300,7 +1300,7 @@ TEST(SMConvectorTest,UnarySignWithColor) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+10\u2216593"; + std::wstring wsXmlString = L"2+10\u2216593"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1310,7 +1310,7 @@ TEST(SMConvectorTest,rSubrSup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"220128"; + std::wstring wsXmlString = L"220128"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1320,7 +1320,7 @@ TEST(SMConvectorTest,DifferentRegisters) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"210\x22C35"; + std::wstring wsXmlString = L"210\x22C35"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1330,7 +1330,27 @@ TEST(SMConvectorTest,Quotes) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2 + 3102+53"; + std::wstring wsXmlString = L"2 + 3102+53"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,NumberWithDot) +{ + std::wstring wsString = L"goal.25 over 100"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"goal.25100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,OperatorWithoutValue) +{ + std::wstring wsString = L"lim_{x->5}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"limx\u27945"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 0767de31f1..7fc55240c1 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -44,59 +44,67 @@ namespace StarMath { void CConversionSMtoOOXML::StartConversion(std::vector arPars, const unsigned int& iAlignment) { m_pXmlWrite = new XmlUtils::CXmlWriter; - std::wstring wsNodeMath(L"m:oMath"),wsNodeMathPara(L"m:oMathPara"),wsAlignment; - switch(iAlignment) + if(!arPars.empty()) { - case 0: - wsAlignment = L"center"; - break; - case 1: - wsAlignment = L"left"; - break; - case 2: - wsAlignment = L"right"; - break; - default: - wsAlignment = L"center"; - break; - } - if(arPars[0]->GetTypeConversion() == TypeConversion::pptx) - { - wsNodeMath += L" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\""; - wsNodeMathPara += L" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\""; - wsAlignment += L"Group"; - } - m_pXmlWrite->WriteNodeBegin(wsNodeMathPara,false); - if(iAlignment>= 0 && iAlignment <= 2) - { - m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); - m_pXmlWrite->WriteNodeBegin(L"m:jc",true); - m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); - m_pXmlWrite->WriteNodeEnd(L"",true,true); - m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); - } - m_pXmlWrite->WriteNodeBegin(wsNodeMath,false); - for(CElement* oTempElement:arPars) - { - if(oTempElement != nullptr) + std::wstring wsNodeMath(L"m:oMath"),wsNodeMathPara(L"m:oMathPara"),wsAlignment; + switch(iAlignment) { - if(CParserStarMathString::CheckNewline(oTempElement)) - { - m_pXmlWrite->WriteNodeBegin(L"m:r",false); - m_pXmlWrite->WriteNodeBegin(L"w:br",true); - m_pXmlWrite->WriteNodeEnd(L"",true,true); - m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); - m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); - m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); - } - else - oTempElement->ConversionToOOXML(m_pXmlWrite); + case 0: + wsAlignment = L"center"; + break; + case 1: + wsAlignment = L"left"; + break; + case 2: + wsAlignment = L"right"; + break; + default: + wsAlignment = L"center"; + break; } + if(arPars[0]->GetTypeConversion() == TypeConversion::pptx) + { + wsNodeMath += L" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\""; + wsNodeMathPara += L" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\""; + wsAlignment += L"Group"; + } + m_pXmlWrite->WriteNodeBegin(wsNodeMathPara,false); + if(iAlignment>= 0 && iAlignment <= 2) + { + m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); + m_pXmlWrite->WriteNodeBegin(L"m:jc",true); + m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); + m_pXmlWrite->WriteNodeEnd(L"",true,true); + m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); + } + m_pXmlWrite->WriteNodeBegin(wsNodeMath,false); + for(CElement* oTempElement:arPars) + { + if(oTempElement != nullptr) + { + if(CParserStarMathString::CheckNewline(oTempElement)) + { + m_pXmlWrite->WriteNodeBegin(L"m:r",false); + m_pXmlWrite->WriteNodeBegin(L"w:br",true); + m_pXmlWrite->WriteNodeEnd(L"",true,true); + m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); + m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); + } + else + oTempElement->ConversionToOOXML(m_pXmlWrite); + } + } + } + else + { + m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); + m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); } m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); m_pXmlWrite->WriteNodeEnd(L"m:oMathPara",false,false); } - void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const TypeConversion &enTypeConversion) + void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const TypeConversion &enTypeConversion) { if(TypeConversion::docx == enTypeConversion || TypeConversion::undefine == enTypeConversion) { @@ -134,10 +142,10 @@ namespace StarMath { if(pAttribute->GetSize() == 0) { pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteAttribute(L"w:val",L"30"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteAttribute(L"w:val",L"30"); pXmlWrite->WriteNodeEnd(L"w",true,true); } else if(pAttribute->GetSize() != 0) @@ -182,7 +190,7 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); } } - else if(TypeConversion::pptx == enTypeConversion) + else if(TypeConversion::pptx == enTypeConversion || TypeConversion::xlsx == enTypeConversion) { if(pAttribute !=nullptr) { @@ -481,14 +489,14 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); } - void CConversionSMtoOOXML::WriteLimUpOrLowNode(XmlUtils::CXmlWriter *pXmlWrite,const std::wstring& wsNameNode,CElement* pValue, const TypeElement& enType,CAttribute* pAttribute,const std::wstring& wsName,CElement* pIndex) + void CConversionSMtoOOXML::WriteLimUpOrLowNode(XmlUtils::CXmlWriter *pXmlWrite, const std::wstring& wsNameNode, CElement* pValue, const TypeElement& enType, CAttribute* pAttribute, const TypeConversion &enTypeConvers, const std::wstring& wsName, CElement* pIndex) { pXmlWrite->WriteNodeBegin(wsNameNode,false); pXmlWrite->WriteNodeBegin(wsNameNode+L"Pr",false); - CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr,pValue->GetTypeConversion()); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr,enTypeConvers); pXmlWrite->WriteNodeEnd(wsNameNode+L"Pr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::WriteRPrFName(enType,pXmlWrite,pAttribute,wsName,pValue->GetTypeConversion()); + CConversionSMtoOOXML::WriteRPrFName(enType,pXmlWrite,pAttribute,wsName,enTypeConvers); pXmlWrite->WriteNodeEnd(L"m:e",false,false); if(pValue!= nullptr && pIndex != nullptr) { diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 6bcc84f713..9ec8840147 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -42,7 +42,7 @@ namespace StarMath { public: CConversionSMtoOOXML(); ~CConversionSMtoOOXML(); - void StartConversion(std::vector arPars, const unsigned int& iAlignment = -1); + void StartConversion(std::vector arPars, const unsigned int& iAlignment = 0); static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const TypeConversion& enTypeConversion); static void PropertiesMFPR(bool bType,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const TypeConversion &enTypeConversion); static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const TypeConversion &enTypeConversion); @@ -57,7 +57,7 @@ namespace StarMath { static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp,const TypeConversion &enTypeConversion); static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); static void WritePreserveBlock(XmlUtils::CXmlWriter* pXmlWrite, CAttribute *pAttribute,const TypeConversion &enTypeConversion); - static void WriteLimUpOrLowNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsNameNode,CElement* pValue,const TypeElement& enType,CAttribute* pAttribute, const std::wstring& wsName = L"oper",CElement* pIndex = nullptr); + static void WriteLimUpOrLowNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsNameNode,CElement* pValue,const TypeElement& enType,CAttribute* pAttribute,const TypeConversion& enTypeConvers, const std::wstring& wsName = L"oper",CElement* pIndex = nullptr); static void ElementConversion(XmlUtils::CXmlWriter* pXmlWrite,CElement* pElement); void EndConversion(); std::wstring GetOOXML(); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 6ed94b2b19..eaa0773af1 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -32,6 +32,7 @@ #include "cstarmathpars.h" #include "cconversionsmtoooxml.h" + namespace StarMath { //class methods CParsStarMath @@ -41,14 +42,14 @@ namespace StarMath for(CElement* pElement:m_arEquation) delete pElement; } - std::vector CParserStarMathString::Parse(std::wstring& wsParseString,int iTypeConversion,const TBaseAttribute* pBaseAttribute) + std::vector CParserStarMathString::Parse(std::wstring& wsParseString, int iTypeConversion) { - TypeConversion enTypeConvers = (TypeConversion)iTypeConversion; + TypeConversion enTypeConvers = (TypeConversion)iTypeConversion; std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); - CStarMathReader* pReader = new CStarMathReader(itStart,itEnd,enTypeConvers); - pReader->SetBaseAttribute(pBaseAttribute); - if(pBaseAttribute != nullptr && (pBaseAttribute->base_alignment >= 0 && pBaseAttribute->base_alignment <= 2)) - SetAlignment(pBaseAttribute->base_alignment); + CStarMathReader* pReader = new CStarMathReader(itStart,itEnd,enTypeConvers); + pReader->SetBaseAttribute(m_stBaseAttribute); +// if(m_stBaseAttribute != nullptr && (m_stBaseAttribute->base_alignment >= 0 && m_stBaseAttribute->base_alignment <= 2)) +// SetAlignment(m_stBaseAttribute->base_alignment); while(pReader->CheckIteratorPosition()) { if(!m_arEquation.empty()) @@ -60,7 +61,7 @@ namespace StarMath { if(pReader->GetLocalType() == TypeElement::newline) { - m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType(),pReader->GetTypeConversion())); + m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType(),pReader->GetTypeConversion())); pReader->ClearReader(); } CElement* pTempElement = ParseElement(pReader); @@ -236,7 +237,7 @@ namespace StarMath } const unsigned int& CParserStarMathString::GetAlignment() { - return m_iAlignment; + return m_stBaseAttribute.base_alignment; } void CParserStarMathString::SetBaseFont(const std::wstring &wsNameFont) { @@ -823,7 +824,7 @@ namespace StarMath for(wchar_t cOneElement: wsToken) { - if(!isdigit(cOneElement) || L'\0' == cOneElement) return TypeElement::undefine; + if(!iswdigit(cOneElement) || L'\0' == cOneElement) return TypeElement::undefine; } return TypeElement::String; } @@ -833,7 +834,7 @@ namespace StarMath for(wchar_t cOneElement: wsToken) { - if(!isalpha(cOneElement)) return TypeElement::undefine; + if(!iswalpha(cOneElement)) return TypeElement::undefine; } return TypeElement::String; } @@ -1255,8 +1256,8 @@ namespace StarMath else if(L"laplace" == wsToken) return TypeElement::laplace; else if(L"fourier" == wsToken) return TypeElement::fourier; else if(L"backepsilon" == wsToken) return TypeElement::backepsilon; - else if(L"leftarrow" == wsToken) return TypeElement::leftarrow; - else if(L"rightarrow" == wsToken) return TypeElement::rightarrow; + else if(L"leftarrow" == wsToken || L"<-" == wsToken) return TypeElement::leftarrow; + else if(L"rightarrow" == wsToken || L"->" == wsToken) return TypeElement::rightarrow; else if(L"uparrow" == wsToken) return TypeElement::uparrow; else if(L"downarrow" == wsToken) return TypeElement::downarrow; else if(L"dotslow" == wsToken) return TypeElement::dotslow; @@ -1628,16 +1629,16 @@ namespace StarMath m_wsType = L"\u2261"; break; case TypeElement::rightarrow: - m_wsType = L"\u1F872"; + m_wsType = L"\u2794"; break; case TypeElement::leftarrow: - m_wsType = L"\u1F870"; + m_wsType = L"\u2190"; break; case TypeElement::uparrow: - m_wsType = L"\u1F871"; + m_wsType = L"\uF871"; break; case TypeElement::downarrow: - m_wsType = L"\u1F873"; + m_wsType = L"\uF873"; break; case TypeElement::dotsaxis: m_wsType = L"\u22EF"; @@ -2551,9 +2552,9 @@ namespace StarMath CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute(),GetTypeConversion()); pXmlWrite->WriteNodeBegin(L"m:fName",false); if((m_pValueFrom != nullptr || m_pLowerIndex != nullptr) && (m_pValueTo == nullptr && m_pUpperIndex == nullptr)) - CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName,m_pLowerIndex); + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),this->GetTypeConversion(),m_wsName,m_pLowerIndex); else if((m_pValueTo != nullptr || m_pUpperIndex != nullptr ) && (m_pValueFrom == nullptr && m_pLowerIndex == nullptr)) - CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limUpp",m_pValueTo,m_enTypeOperator,GetAttribute(),m_wsName,m_pUpperIndex); + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limUpp",m_pValueTo,m_enTypeOperator,GetAttribute(),this->GetTypeConversion(),m_wsName,m_pUpperIndex); else if ((m_pValueFrom != nullptr || m_pLowerIndex != nullptr )&& (m_pValueTo != nullptr || m_pUpperIndex != nullptr)) { pXmlWrite->WriteNodeBegin(L"m:limUpp",false); @@ -2561,7 +2562,7 @@ namespace StarMath CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr,GetTypeConversion()); pXmlWrite->WriteNodeEnd(L"m:limUppPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName,m_pLowerIndex); + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),this->GetTypeConversion(),m_wsName,m_pLowerIndex); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeBegin(L"m:lim",false); if(m_pUpperIndex !=nullptr) @@ -2849,11 +2850,11 @@ namespace StarMath m_itStart++; break; } - else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart || L'%' == *m_itStart||(L'#' == *m_itStart && L'#' != m_wsElement.back()) ||(L'-' == *m_itStart && L'+' != m_wsElement.back()) || (L'+' == *m_itStart && L'-' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (CheckIsalhpaForGetElement(*m_itStart,m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart || L'%' == *m_itStart||(L'#' == *m_itStart && L'#' != m_wsElement.back()) ||(L'-' == *m_itStart && L'+' != m_wsElement.back() && L'<' != m_wsElement.back()) || (L'+' == *m_itStart && L'-' != m_wsElement.back()) || (L'.' == *m_itStart && !iswdigit(m_wsElement.back())) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back()) && L'.' != m_wsElement.back()) || (CheckIsalhpaForGetElement(*m_itStart,m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || (L'>' == *m_itStart && L'-' !=m_wsElement.back()) || L'=' == *m_itStart)))) { return m_wsElement; } - else if((( CheckTokenForGetElement(*m_itStart) || L'=' == *m_itStart) && m_wsElement.empty()) || (!m_wsElement.empty() && ((L'#' == m_wsElement.back() && L'#' == *m_itStart) || (L'-' == *m_itStart && L'+' == m_wsElement.back()) || (L'+' == *m_itStart && L'-' == m_wsElement.back()) || (m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) + else if((( CheckTokenForGetElement(*m_itStart) || L'=' == *m_itStart) && m_wsElement.empty()) || (!m_wsElement.empty() && ((L'#' == m_wsElement.back() && L'#' == *m_itStart) || (L'-' == *m_itStart && L'+' == m_wsElement.back()) || ((L'+' == *m_itStart || L'>' == *m_itStart) && L'-' == m_wsElement.back()) || (m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart || L'-' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart )) ) ) ) { m_wsElement.push_back(*m_itStart); m_itStart++; @@ -2931,7 +2932,7 @@ namespace StarMath { break; } - if(CElementBracket::GetBracketOpen(m_wsToken) != TypeElement::undefine) + if(CElementBracket::GetBracketOpen(m_wsLowerCaseToken) != TypeElement::undefine) { inBracketInside +=1; } @@ -2997,11 +2998,11 @@ namespace StarMath } bool CStarMathReader::CheckIsalhpaForGetElement(const wchar_t &cToken, const wchar_t &cLastToken) { - if(isalpha(cToken)) + if(iswalpha(cToken)) { if(L'%' == cLastToken) return false; - if(isalpha(cLastToken)) + if(iswalpha(cLastToken)) return false; } else @@ -3090,33 +3091,11 @@ namespace StarMath CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute(),GetTypeConversion()); pXmlWrite->WriteNodeEnd(L"m:groupChrPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); -// switch(m_enTypeBracketWithIndex) -// { -// case TypeElement::overbrace: -// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); -// break; -// case TypeElement::underbrace: -// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); -// break; -// default: -// break; -// } CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeEnd(L"m:groupChr",false,false); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeBegin(L"m:lim",false); -// switch(m_enTypeBracketWithIndex) -// { -// case TypeElement::overbrace: -// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); -// break; -// case TypeElement::underbrace: -// CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); -// break; -// default: -// break; -// } CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); pXmlWrite->WriteNodeEnd(L"m:lim",false,false); pXmlWrite->WriteNodeEnd(wsNameNode,false,false); @@ -3283,44 +3262,76 @@ namespace StarMath switch(m_enTypeMatrix) { case TypeElement::matrix: + case TypeElement::stack: { - CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); - std::vector pTempValue = pTempBracket->GetBracketValue(); - for(CElement* pOneElement:pTempValue) + if(m_pFirstArgument != nullptr) + { + if(m_pFirstArgument->GetBaseType() == TypeElement::Bracket) { - if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol && pOneElement->GetBaseType()!= TypeElement::undefine) + CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); + std::vector pTempValue = pTempBracket->GetBracketValue(); + for(CElement* pOneElement:pTempValue) { - CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); - } - else if(pOneElement->GetBaseType() == TypeElement::SpecialSymbol) - { - CElementSpecialSymbol* pTempSpecial = dynamic_cast(pOneElement); - if(pTempSpecial->GetType() == TypeElement::transition) + if(pOneElement->GetBaseType() != TypeElement::undefine && pOneElement->GetBaseType() != TypeElement::SpecialSymbol && m_enTypeMatrix == TypeElement::stack) { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:mr",false,false); pXmlWrite->WriteNodeBegin(L"m:mr",false); } + else if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol && pOneElement->GetBaseType()!= TypeElement::undefine && m_enTypeMatrix == TypeElement::matrix) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); + } + else if(pOneElement->GetBaseType()!= TypeElement::undefine && pOneElement->GetBaseType() == TypeElement::SpecialSymbol && m_enTypeMatrix == TypeElement::matrix) + { + CElementSpecialSymbol* pTempSpecial = dynamic_cast(pOneElement); + if(pTempSpecial->GetType() == TypeElement::transition) + { + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + } + else if(pTempSpecial->GetType() != TypeElement::grid) + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); + } } - else if(pOneElement->GetBaseType() != TypeElement::undefine) - CConversionSMtoOOXML::ElementConversion(pXmlWrite,pOneElement); + } + else if(m_enTypeMatrix == TypeElement::matrix) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pFirstArgument,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + } + else if (m_enTypeMatrix == TypeElement::stack) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pFirstArgument,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); } break; } - case TypeElement::stack: + else if(m_pFirstArgument == nullptr && m_enTypeMatrix == TypeElement::matrix) { - CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); - std::vector pTempValue = pTempBracket->GetBracketValue(); - for(CElement* pOneElement:pTempValue) - { - if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol) - { - CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:mr",false,false); - pXmlWrite->WriteNodeBegin(L"m:mr",false); - } - } + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); break; } + else if(m_pFirstArgument == nullptr && m_enTypeMatrix == TypeElement::stack) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",nullptr,pXmlWrite); + break; + } + } case TypeElement::binom: { CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pFirstArgument,pXmlWrite); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 025fdc6836..d33a080839 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -39,7 +39,10 @@ #include #include #include +#include +#include #include "../../../../DesktopEditor/xml/include/xmlwriter.h" +#include "../../../../OOXML/Base/Unit.h" namespace StarMath { @@ -100,7 +103,7 @@ namespace StarMath class CStarMathReader { public: - CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd,const TypeConversion &enTypeConversion); + CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd,const TypeConversion &enTypeConversion); ~CStarMathReader(); bool GetToken(); //getting a subtype and setting the global type of a token to variables m_enUnderType and m_enGlobalType @@ -131,8 +134,8 @@ namespace StarMath void ReadingTheNextToken(); void SetMarkForUnar(const bool& bMark); bool GetMarkForUnar(); - void SetTypeConversion(const TypeConversion &enTypeCon); - TypeConversion GetTypeConversion(); + void SetTypeConversion(const TypeConversion &enTypeCon); + TypeConversion GetTypeConversion(); private: bool CheckTokenForGetElement(const wchar_t& cToken); bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); @@ -142,7 +145,7 @@ namespace StarMath std::wstring m_wsLowerCaseToken,m_wsOriginalToken; CAttribute* m_pAttribute; CAttribute* m_pBaseAttribute; - TypeConversion m_enTypeCon; + TypeConversion m_enTypeCon; std::stack m_stBracket; }; @@ -150,7 +153,7 @@ namespace StarMath { public: CElement(); - CElement(const TypeElement& enTypeBase, const TypeConversion& enTypeConversion); + CElement(const TypeElement& enTypeBase, const TypeConversion& enTypeConversion); virtual ~CElement(); virtual void Parse(CStarMathReader* pReader) = 0; //The function creates the class we need (by determining the class type by a variable m_enGlobalType from the class CStarMathReader) @@ -161,17 +164,17 @@ namespace StarMath void SetBaseType(const TypeElement& enType); CAttribute* GetAttribute(); const TypeElement& GetBaseType(); - const TypeConversion& GetTypeConversion(); + const TypeConversion& GetTypeConversion(); private: CAttribute* m_pAttribute; TypeElement m_enBaseType; - TypeConversion m_enTypeConversion; + TypeConversion m_enTypeConversion; }; class CElementIndex: public CElement { public: - CElementIndex(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementIndex(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementIndex(); void SetValueIndex(CElement* pElement); void SetLeftArg(CElement* pElement); @@ -198,14 +201,14 @@ namespace StarMath TypeElement m_enTypeIndex; }; - class CElementString: public CElement + class CElementString: public CElement { public: - CElementString(const std::wstring& wsTokenString, const TypeConversion &enTypeConversion); + CElementString(const std::wstring& wsTokenString, const TypeConversion &enTypeConversion); virtual ~CElementString(); void SetString(const std::wstring& wsTokenString); std::wstring GetString(); - static TypeElement GetDigit(const std::wstring& wsCheckToken); + static TypeElement GetDigit(const std::wstring& wsCheckToken); static TypeElement GetWord(const std::wstring& wsToken); void SetAttribute(CAttribute* pAttribute) override; private: @@ -217,7 +220,7 @@ namespace StarMath class CElementBinOperator: public CElement { public: - CElementBinOperator(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementBinOperator(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementBinOperator(); void SetLeftArg(CElement* pElement); void SetRightArg(CElement* pElement); @@ -242,7 +245,7 @@ namespace StarMath class CElementOperator: public CElement { public: - CElementOperator(const TypeElement& enType, const TypeConversion &enTypeConversion ,const std::wstring& wsNameOp = L""); + CElementOperator(const TypeElement& enType, const TypeConversion &enTypeConversion ,const std::wstring& wsNameOp = L""); virtual ~CElementOperator(); void SetValueOperator(CElement* pElement); CElement* GetValueOperator(); @@ -270,7 +273,7 @@ namespace StarMath class CElementGrade: public CElement { public: - CElementGrade(const TypeConversion &enTypeConversion); + CElementGrade(const TypeConversion &enTypeConversion); virtual ~CElementGrade(); void SetValueGrade(CElement* pElement); void SetValueFrom(CElement* pElement); @@ -288,7 +291,7 @@ namespace StarMath class CElementBracket: public CElement { public: - CElementBracket(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementBracket(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementBracket(); void SetBracketValue(const std::vector& arValue); static TypeElement GetBracketOpen(const std::wstring& wsToken); @@ -306,7 +309,7 @@ namespace StarMath class CElementBracketWithIndex: public CElement { public: - CElementBracketWithIndex(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementBracketWithIndex(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementBracketWithIndex(); void SetLeftArg(CElement* pElement); void SetBracketValue(CElement* pElement); @@ -325,7 +328,7 @@ namespace StarMath class CElementSetOperations: public CElement { public: - CElementSetOperations(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementSetOperations(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementSetOperations(); void SetLeftArg(CElement* pElement); CElement* GetLeftArg(); @@ -345,7 +348,7 @@ namespace StarMath class CElementConnection: public CElement { public: - CElementConnection(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementConnection(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementConnection(); void SetRightArg(CElement* pElement); CElement* GetRightArg(); @@ -365,7 +368,7 @@ namespace StarMath class CElementFunction: public CElement { public: - CElementFunction(const TypeElement& enType, const TypeConversion &enTypeConversion,const std::wstring& wsNameFunc = L""); + CElementFunction(const TypeElement& enType, const TypeConversion &enTypeConversion,const std::wstring& wsNameFunc = L""); virtual ~CElementFunction(); void SetValueFunction(CElement* pElement); CElement* GetValueFunction(); @@ -385,7 +388,7 @@ namespace StarMath class CElementSpecialSymbol: public CElement { public: - CElementSpecialSymbol(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementSpecialSymbol(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementSpecialSymbol(); static TypeElement GetSpecialSymbol(std::wstring& wsToken); void SetValue(CElement* pValue); @@ -403,7 +406,7 @@ namespace StarMath class CElementMatrix: public CElement { public: - CElementMatrix(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementMatrix(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementMatrix(); void SetFirstArgument(CElement* pElement); void SetSecondArgument(CElement* pElement); @@ -420,7 +423,7 @@ namespace StarMath class CElementDiacriticalMark: public CElement { public: - CElementDiacriticalMark(const TypeElement& enType,const TypeConversion &enTypeConversion); + CElementDiacriticalMark(const TypeElement& enType,const TypeConversion &enTypeConversion); virtual ~CElementDiacriticalMark(); void SetValueMark(CElement* pValue); static TypeElement GetMark(const std::wstring& wsToken); @@ -437,7 +440,7 @@ namespace StarMath public: CParserStarMathString(); ~CParserStarMathString(); - std::vector Parse(std::wstring& wsParseString,int iTypeConversion,const TBaseAttribute* pBaseAttribute = nullptr); + std::vector Parse(std::wstring& wsParseString,int iTypeConversion = 0); static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeConversion.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeConversion.h index f13733e5c5..9e9ad4d3de 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeConversion.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeConversion.h @@ -4,9 +4,10 @@ namespace StarMath { enum class TypeConversion { - undefine, - pptx, - docx, + undefine, + pptx, + docx, + xlsx, }; } diff --git a/OdfFile/Reader/Format/chart_build_oox.cpp b/OdfFile/Reader/Format/chart_build_oox.cpp index 0b72a70e1b..2ec5bfe082 100644 --- a/OdfFile/Reader/Format/chart_build_oox.cpp +++ b/OdfFile/Reader/Format/chart_build_oox.cpp @@ -209,7 +209,7 @@ void object_odf_context::xlsx_convert(oox::xlsx_conversion_context & Context) Context.get_math_context().base_font_bold_ = baseFontBold_; Context.get_math_context().start(); - office_math_->oox_convert(Context.get_math_context()); + office_math_->oox_convert(Context.get_math_context(),3); } else if(object_type_ == 4 && office_spreadsheet_) { diff --git a/OdfFile/Reader/Format/math_elements.cpp b/OdfFile/Reader/Format/math_elements.cpp index 8bc27716dd..a47bea0701 100644 --- a/OdfFile/Reader/Format/math_elements.cpp +++ b/OdfFile/Reader/Format/math_elements.cpp @@ -125,7 +125,7 @@ void math_semantics::oox_convert(oox::math_context &Context, int iTypeConversion parser.SetBaseItalic(Context.base_font_italic_); parser.SetBaseBold(Context.base_font_bold_); - /*result = */converter.StartConversion(parser.Parse(annotation_text,iTypeConversion)); + /*result = */converter.StartConversion(parser.Parse(annotation_text,iTypeConversion),parser.GetAlignment()); Context.output_stream() << converter.GetOOXML(); From 73dc77087034134463f1a8fb339420dd1149537c Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 14 May 2024 17:41:48 +0600 Subject: [PATCH 68/88] Fix bug #66678 --- OOXML/XlsxFormat/Table/Tables.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index c7cbe495aa..0408e1abc7 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -1456,8 +1456,12 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") ptr->fPersist = m_PreserveSortFilterLayout.get(); if(m_UnboundColumnsLeft.IsInit()) ptr->ccolExtraLeft = m_UnboundColumnsLeft->GetValue(); + else + ptr->ccolExtraLeft = 0; if(m_UnboundColumnsRight.IsInit()) ptr->ccolExtraRight = m_UnboundColumnsRight->GetValue(); + else + ptr->ccolExtraRight = 0; if(m_oQueryTableFields.IsInit()) ptr1->m_QSIFS = m_oQueryTableFields->toBin(); From 5617968a0c30fc98878fb705c64032fbd37dd6f7 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 14 May 2024 17:51:19 +0500 Subject: [PATCH 69/88] Fix bug #67926 --- OOXML/PPTXFormat/Logic/Pic.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 163df8d7f7..a57e12c544 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -913,8 +913,7 @@ namespace PPTX bOle = true; pWriter->WriteString(L""); pWriter->WriteString(L"WriteString(L" name=\"" + nvPicPr.cNvPr.name + L"\""); + pWriter->WriteString(L" name=\"" + nvPicPr.cNvPr.name + L"\""); pWriter->WriteString(L"/>"); pWriter->WriteString(L""); pWriter->WriteString(L""); From 7dbe7eb3e13bd5698c9e1a77e4794eade7fb8d38 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 14 May 2024 19:16:08 +0600 Subject: [PATCH 70/88] Fix bug #66677 --- .../XlsFile/Format/Logic/Biff_structures/Ftab_Cetab.cpp | 2 +- .../Format/Logic/Biff_structures/StringPtgParser.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ftab_Cetab.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ftab_Cetab.cpp index c0927f9514..52e9b35864 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ftab_Cetab.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ftab_Cetab.cpp @@ -529,7 +529,7 @@ Ftab_Cetab::ValuesDetermination::ValuesDetermination() params_fixed.insert(ParamsFixed(0x01DE, 1, L"CUBESET")); params_fixed.insert(ParamsFixed(0x01DF, 1, L"CUBESETCOUNT")); params_fixed.insert(ParamsFixed(0x01E0, 2, L"IFERROR")); - params_fixed.insert(ParamsFixed(0x01E1, 2, L"COUNTIFS")); + params_fixed.insert(ParamsFixed(0x01E1, -1, L"COUNTIFS")); params_fixed.insert(ParamsFixed(0x01E2, 3, L"SUMIFS")); params_fixed.insert(ParamsFixed(0x01E3, 2, L"AVERAGEIF")); params_fixed.insert(ParamsFixed(0x01E4, 3, L"AVERAGEIFS")); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 980924d3fc..71432f8593 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -597,6 +597,12 @@ std::vector StringPtgParser::PosValArgs(const unsigned int &index) const argVector.push_back(false); argVector.push_back(true); break; + case 0x01E1: + for(auto i = 0; i < 127; i++) + { + argVector.push_back(false); + argVector.push_back(true); + } default: break; } From d85b3dd7f046792ab0a11b3f31884017a11029ce Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Tue, 14 May 2024 21:43:21 +0300 Subject: [PATCH 71/88] Support images on recognize --- .../graphics/pro/js/drawingfile.json | 6 +++- .../pro/js/wasm/js/drawingfile_base.js | 24 ++++++++++++++ .../graphics/pro/js/wasm/src/drawingfile.cpp | 17 ++++++++++ .../graphics/pro/js/wasm/src/drawingfile.h | 7 ++++ DocxRenderer/src/logic/elements/Shape.cpp | 32 +++++++++++++++++++ .../src/logic/managers/ExternalImageStorage.h | 2 +- .../src/logic/managers/ImageManager.cpp | 23 +++++++++---- PdfFile/PdfFile.cpp | 1 + 8 files changed, 104 insertions(+), 8 deletions(-) diff --git a/DesktopEditor/graphics/pro/js/drawingfile.json b/DesktopEditor/graphics/pro/js/drawingfile.json index f19239e88d..1a5e6af811 100644 --- a/DesktopEditor/graphics/pro/js/drawingfile.json +++ b/DesktopEditor/graphics/pro/js/drawingfile.json @@ -45,7 +45,11 @@ "_DestroyTextInfo", "_IsNeedCMap", "_SetCMapData", - "_ScanPage" + "_ScanPage", + "_GetImageBase64", + "_GetImageBase64Len", + "_GetImageBase64Ptr", + "_GetImageBase64Free" ], "include_path": [ "wasm/src/lib", diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js index 88a03169d6..37d8ed182a 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js @@ -158,6 +158,8 @@ this.fontPageIndex = -1; this.fontPageUpdateType = UpdateFontsSource.Undefined; this.fontStreams = {}; + + this.scannedImages = {}; } CFile.prototype["loadFromData"] = function(arrayBuffer) @@ -1641,6 +1643,28 @@ return shapes; }; + CFile.prototype["getImageBase64"] = function(rId) + { + let strId = "" + rId; + if (this.scannedImages[strId]) + return this.scannedImages[strId]; + + let strPtr = Module["_GetImageBase64"](this.nativeFile, rId); + if (0 == strPtr) + { + this.scannedImages[strId] = "error"; + return this.scannedImages[strId]; + } + + let len = Module["_GetImageBase64Len"](strPtr); + let ptr = Module["_GetImageBase64Ptr"](strPtr); + + var buffer = new Uint8Array(Module["HEAP8"].buffer, ptr, len); + this.scannedImages[strId] = String.prototype.fromUtf8(buffer, 0, len); + Module["_GetImageBase64Free"](strPtr); + return this.scannedImages[strId]; + }; + CFile.prototype.memory = function() { return Module["HEAP8"]; diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp index 2221c4c86e..3801b96d6f 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp @@ -267,6 +267,23 @@ WASM_EXPORT BYTE* ScanPage(CGraphicsFileDrawing* pGraphics, int nPageIndex, int return pGraphics->GetPageShapes(nPageIndex, mode); } +WASM_EXPORT void* GetImageBase64(CGraphicsFileDrawing* pGraphics, int rId) +{ + return pGraphics->GetImageBase64(rId); +} +WASM_EXPORT int GetImageBase64Len(std::string* p) +{ + return (int)p->length(); +} +WASM_EXPORT char* GetImageBase64Ptr(std::string* p) +{ + return (char*)p->c_str(); +} +WASM_EXPORT void GetImageBase64Free(std::string* p) +{ + *p = ""; +} + #ifdef __cplusplus } #endif diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h index 4a79910fb5..5fb3f8efc0 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h @@ -220,6 +220,13 @@ public: oRes.ClearWithoutAttack(); return res; } + + std::string* GetImageBase64(int nRId) + { + if (NULL == pImageStorage) + return NULL; + return pImageStorage->GetBase64(nRId); + } }; #endif // _WASM_GRAPHICS_ diff --git a/DocxRenderer/src/logic/elements/Shape.cpp b/DocxRenderer/src/logic/elements/Shape.cpp index 44137f4ebd..77c6c8ff0d 100644 --- a/DocxRenderer/src/logic/elements/Shape.cpp +++ b/DocxRenderer/src/logic/elements/Shape.cpp @@ -944,6 +944,38 @@ namespace NSDocxRenderer } void CShape::ToXmlPptx(NSStringUtils::CStringBuilder &oWriter) const { + if (m_eType == eShapeType::stPicture) + { + // TODO: + oWriter.WriteString(L""); + oWriter.WriteString(L""); + oWriter.WriteString(L"m_nId); + oWriter.WriteString(L"\" name=\"Picture "); + oWriter.AddUInt(m_pImageInfo->m_nId); + oWriter.WriteString(L"\"/>"); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + + oWriter.WriteString(L""); + oWriter.WriteString(L"m_nId); + oWriter.WriteString(L"\">"); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + + oWriter.WriteString(L""); + BuildForm(oWriter, true); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + oWriter.WriteString(L""); + return; + } + oWriter.WriteString(L""); oWriter.WriteString(L""); diff --git a/DocxRenderer/src/logic/managers/ExternalImageStorage.h b/DocxRenderer/src/logic/managers/ExternalImageStorage.h index 06926606fb..1784da1a7b 100644 --- a/DocxRenderer/src/logic/managers/ExternalImageStorage.h +++ b/DocxRenderer/src/logic/managers/ExternalImageStorage.h @@ -21,7 +21,7 @@ namespace NSDocxRenderer public: virtual std::shared_ptr GenerateImageID(Aggplus::CImage* pImage) = 0; - virtual std::map* GetImages() = 0; + virtual std::string* GetBase64(const int& nRId) = 0; }; DOCXRENDERER_DECL_EXPORT IImageStorage* CreateWasmImageStorage(); diff --git a/DocxRenderer/src/logic/managers/ImageManager.cpp b/DocxRenderer/src/logic/managers/ImageManager.cpp index f5c89bf1ca..ad08a20e49 100644 --- a/DocxRenderer/src/logic/managers/ImageManager.cpp +++ b/DocxRenderer/src/logic/managers/ImageManager.cpp @@ -1,5 +1,6 @@ #include "ImageManager.h" #include "../../../../DesktopEditor/common/Directory.h" +#include "../../resources/Constants.h" namespace NSDocxRenderer { @@ -10,7 +11,7 @@ namespace NSDocxRenderer { private: std::map> m_mapImageData; - std::map m_mapImages; + std::map m_mapImages; int m_lMaxSizeImage{1200}; int m_lNextIDImage{0}; @@ -87,21 +88,31 @@ namespace NSDocxRenderer oBgraFrame.put_Data(NULL); int nBase64DataSize = NSBase64::Base64EncodeGetRequiredLength(nEncodeBufferSize); - char* pBase64Data = new char[nBase64DataSize]; + int nHeaderSize = (pInfo->m_eType == CImageInfo::itPNG) ? 22 : 23; - NSBase64::Base64Encode(pEncodeBuffer, nEncodeBufferSize, (BYTE*)pBase64Data, &nBase64DataSize, NSBase64::B64_BASE64_FLAG_NOCRLF); + char* pBase64Data = new char[nBase64DataSize + nHeaderSize]; + if (pInfo->m_eType == CImageInfo::itPNG) + memcpy(pBase64Data, "data:image/png;base64,", nHeaderSize); + else + memcpy(pBase64Data, "data:image/jpeg;base64,", nHeaderSize); + + NSBase64::Base64Encode(pEncodeBuffer, nEncodeBufferSize, (BYTE*)pBase64Data + nHeaderSize, &nBase64DataSize, NSBase64::B64_BASE64_FLAG_NOCRLF); RELEASEARRAYOBJECTS(pEncodeBuffer); - m_mapImages.insert(std::pair(pInfo->m_strFileName, std::string(pBase64Data, nBase64DataSize))); + m_mapImages.insert(std::pair((int)pInfo->m_nId, std::string(pBase64Data, nHeaderSize + nBase64DataSize))); RELEASEARRAYOBJECTS(pBase64Data); m_mapImageData.insert(std::pair>(dwSum, pInfo)); return pInfo; } - virtual std::map* GetImages() + virtual std::string* GetBase64(const int& nRId) { - return &m_mapImages; + std::map::iterator iter = m_mapImages.find(nRId - c_iStartingIdForImages); + if (iter == m_mapImages.end()) + return NULL; + + return &iter->second; } }; diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index c69218d3b1..a4bda134f0 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -55,6 +55,7 @@ public: int GetRotate(int nPageIndex) { return 0; } void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY) {} bool IsEditPage() { return false; } + bool EditPage(int nPageIndex) { return false; } void AddShapeXML(const std::string& sXML) {} void EndMarkedContent() {} }; From 52555f4d9d56ce89cb24eb96c70620054b8de904 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 15 May 2024 09:24:08 +0300 Subject: [PATCH 72/88] fix bug #67963 --- .../OfficeArtBStoreContainerFileBlock.cpp | 110 +++++++++--------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtBStoreContainerFileBlock.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtBStoreContainerFileBlock.cpp index bde4c2d8e5..2c56f58297 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtBStoreContainerFileBlock.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtBStoreContainerFileBlock.cpp @@ -106,68 +106,68 @@ void OfficeArtBStoreContainerFileBlock::load(XLS::CFRecord& record) switch (rc_header.recType) { case OfficeArtRecord::BlipEMF: + { + pict_type = L".emf"; + if (rc_header.recInstance == 0x3D4) + rgbUid1 = ReadMD4Digest(record); + else { - pict_type = L".emf"; - if (rc_header.recInstance == 0x3D4) - rgbUid1 = ReadMD4Digest(record); - else - { - rgbUid1 = ReadMD4Digest(record); - rgbUid2 = ReadMD4Digest(record); - } - - OfficeArtMetafileHeader metafileHeader; - record >> metafileHeader; - - if (metafileHeader.compression == 0) - { - isCompressed = true; - readCompressedData(record, metafileHeader); - } + rgbUid1 = ReadMD4Digest(record); + rgbUid2 = ReadMD4Digest(record); } - break; + + OfficeArtMetafileHeader metafileHeader; + record >> metafileHeader; + + if (metafileHeader.compression == 0) + { + isCompressed = true; + readCompressedData(record, metafileHeader); + } + } + break; case OfficeArtRecord::BlipWMF: + { + pict_type = L".wmf"; + if (rc_header.recInstance == 0x216) + rgbUid1 = ReadMD4Digest(record); + else { - pict_type = L".wmf"; - if (rc_header.recInstance == 0x216) - rgbUid1 = ReadMD4Digest(record); - else - { - rgbUid1 = ReadMD4Digest(record); - rgbUid2 = ReadMD4Digest(record); - } - - OfficeArtMetafileHeader metafileHeader; - record >> metafileHeader; - - if (metafileHeader.compression == 0) - { - isCompressed = true; - readCompressedData(record, metafileHeader); - } + rgbUid1 = ReadMD4Digest(record); + rgbUid2 = ReadMD4Digest(record); } - break; + + OfficeArtMetafileHeader metafileHeader; + record >> metafileHeader; + + if (metafileHeader.compression == 0) + { + isCompressed = true; + readCompressedData(record, metafileHeader); + } + } + break; case OfficeArtRecord::BlipPICT: + { + pict_type = L".pcz"; + if (rc_header.recInstance == 0x542) + rgbUid1 = ReadMD4Digest(record); + else { - pict_type = L".pcz"; - if (rc_header.recInstance == 0x542) - rgbUid1 = ReadMD4Digest(record); - else - { - rgbUid1 = ReadMD4Digest(record); - rgbUid2 = ReadMD4Digest(record); - } - - OfficeArtMetafileHeader metafileHeader; - record >> metafileHeader; - - if (metafileHeader.compression == 0) - { - isCompressed = true; - readCompressedData(record, metafileHeader); - } + rgbUid1 = ReadMD4Digest(record); + rgbUid2 = ReadMD4Digest(record); } - break; + + OfficeArtMetafileHeader metafileHeader; + record >> metafileHeader; + + if (metafileHeader.compression == 0) + { + isCompressed = true; + readCompressedData(record, metafileHeader); + } + } + break; case OfficeArtRecord::BlipJPEG: pict_type = L".jpeg"; if ((rc_header.recInstance == 0x46A) || (rc_header.recInstance == 0x6E2)) @@ -233,7 +233,7 @@ void OfficeArtBStoreContainerFileBlock::load(XLS::CFRecord& record) } break; default: - record.RollRdPtrBack(rc_header.size()); + record.skipNunBytes(rc_header.recLen); return; } From ad1bd06bb373f47a32cbae7445a990f9e47dbb3e Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 15 May 2024 09:55:58 +0300 Subject: [PATCH 73/88] fix bug #67968 --- .../PptFile/PPTXWriter/TableWriter.cpp | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp index 393d050486..47245d0fe1 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp @@ -243,7 +243,15 @@ bool ProtoTable::fillCells(std::vector &arrCells) if (top == m_arrTop[posRow]) break; for (; posCol < countCol; posCol++) if (left == m_arrLeft[posCol]) break; - TCell* pParent = &m_table[posRow][posCol]; + TCell* pParent = NULL; + + if (posRow < m_table.size()) + { + if (posCol < m_table[posRow].size()) + { + pParent = &m_table[posRow][posCol]; + } + } UINT posRightCol = 0, posBottomRow = 0; for (; posBottomRow < countRow; posBottomRow++) @@ -263,9 +271,11 @@ bool ProtoTable::fillCells(std::vector &arrCells) if (posRow == cRow) tCell.setRowSpan(posBottomRow - cRow); } - pParent->setPParent(nullptr); - pParent->setPShape(ptrCell); - + if (pParent) + { + pParent->setPParent(nullptr); + pParent->setPShape(ptrCell); + } // pParent->setGridSpan(posRightCol - posCol); // pParent->setRowSpan(posBottomRow - posRow); } @@ -562,7 +572,7 @@ bool TCell::isRealCell() const return true; } -void TCell::FillTxBody(PPTX::Logic::TxBody &oTxBody, CTextCFRun* pLastCF) +void TCell::FillTxBody(PPTX::Logic::TxBody& oTxBody, CTextCFRun* pLastCF) { TxBodyConverter txBodyConverter(m_ptrSpElCell, m_pRels, pLastCF); txBodyConverter.FillTxBody(oTxBody); @@ -570,6 +580,8 @@ void TCell::FillTxBody(PPTX::Logic::TxBody &oTxBody, CTextCFRun* pLastCF) void TCell::FillTcPr(PPTX::Logic::TableCellProperties &oTcPr) { + if (!m_ptrSpElCell) return; + auto pShapeEl = static_cast(m_ptrSpElCell.get()); auto pShape = pShapeEl->m_pShape; //anchor From 8857d3daca061912846a577482d1a4f598d279a1 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 15 May 2024 11:00:27 +0300 Subject: [PATCH 74/88] fix bug #67972 --- .../XlsFile/Format/Logic/Biff_records/Label.cpp | 2 +- .../XlsFile/Format/Logic/Biff_records/Number.cpp | 15 +++++++++++++-- .../XlsFile/Format/Logic/Biff_structures/Cell.cpp | 3 ++- .../XlsFile/Format/Logic/Biff_unions/COLUMNS.cpp | 5 +++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp index 937691a8da..96200f2720 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp @@ -57,7 +57,7 @@ void Label::readFields(CFRecord& record) record >> cell; - if (global_info_->Version == 0x0200) + if (global_info_->Version == 0x0200 || global_info_->Version == 0x0400) { ShortXLAnsiString name; record >> name; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp index 18c975d9a2..3b7549da4d 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp @@ -94,7 +94,7 @@ int Number::serialize(std::wostream & stream) return 0; } //--------------------------------------------------------------------------------- -Integer_BIFF2::Integer_BIFF2() +Integer_BIFF2::Integer_BIFF2() : num(0) {} Integer_BIFF2::~Integer_BIFF2() {} @@ -106,7 +106,18 @@ void Integer_BIFF2::readFields(CFRecord& record) { global_info_ = record.getGlobalWorkbookInfo(); - record >> cell >> num; + record >> cell; + + if (record.getRdPtr() + 2 < record.getDataSize()) + { + record >> num; + } + else + { + _INT16 num_2byte = 0; + record >> num_2byte; + num = num_2byte; + } } const CellRef Integer_BIFF2::getLocation() const { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp index b4cff4fc91..f8b19e0b4b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp @@ -59,7 +59,8 @@ void Cell::load(CFRecord& record) { record >> rw >> col; - if (record.getGlobalWorkbookInfo()->Version == 0x0200) + if (record.getGlobalWorkbookInfo()->Version == 0x0200 || + record.getGlobalWorkbookInfo()->Version == 0x0400) { unsigned char flags1, flags2, flags3; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/COLUMNS.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/COLUMNS.cpp index da94f8bf28..744f0a0a6e 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/COLUMNS.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/COLUMNS.cpp @@ -68,6 +68,11 @@ const bool COLUMNS::loadContent(BinProcessor& proc) } int count = (global_info_->Version == 0x0200) ? proc.repeated(0, 255) : proc.repeated(0, 255); + if (count < 1) + {//version 0x0400 ???? ColWidth + count = (global_info_->Version == 0x0200) ? proc.repeated(0, 255) : proc.repeated(0, 255); + } + int last_add = 0; for (std::list::iterator it = elements_.begin(); it != elements_.end(); ++it) From c14856ac6fafcb277ec2f0f7687761d4c66b5207 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 15 May 2024 11:15:31 +0300 Subject: [PATCH 75/88] fix bug #68011 --- MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp index 067edc0275..f5623ebbef 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp @@ -144,6 +144,8 @@ bool CPPTDocumentInfo::LoadDocument() { m_arUsers[0]->ReadExtenalObjects(); // todooo ???? прочитать по всем (см 66864) m_arUsers[0]->FromDocument(); + + m_bMacroEnabled = m_arUsers[0]->m_bMacroEnabled; } catch(int) //error code { From 1e7611f3f9f6eb822c3e0f8025ef32c304a74e7e Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 15 May 2024 13:20:20 +0300 Subject: [PATCH 76/88] Add method for duplicate image links on recognize --- .../graphics/pro/js/wasm/js/drawingfile_base.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js index 37d8ed182a..0590fe82d2 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js @@ -1665,6 +1665,15 @@ return this.scannedImages[strId]; }; + CFile.prototype["changeImageUrl"] = function(baseUrl, resultUrl) + { + for (let i in this.scannedImages) + { + if (this.scannedImages[i] == baseUrl) + this.scannedImages[i] = resultUrl; + } + }; + CFile.prototype.memory = function() { return Module["HEAP8"]; From 5ea601cde97ab5d399a4587d05da8893d11f5314 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 15 May 2024 16:25:51 +0300 Subject: [PATCH 77/88] fix bug #67973 --- MsBinaryFile/PptFile/Main/PPTFormatLib.cpp | 2 +- .../XlsFile/Format/Logic/EncryptionStream.cpp | 21 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp b/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp index 4a20e696f3..aebb08fd78 100644 --- a/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp +++ b/MsBinaryFile/PptFile/Main/PPTFormatLib.cpp @@ -109,7 +109,7 @@ bool COfficePPTFile::CloseFile() PPT::CPPTFileReader* r = (PPT::CPPTFileReader*)m_pReader; RELEASEOBJECT(r); m_pReader = NULL; - return S_OK; + return true; } _UINT32 COfficePPTFile::LoadFromFile(std::wstring sSrcFileName, std::wstring sDstPath, std::wstring password, bool &bMacros) diff --git a/MsBinaryFile/XlsFile/Format/Logic/EncryptionStream.cpp b/MsBinaryFile/XlsFile/Format/Logic/EncryptionStream.cpp index 396bd55dee..9290f225a5 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/EncryptionStream.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/EncryptionStream.cpp @@ -78,15 +78,28 @@ namespace XLS BYTE fStream = ((BYTE*)(buf2 + pos))[0]; pos += 1; pos += 4; - std::wstring name = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)(buf2 + pos), NameSize); pos += NameSize * 2; + std::wstring name; + + if (pos + NameSize < StreamDescriptorArraySize) + { + name = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)(buf2 + pos), NameSize); + } + pos += NameSize * 2; + + if (pos + 1 < StreamDescriptorArraySize && buf2[pos] == 0 && buf2[pos + 1] == 0) + pos += 2; // padding??? std::pair, size_t> data; - data.first = boost::shared_array(new BYTE[StreamSize]); - data.second = StreamSize; - memcpy(data.first.get(), buf1 + StreamOffset - 8, StreamSize); // 8 = start stream offset + if (StreamSize + StreamOffset < StreamDescriptorArrayOffset) + { + data.first = boost::shared_array(new BYTE[StreamSize]); + data.second = StreamSize; + memcpy(data.first.get(), buf1 + StreamOffset - 8, StreamSize); // 8 = start stream offset + } streams.insert(std::make_pair(name, data)); + } delete[]buf1; From 3d23e748182b0f61faa6b686f8f5614db82c0fa2 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Thu, 16 May 2024 21:48:26 +0500 Subject: [PATCH 78/88] Fix bug #61378 --- OdfFile/Reader/Converter/pptx_text_context.cpp | 2 +- OdfFile/Writer/Converter/ConvertDrawing.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_text_context.cpp b/OdfFile/Reader/Converter/pptx_text_context.cpp index f3ee5fe6e2..74d26af809 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.cpp +++ b/OdfFile/Reader/Converter/pptx_text_context.cpp @@ -701,7 +701,7 @@ void pptx_text_context::Impl::start_list_item(bool restart) void pptx_text_context::Impl::start_list(const std::wstring & StyleName, bool Continue) { - if (paragraphs_cout_ > 0 && ( in_paragraph || list_style_stack_.empty())) + if (paragraphs_cout_ > 0 && ( in_paragraph || !list_style_stack_.empty())) { dump_paragraph(); } diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 3965a23bd7..590eb17451 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -2145,7 +2145,9 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T } else { - odf_context()->text_context()->start_span(true); + bool styled = oox_paragraph->endParaRPr.IsInit() && oox_paragraph->endParaRPr->sz.IsInit(); + + odf_context()->text_context()->start_span(styled); odf_context()->text_context()->end_span(); } From 140f9970f966a197369f3baa395bacf558ac9c91 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 17 May 2024 12:07:22 +0400 Subject: [PATCH 79/88] Add wrapper library `docbuilder_functions.dll` and tests for it --- .../src/docbuilder_func_lib.pro | 28 ++ .../src/docbuilder_functions.cpp | 394 ++++++++++++++++++ .../src/docbuilder_functions.h | 134 ++++++ .../test/docbuilder_func_test.pro | 28 ++ .../docbuilder.python/test/main.cpp | 58 +++ 5 files changed, 642 insertions(+) create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro new file mode 100644 index 0000000000..f48067b541 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro @@ -0,0 +1,28 @@ +QT -= core +QT -= gui + +TARGET = docbuilder_functions + +TEMPLATE = lib + +CONFIG += shared +CONFIG += plugin + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +ADD_DEPENDENCY(doctrenderer) + +DESTDIR = $$PWD/build + +INCLUDEPATH += ../.. + +DEFINES += DOCBUILDER_FUNCTIONS_EXPORT + +SOURCES += \ + docbuilder_functions.cpp + +HEADERS += \ + docbuilder_functions.h diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp new file mode 100644 index 0000000000..e731076181 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -0,0 +1,394 @@ +#include "docbuilder_functions.h" + +#include + +// ===== CDocBuilderValue ===== +CDocBuilderValue* CDocBuilderValue_Create() +{ + return new CDocBuilderValue(); +} + +CDocBuilderValue* CDocBuilderValue_Copy(CDocBuilderValue* other) +{ + return new CDocBuilderValue(*other); +} + +void CDocBuilderValue_Destroy(CDocBuilderValue* self) +{ + delete self; +} + +bool CDocBuilderValue_IsEmpty(CDocBuilderValue* self) +{ + return self->IsEmpty(); +} + +void CDocBuilderValue_Clear(CDocBuilderValue* self) +{ + self->Clear(); +} + +bool CDocBuilderValue_IsNull(CDocBuilderValue* self) +{ + return self->IsNull(); +} + +bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self) +{ + return self->IsUndefined(); +} + +bool CDocBuilderValue_IsInt(CDocBuilderValue* self) +{ + return self->IsInt(); +} + +bool CDocBuilderValue_IsDouble(CDocBuilderValue* self) +{ + return self->IsDouble(); +} + +bool CDocBuilderValue_IsString(CDocBuilderValue* self) +{ + return self->IsString(); +} + +bool CDocBuilderValue_IsFunction(CDocBuilderValue* self) +{ + return self->IsFunction(); +} + +bool CDocBuilderValue_IsObject(CDocBuilderValue* self) +{ + return self->IsObject(); +} + +bool CDocBuilderValue_IsArray(CDocBuilderValue* self) +{ + return self->IsArray(); +} + +unsigned int CDocBuilderValue_GetLength(CDocBuilderValue* self) +{ + return self->GetLength(); +} + +bool CDocBuilderValue_ToBool(CDocBuilderValue* self) +{ + return self->ToBool(); +} + +int CDocBuilderValue_ToInt(CDocBuilderValue* self) +{ + return self->ToInt(); +} + +double CDocBuilderValue_ToDouble(CDocBuilderValue* self) +{ + return self->ToDouble(); +} + +const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self) +{ + // NOTE: User is responsible for calling DeleteWCharP() on returned pointer + CString strValue = self->ToString(); + size_t len = wcslen(strValue.c_str()); + wchar_t* strRes = new wchar_t[len + 1]; + memcpy(strRes, strValue.c_str(), (len + 1) + sizeof(wchar_t)); + return strRes; +} + +CDocBuilderValue* CDocBuilderValue_GetProperty(CDocBuilderValue* self, const wchar_t* name) +{ + return new CDocBuilderValue(self->GetProperty(name)); +} + +CDocBuilderValue* CDocBuilderValue_GetByIndex(CDocBuilderValue* self, int index) +{ + return new CDocBuilderValue(self->Get(index)); +} + +void CDocBuilderValue_SetProperty(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* value) +{ + self->Set(name, *value); +} + +void CDocBuilderValue_SetByIndex(CDocBuilderValue* self, int index, CDocBuilderValue* value) +{ + self->Set(index, *value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithBool(bool value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithInt(int value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithUInt(unsigned int value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithDouble(double value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithString(const wchar_t* value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateUndefined() +{ + return new CDocBuilderValue(CDocBuilderValue::CreateUndefined()); +} + +CDocBuilderValue* CDocBuilderValue_CreateNull() +{ + return new CDocBuilderValue(CDocBuilderValue::CreateNull()); +} + +CDocBuilderValue* CDocBuilderValue_CreateArray(int length) +{ + return new CDocBuilderValue(CDocBuilderValue::CreateArray(length)); +} + +CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name) +{ + return new CDocBuilderValue(self->Call(name)); +} + +CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1) +{ + return new CDocBuilderValue(self->Call(name, *p1)); +} + +CDocBuilderValue* CDocBuilderValue_Call2(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2)); +} + +CDocBuilderValue* CDocBuilderValue_Call3(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3)); +} + +CDocBuilderValue* CDocBuilderValue_Call4(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4)); +} + +CDocBuilderValue* CDocBuilderValue_Call5(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4, *p5)); +} + +CDocBuilderValue* CDocBuilderValue_Call6(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5, CDocBuilderValue* p6) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4, *p5, *p6)); +} + +// ===== CDocBuilder ===== +CDocBuilder* CDocBuilder_Create() +{ + return new CDocBuilder(); +} + +void CDocBuilder_Destroy(CDocBuilder* self) +{ + delete self; +} + +int CDocBuilder_OpenFile(CDocBuilder* self, const wchar_t* path, const wchar_t* params) +{ + return self->OpenFile(path, params); +} + +bool CDocBuilder_CreateFileByType(CDocBuilder* self, int type) +{ + return self->CreateFile(type); +} + +bool CDocBuilder_CreateFileByExtension(CDocBuilder* self, const wchar_t* extension) +{ + return self->CreateFile(extension); +} + +void CDocBuilder_SetTmpFolder(CDocBuilder* self, const wchar_t* folder) +{ + self->SetTmpFolder(folder); +} + +int CDocBuilder_SaveFileByType(CDocBuilder* self, int type, const wchar_t* path) +{ + return self->SaveFile(type, path); +} + +int CDocBuilder_SaveFileByTypeWithParams(CDocBuilder* self, int type, const wchar_t* path, const wchar_t* params) +{ + return self->SaveFile(type, path, params); +} + +int CDocBuilder_SaveFileByExtension(CDocBuilder* self, const wchar_t* extension, const wchar_t* path) +{ + return self->SaveFile(extension, path); +} + +int CDocBuilder_SaveFileByExtensionWithParams(CDocBuilder* self, const wchar_t* extension, const wchar_t* path, const wchar_t* params) +{ + return self->SaveFile(extension, path, params); +} + +void CDocBuilder_CloseFile(CDocBuilder* self) +{ + self->CloseFile(); +} + +bool CDocBuilder_ExecuteCommand(CDocBuilder* self, const wchar_t* command) +{ + return self->ExecuteCommand(command); +} + +bool CDocBuilder_ExecuteCommandWithRetValue(CDocBuilder* self, const wchar_t* command, CDocBuilderValue* retValue) +{ + return self->ExecuteCommand(command, retValue); +} + +bool CDocBuilder_Run(CDocBuilder* self, const wchar_t* path) +{ + return self->Run(path); +} + +bool CDocBuilder_RunText(CDocBuilder* self, const wchar_t* commands) +{ + return self->RunTextW(commands); +} + +void CDocBuilder_SetProperty(CDocBuilder* self, const wchar_t* param, const wchar_t* value) +{ + self->SetPropertyW(param, value); +} + +void CDocBuilder_WriteData(CDocBuilder* self, const wchar_t* path, const wchar_t* value, bool append) +{ + self->WriteData(path, value, append); +} + +bool CDocBuilder_IsSaveWithDoctrendererMode(CDocBuilder* self) +{ + return self->IsSaveWithDoctrendererMode(); +} + +char* CDocBuilder_GetVersion(CDocBuilder* self) +{ + // NOTE: User is responsible for calling DeleteCharP() on returned pointer + return self->GetVersion(); +} + +CDocBuilderContext* CDocBuilder_GetContext(CDocBuilder* self) +{ + return new CDocBuilderContext(self->GetContext()); +} + +void CDocBuilder_Initialize() +{ + CDocBuilder::Initialize(); +} + +void CDocBuilder_InitializeWithDirectory(const wchar_t* directory) +{ + CDocBuilder::Initialize(directory); +} + +void CDocBuilder_Dispose() +{ + CDocBuilder::Dispose(); +} + +// ===== CDocBuilderContextScope ===== +CDocBuilderContextScope* CDocBuilderContextScope_Create() +{ + return new CDocBuilderContextScope(); +} + +CDocBuilderContextScope* CDocBuilderContextScope_Copy(CDocBuilderContextScope* other) +{ + return new CDocBuilderContextScope(*other); +} + +void CDocBuilderContextScope_Destroy(CDocBuilderContextScope* self) +{ + delete self; +} + +void CDocBuilderContextScope_Close(CDocBuilderContextScope* self) +{ + self->Close(); +} + +// ===== CDocBuilderContext ===== +CDocBuilderContext* CDocBuilderContext_Create() +{ + return new CDocBuilderContext(); +} + +CDocBuilderContext* CDocBuilderContext_Copy(CDocBuilderContext* other) +{ + return new CDocBuilderContext(*other); +} + +void CDocBuilderContext_Destroy(CDocBuilderContext* self) +{ + delete self; +} + +CDocBuilderValue* CDocBuilderContext_CreateUndefined(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->CreateUndefined()); +} + +CDocBuilderValue* CDocBuilderContext_CreateNull(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->CreateNull()); +} + +CDocBuilderValue* CDocBuilderContext_CreateObject(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->CreateObject()); +} + +CDocBuilderValue* CDocBuilderContext_CreateArray(CDocBuilderContext* self, int length) +{ + return new CDocBuilderValue(self->CreateArray(length)); +} + +CDocBuilderValue* CDocBuilderContext_GetGlobal(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->GetGlobal()); +} + +CDocBuilderContextScope* CDocBuilderContext_CreateScope(CDocBuilderContext* self) +{ + return new CDocBuilderContextScope(self->CreateScope()); +} + +bool CDocBuilderContext_IsError(CDocBuilderContext* self) +{ + return self->IsError(); +} + +// ===== Utility ===== +void DeleteWCharP(wchar_t* str) +{ + delete str; +} + +void DeleteCharP(char* str) +{ + delete str; +} diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h new file mode 100644 index 0000000000..a3acd2e02b --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h @@ -0,0 +1,134 @@ +#ifndef DOCBUILDER_FUNCTIONS_H +#define DOCBUILDER_FUNCTIONS_H + +#include "docbuilder.h" + +#include "../common/base_export.h" +#ifdef DOCBUILDER_FUNCTIONS_EXPORT +#define DOCBUILDER_FUNC_DECL Q_DECL_EXPORT +#else +#define DOCBUILDER_FUNC_DECL Q_DECL_IMPORT +#endif + +using namespace NSDoctRenderer; + +extern "C" +{ +// ===== CDocBuilderValue ===== +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Create(); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Copy(CDocBuilderValue* other); +DOCBUILDER_FUNC_DECL void CDocBuilderValue_Destroy(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsEmpty(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL void CDocBuilderValue_Clear(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsNull(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsInt(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsDouble(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsString(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsFunction(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsObject(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsArray(CDocBuilderValue* self); +// TODO: +// DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsTypedArray(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL unsigned int CDocBuilderValue_GetLength(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_ToBool(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL int CDocBuilderValue_ToInt(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL double CDocBuilderValue_ToDouble(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_GetProperty(CDocBuilderValue* self, const wchar_t* name); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_GetByIndex(CDocBuilderValue* self, int index); + +DOCBUILDER_FUNC_DECL void CDocBuilderValue_SetProperty(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* value); +DOCBUILDER_FUNC_DECL void CDocBuilderValue_SetByIndex(CDocBuilderValue* self, int index, CDocBuilderValue* value); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithBool(bool value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithInt(int value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithUInt(unsigned int value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithDouble(double value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithString(const wchar_t* value); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateUndefined(); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateNull(); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateArray(int length); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call2(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call3(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call4(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call5(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call6(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5, CDocBuilderValue* p6); + +// ===== CDocBuilder ===== +DOCBUILDER_FUNC_DECL CDocBuilder* CDocBuilder_Create(); +DOCBUILDER_FUNC_DECL void CDocBuilder_Destroy(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL int CDocBuilder_OpenFile(CDocBuilder* self, const wchar_t* path, const wchar_t* params); +DOCBUILDER_FUNC_DECL bool CDocBuilder_CreateFileByType(CDocBuilder* self, int type); +DOCBUILDER_FUNC_DECL bool CDocBuilder_CreateFileByExtension(CDocBuilder* self, const wchar_t* extension); + +DOCBUILDER_FUNC_DECL void CDocBuilder_SetTmpFolder(CDocBuilder* self, const wchar_t* folder); + +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByType(CDocBuilder* self, int type, const wchar_t* path); +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByTypeWithParams(CDocBuilder* self, int type, const wchar_t* path, const wchar_t* params); +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByExtension(CDocBuilder* self, const wchar_t* extension, const wchar_t* path); +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByExtensionWithParams(CDocBuilder* self, const wchar_t* extension, const wchar_t* path, const wchar_t* params); + +DOCBUILDER_FUNC_DECL void CDocBuilder_CloseFile(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilder_ExecuteCommand(CDocBuilder* self, const wchar_t* command); +DOCBUILDER_FUNC_DECL bool CDocBuilder_ExecuteCommandWithRetValue(CDocBuilder* self, const wchar_t* command, CDocBuilderValue* retValue); + +DOCBUILDER_FUNC_DECL bool CDocBuilder_Run(CDocBuilder* self, const wchar_t* path); +DOCBUILDER_FUNC_DECL bool CDocBuilder_RunText(CDocBuilder* self, const wchar_t* commands); + +DOCBUILDER_FUNC_DECL void CDocBuilder_SetProperty(CDocBuilder* self, const wchar_t* param, const wchar_t* value); + +DOCBUILDER_FUNC_DECL void CDocBuilder_WriteData(CDocBuilder* self, const wchar_t* path, const wchar_t* value, bool append); + +DOCBUILDER_FUNC_DECL bool CDocBuilder_IsSaveWithDoctrendererMode(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL char* CDocBuilder_GetVersion(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilder_GetContext(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL void CDocBuilder_Initialize(); +DOCBUILDER_FUNC_DECL void CDocBuilder_InitializeWithDirectory(const wchar_t* directory); +DOCBUILDER_FUNC_DECL void CDocBuilder_Dispose(); + +// ===== CDocBuilderContextScope ===== +DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContextScope_Create(); +DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContextScope_Copy(CDocBuilderContextScope* other); +DOCBUILDER_FUNC_DECL void CDocBuilderContextScope_Destroy(CDocBuilderContextScope* self); + +DOCBUILDER_FUNC_DECL void CDocBuilderContextScope_Close(CDocBuilderContextScope* self); + +// ===== CDocBuilderContext ===== +DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilderContext_Create(); +DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilderContext_Copy(CDocBuilderContext* other); +DOCBUILDER_FUNC_DECL void CDocBuilderContext_Destroy(CDocBuilderContext* self); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateUndefined(CDocBuilderContext* self); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateNull(CDocBuilderContext* self); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateObject(CDocBuilderContext* self); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateArray(CDocBuilderContext* self, int length); +// TODO: +// CDocBuilderContext_CreateTypedArray(CDocBuilderContext* self, unsigned char* buffer); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_GetGlobal(CDocBuilderContext* self); + +DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContext_CreateScope(CDocBuilderContext* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderContext_IsError(CDocBuilderContext* self); + +// ===== Utility ===== +DOCBUILDER_FUNC_DECL void DeleteWCharP(wchar_t* str); +DOCBUILDER_FUNC_DECL void DeleteCharP(char* str); +} + +#endif // DOCBUILDER_FUNCTIONS_H diff --git a/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro b/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro new file mode 100644 index 0000000000..19cef476ae --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro @@ -0,0 +1,28 @@ +QT -= core +QT -= gui + +TARGET = test + +TEMPLATE = app + +CONFIG -= app_bundle +CONFIG += console + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +# !!! Set docbuilder path here !!! +DOCUMENT_BUILDER_INSTALL_PATH="C:/Program Files/ONLYOFFICE/DocumentBuilder" + +DEFINES += "DOCUMENT_BUILDER_INSTALL_PATH=\"$$DOCUMENT_BUILDER_INSTALL_PATH\"" +LIBS += -L'$$DOCUMENT_BUILDER_INSTALL_PATH' -ldocbuilder_functions + +DESTDIR = $$PWD/build + +INCLUDEPATH += ../.. + +SOURCES += \ + main.cpp + diff --git a/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp b/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp new file mode 100644 index 0000000000..1e5491fd73 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp @@ -0,0 +1,58 @@ +#include "../src/docbuilder_functions.h" + +#include + +#include "app_builder_lib/utils.cpp" + +#define DECLARE_RAII_DOCBUILDER_FUNC_CLASS( CLASS_NAME ) \ +class CLASS_NAME ## F \ +{ \ +public: \ + CLASS_NAME ## F(CLASS_NAME* internal) { m_internal = internal; } \ + ~CLASS_NAME ## F() { CLASS_NAME ## _Destroy(m_internal); } \ + \ + CLASS_NAME* get() { return m_internal; } \ + \ +private: \ + CLASS_NAME* m_internal; \ +}; + +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilder) +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderValue) +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContext) +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContextScope) + +int main() +{ + std::wstring sWorkDirectory = NSUtils::GetBuilderDirectory(); + std::wstring sProcessDirectory = NSUtils::GetProcessDirectory(); + + CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); + + CDocBuilderF oBuilder = CDocBuilder_Create(); + CDocBuilder_SetProperty(oBuilder.get(), L"--work-directory", sWorkDirectory.c_str()); + + CDocBuilder_CreateFileByExtension(oBuilder.get(), L"docx"); + + CDocBuilderContextF oContext = CDocBuilder_GetContext(oBuilder.get()); + CDocBuilderContextScopeF oScope = CDocBuilderContext_CreateScope(oContext.get()); + + CDocBuilderValueF oGlobal = CDocBuilderContext_GetGlobal(oContext.get()); + + CDocBuilderValueF oApi = CDocBuilderValue_GetProperty(oGlobal.get(), L"Api"); + CDocBuilderValueF oDocument = CDocBuilderValue_Call0(oApi.get(), L"GetDocument"); + CDocBuilderValueF oParagraph = CDocBuilderValue_Call0(oApi.get(), L"CreateParagraph"); + CDocBuilderValue_Call2(oParagraph.get(), L"SetSpacingAfter", CDocBuilderValueF(CDocBuilderValue_CreateWithInt(1000)).get(), CDocBuilderValueF(CDocBuilderValue_CreateWithBool(false)).get()); + CDocBuilderValue_Call1(oParagraph.get(), L"AddText", CDocBuilderValueF(CDocBuilderValue_CreateWithString(L"Hello, world!")).get()); + CDocBuilderValueF oContent = CDocBuilderContext_CreateArray(oContext.get(), 1); + CDocBuilderValue_SetByIndex(oContent.get(), 0, oParagraph.get()); + CDocBuilderValue_Call1(oDocument.get(), L"InsertContent", oContent.get()); + + std::wstring sDstPath = sProcessDirectory + L"/result.docx"; + CDocBuilder_SaveFileByExtension(oBuilder.get(), L"docx", sDstPath.c_str()); + CDocBuilder_CloseFile(oBuilder.get()); + + CDocBuilder_Dispose(); + + return 0; +} From ebe045a83304bc1bed2eec064820d6a49b76110a Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Fri, 17 May 2024 11:56:18 +0300 Subject: [PATCH 80/88] fix bug #67995 --- MsBinaryFile/Common/Vba/StreamObjects.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/Common/Vba/StreamObjects.cpp b/MsBinaryFile/Common/Vba/StreamObjects.cpp index 44badb466b..64ae0f1c4b 100644 --- a/MsBinaryFile/Common/Vba/StreamObjects.cpp +++ b/MsBinaryFile/Common/Vba/StreamObjects.cpp @@ -41,6 +41,8 @@ namespace VBA bool DirStreamObject::loadContent() { + if (!reader) return false; + InformationRecord = boost::make_shared(reader); ReferencesRecord = boost::make_shared(reader); ModulesRecord = boost::make_shared(reader); @@ -50,12 +52,16 @@ bool DirStreamObject::loadContent() bool ModuleStreamObject::loadContent() { - SourceCode = convert_string_icu((char*)reader->getData(), (unsigned int)reader->getDataSize(), reader->CodePage); + if (!reader) return false; + + SourceCode = convert_string_icu((char*)reader->getData(), (unsigned int)reader->getDataSize(), reader->CodePage); return true; } bool ProjectStreamObject::loadContent() { + if (!reader) return false; + std::string strProps((char*)reader->getData(), reader->getDataSize()); std::vector arrProps; @@ -72,6 +78,8 @@ bool ProjectStreamObject::loadContent() } bool VBFrameObject::loadContent() { + if (!reader) return false; + std::wstring strProps = convert_string_icu((char*)reader->getData(), (unsigned int)reader->getDataSize(), reader->CodePage); std::vector arrProps; @@ -94,6 +102,8 @@ bool VBFrameObject::loadContent() bool FormControlStream::loadContent() { + if (!reader) return false; + unsigned char MinorVersion, MajorVersion; _UINT16 cbForm; From 28cd584393378a6a46256748648f5fe851ca2cc1 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 17 May 2024 14:10:50 +0400 Subject: [PATCH 81/88] Fix delete functions and add simple c++ example --- .../src/docbuilder_functions.cpp | 4 ++-- .../docbuilder.python/test/main.cpp | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp index e731076181..645b71811c 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -385,10 +385,10 @@ bool CDocBuilderContext_IsError(CDocBuilderContext* self) // ===== Utility ===== void DeleteWCharP(wchar_t* str) { - delete str; + delete[] str; } void DeleteCharP(char* str) { - delete str; + delete[] str; } diff --git a/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp b/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp index 1e5491fd73..71f06ba9a8 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp @@ -1,6 +1,7 @@ #include "../src/docbuilder_functions.h" #include +#include #include "app_builder_lib/utils.cpp" @@ -25,8 +26,21 @@ DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContextScope) int main() { std::wstring sWorkDirectory = NSUtils::GetBuilderDirectory(); - std::wstring sProcessDirectory = NSUtils::GetProcessDirectory(); +#if 1 + // Simple test that shows builder version if everything is correct + CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); + CDocBuilder* pBuilder = CDocBuilder_Create(); + + char* sVersion = CDocBuilder_GetVersion(pBuilder); + std::cout << sVersion << std::endl; + DeleteCharP(sVersion); + + CDocBuilder_Dispose(); + CDocBuilder_Destroy(pBuilder); +#else + // Test is identical to app_builder_lib.pro + // The test uses RAII wrappers - classes with 'F' postfix, which are destroyed automatically CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); CDocBuilderF oBuilder = CDocBuilder_Create(); @@ -48,11 +62,13 @@ int main() CDocBuilderValue_SetByIndex(oContent.get(), 0, oParagraph.get()); CDocBuilderValue_Call1(oDocument.get(), L"InsertContent", oContent.get()); + std::wstring sProcessDirectory = NSUtils::GetProcessDirectory(); std::wstring sDstPath = sProcessDirectory + L"/result.docx"; CDocBuilder_SaveFileByExtension(oBuilder.get(), L"docx", sDstPath.c_str()); CDocBuilder_CloseFile(oBuilder.get()); CDocBuilder_Dispose(); +#endif return 0; } From 84d7eb03f2088c6ee253209c0285609955ec8148 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 17 May 2024 14:11:22 +0400 Subject: [PATCH 82/88] Add example of python wrapper --- .../docbuilder.python/src/docbuilder.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py new file mode 100644 index 0000000000..959d1b82ee --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -0,0 +1,59 @@ +import ctypes +import os +import platform +import sys + +DOCBUILDER_HANDLE = ctypes.c_void_p +STRING_HANDLE = ctypes.c_void_p + +_lib = None + +def loadLibrary(path): + if any(platform.win32_ver()): + os.environ['PATH'] += ';' + path + else: + os.environ['PATH'] += ':' + path + + global _lib + _lib = ctypes.CDLL('docbuilder_functions.dll') + + # init all function signatures + _lib.CDocBuilder_InitializeWithDirectory.argtypes = [ctypes.c_wchar_p] + _lib.CDocBuilder_InitializeWithDirectory.restype = None + + _lib.CDocBuilder_Create.argtypes = [] + _lib.CDocBuilder_Create.restype = DOCBUILDER_HANDLE + + _lib.CDocBuilder_GetVersion.argtypes = [DOCBUILDER_HANDLE] + _lib.CDocBuilder_GetVersion.restype = STRING_HANDLE + + _lib.CDocBuilder_Dispose.argtypes = [] + _lib.CDocBuilder_Dispose.restype = None + + _lib.CDocBuilder_Destroy.argtypes = [DOCBUILDER_HANDLE] + _lib.CDocBuilder_Destroy.restype = None + + _lib.DeleteCharP.argtypes = [ctypes.c_char_p] + _lib.DeleteCharP.restype = None + + +if __name__ == '__main__': + if len(sys.argv) < 2: + print('Specify the folder with document builder and all dll-s') + exit(0) + + path = sys.argv[1] + + loadLibrary(path) + + # --------- + _lib.CDocBuilder_InitializeWithDirectory(path) + builder = _lib.CDocBuilder_Create() + + sVersion = _lib.CDocBuilder_GetVersion(builder) + version = ctypes.cast(sVersion, ctypes.c_char_p).value + print(version) + _lib.DeleteCharP(ctypes.cast(sVersion, ctypes.c_char_p)) + + _lib.CDocBuilder_Dispose() + _lib.CDocBuilder_Destroy(builder) From 4c101b21d0e37afc480ed3470241da94dd2d6e03 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 17 May 2024 22:07:17 +0400 Subject: [PATCH 83/88] Changed lines ending for consistency --- .../src/docbuilder_func_lib.pro | 56 +- .../src/docbuilder_functions.cpp | 788 +++++++++--------- .../src/docbuilder_functions.h | 268 +++--- .../test/docbuilder_func_test.pro | 55 +- .../docbuilder.python/test/main.cpp | 148 ++-- 5 files changed, 657 insertions(+), 658 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro index f48067b541..03fdfc203a 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro @@ -1,28 +1,28 @@ -QT -= core -QT -= gui - -TARGET = docbuilder_functions - -TEMPLATE = lib - -CONFIG += shared -CONFIG += plugin - -CORE_ROOT_DIR = $$PWD/../../../.. -PWD_ROOT_DIR = $$PWD - -include($$CORE_ROOT_DIR/Common/base.pri) - -ADD_DEPENDENCY(doctrenderer) - -DESTDIR = $$PWD/build - -INCLUDEPATH += ../.. - -DEFINES += DOCBUILDER_FUNCTIONS_EXPORT - -SOURCES += \ - docbuilder_functions.cpp - -HEADERS += \ - docbuilder_functions.h +QT -= core +QT -= gui + +TARGET = docbuilder_functions + +TEMPLATE = lib + +CONFIG += shared +CONFIG += plugin + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +ADD_DEPENDENCY(doctrenderer) + +DESTDIR = $$PWD/build + +INCLUDEPATH += ../.. + +DEFINES += DOCBUILDER_FUNCTIONS_EXPORT + +SOURCES += \ + docbuilder_functions.cpp + +HEADERS += \ + docbuilder_functions.h diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp index 645b71811c..b9aab0f417 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -1,394 +1,394 @@ -#include "docbuilder_functions.h" - -#include - -// ===== CDocBuilderValue ===== -CDocBuilderValue* CDocBuilderValue_Create() -{ - return new CDocBuilderValue(); -} - -CDocBuilderValue* CDocBuilderValue_Copy(CDocBuilderValue* other) -{ - return new CDocBuilderValue(*other); -} - -void CDocBuilderValue_Destroy(CDocBuilderValue* self) -{ - delete self; -} - -bool CDocBuilderValue_IsEmpty(CDocBuilderValue* self) -{ - return self->IsEmpty(); -} - -void CDocBuilderValue_Clear(CDocBuilderValue* self) -{ - self->Clear(); -} - -bool CDocBuilderValue_IsNull(CDocBuilderValue* self) -{ - return self->IsNull(); -} - -bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self) -{ - return self->IsUndefined(); -} - -bool CDocBuilderValue_IsInt(CDocBuilderValue* self) -{ - return self->IsInt(); -} - -bool CDocBuilderValue_IsDouble(CDocBuilderValue* self) -{ - return self->IsDouble(); -} - -bool CDocBuilderValue_IsString(CDocBuilderValue* self) -{ - return self->IsString(); -} - -bool CDocBuilderValue_IsFunction(CDocBuilderValue* self) -{ - return self->IsFunction(); -} - -bool CDocBuilderValue_IsObject(CDocBuilderValue* self) -{ - return self->IsObject(); -} - -bool CDocBuilderValue_IsArray(CDocBuilderValue* self) -{ - return self->IsArray(); -} - -unsigned int CDocBuilderValue_GetLength(CDocBuilderValue* self) -{ - return self->GetLength(); -} - -bool CDocBuilderValue_ToBool(CDocBuilderValue* self) -{ - return self->ToBool(); -} - -int CDocBuilderValue_ToInt(CDocBuilderValue* self) -{ - return self->ToInt(); -} - -double CDocBuilderValue_ToDouble(CDocBuilderValue* self) -{ - return self->ToDouble(); -} - -const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self) -{ - // NOTE: User is responsible for calling DeleteWCharP() on returned pointer - CString strValue = self->ToString(); - size_t len = wcslen(strValue.c_str()); - wchar_t* strRes = new wchar_t[len + 1]; - memcpy(strRes, strValue.c_str(), (len + 1) + sizeof(wchar_t)); - return strRes; -} - -CDocBuilderValue* CDocBuilderValue_GetProperty(CDocBuilderValue* self, const wchar_t* name) -{ - return new CDocBuilderValue(self->GetProperty(name)); -} - -CDocBuilderValue* CDocBuilderValue_GetByIndex(CDocBuilderValue* self, int index) -{ - return new CDocBuilderValue(self->Get(index)); -} - -void CDocBuilderValue_SetProperty(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* value) -{ - self->Set(name, *value); -} - -void CDocBuilderValue_SetByIndex(CDocBuilderValue* self, int index, CDocBuilderValue* value) -{ - self->Set(index, *value); -} - -CDocBuilderValue* CDocBuilderValue_CreateWithBool(bool value) -{ - return new CDocBuilderValue(value); -} - -CDocBuilderValue* CDocBuilderValue_CreateWithInt(int value) -{ - return new CDocBuilderValue(value); -} - -CDocBuilderValue* CDocBuilderValue_CreateWithUInt(unsigned int value) -{ - return new CDocBuilderValue(value); -} - -CDocBuilderValue* CDocBuilderValue_CreateWithDouble(double value) -{ - return new CDocBuilderValue(value); -} - -CDocBuilderValue* CDocBuilderValue_CreateWithString(const wchar_t* value) -{ - return new CDocBuilderValue(value); -} - -CDocBuilderValue* CDocBuilderValue_CreateUndefined() -{ - return new CDocBuilderValue(CDocBuilderValue::CreateUndefined()); -} - -CDocBuilderValue* CDocBuilderValue_CreateNull() -{ - return new CDocBuilderValue(CDocBuilderValue::CreateNull()); -} - -CDocBuilderValue* CDocBuilderValue_CreateArray(int length) -{ - return new CDocBuilderValue(CDocBuilderValue::CreateArray(length)); -} - -CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name) -{ - return new CDocBuilderValue(self->Call(name)); -} - -CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1) -{ - return new CDocBuilderValue(self->Call(name, *p1)); -} - -CDocBuilderValue* CDocBuilderValue_Call2(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2) -{ - return new CDocBuilderValue(self->Call(name, *p1, *p2)); -} - -CDocBuilderValue* CDocBuilderValue_Call3(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3) -{ - return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3)); -} - -CDocBuilderValue* CDocBuilderValue_Call4(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4) -{ - return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4)); -} - -CDocBuilderValue* CDocBuilderValue_Call5(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5) -{ - return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4, *p5)); -} - -CDocBuilderValue* CDocBuilderValue_Call6(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5, CDocBuilderValue* p6) -{ - return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4, *p5, *p6)); -} - -// ===== CDocBuilder ===== -CDocBuilder* CDocBuilder_Create() -{ - return new CDocBuilder(); -} - -void CDocBuilder_Destroy(CDocBuilder* self) -{ - delete self; -} - -int CDocBuilder_OpenFile(CDocBuilder* self, const wchar_t* path, const wchar_t* params) -{ - return self->OpenFile(path, params); -} - -bool CDocBuilder_CreateFileByType(CDocBuilder* self, int type) -{ - return self->CreateFile(type); -} - -bool CDocBuilder_CreateFileByExtension(CDocBuilder* self, const wchar_t* extension) -{ - return self->CreateFile(extension); -} - -void CDocBuilder_SetTmpFolder(CDocBuilder* self, const wchar_t* folder) -{ - self->SetTmpFolder(folder); -} - -int CDocBuilder_SaveFileByType(CDocBuilder* self, int type, const wchar_t* path) -{ - return self->SaveFile(type, path); -} - -int CDocBuilder_SaveFileByTypeWithParams(CDocBuilder* self, int type, const wchar_t* path, const wchar_t* params) -{ - return self->SaveFile(type, path, params); -} - -int CDocBuilder_SaveFileByExtension(CDocBuilder* self, const wchar_t* extension, const wchar_t* path) -{ - return self->SaveFile(extension, path); -} - -int CDocBuilder_SaveFileByExtensionWithParams(CDocBuilder* self, const wchar_t* extension, const wchar_t* path, const wchar_t* params) -{ - return self->SaveFile(extension, path, params); -} - -void CDocBuilder_CloseFile(CDocBuilder* self) -{ - self->CloseFile(); -} - -bool CDocBuilder_ExecuteCommand(CDocBuilder* self, const wchar_t* command) -{ - return self->ExecuteCommand(command); -} - -bool CDocBuilder_ExecuteCommandWithRetValue(CDocBuilder* self, const wchar_t* command, CDocBuilderValue* retValue) -{ - return self->ExecuteCommand(command, retValue); -} - -bool CDocBuilder_Run(CDocBuilder* self, const wchar_t* path) -{ - return self->Run(path); -} - -bool CDocBuilder_RunText(CDocBuilder* self, const wchar_t* commands) -{ - return self->RunTextW(commands); -} - -void CDocBuilder_SetProperty(CDocBuilder* self, const wchar_t* param, const wchar_t* value) -{ - self->SetPropertyW(param, value); -} - -void CDocBuilder_WriteData(CDocBuilder* self, const wchar_t* path, const wchar_t* value, bool append) -{ - self->WriteData(path, value, append); -} - -bool CDocBuilder_IsSaveWithDoctrendererMode(CDocBuilder* self) -{ - return self->IsSaveWithDoctrendererMode(); -} - -char* CDocBuilder_GetVersion(CDocBuilder* self) -{ - // NOTE: User is responsible for calling DeleteCharP() on returned pointer - return self->GetVersion(); -} - -CDocBuilderContext* CDocBuilder_GetContext(CDocBuilder* self) -{ - return new CDocBuilderContext(self->GetContext()); -} - -void CDocBuilder_Initialize() -{ - CDocBuilder::Initialize(); -} - -void CDocBuilder_InitializeWithDirectory(const wchar_t* directory) -{ - CDocBuilder::Initialize(directory); -} - -void CDocBuilder_Dispose() -{ - CDocBuilder::Dispose(); -} - -// ===== CDocBuilderContextScope ===== -CDocBuilderContextScope* CDocBuilderContextScope_Create() -{ - return new CDocBuilderContextScope(); -} - -CDocBuilderContextScope* CDocBuilderContextScope_Copy(CDocBuilderContextScope* other) -{ - return new CDocBuilderContextScope(*other); -} - -void CDocBuilderContextScope_Destroy(CDocBuilderContextScope* self) -{ - delete self; -} - -void CDocBuilderContextScope_Close(CDocBuilderContextScope* self) -{ - self->Close(); -} - -// ===== CDocBuilderContext ===== -CDocBuilderContext* CDocBuilderContext_Create() -{ - return new CDocBuilderContext(); -} - -CDocBuilderContext* CDocBuilderContext_Copy(CDocBuilderContext* other) -{ - return new CDocBuilderContext(*other); -} - -void CDocBuilderContext_Destroy(CDocBuilderContext* self) -{ - delete self; -} - -CDocBuilderValue* CDocBuilderContext_CreateUndefined(CDocBuilderContext* self) -{ - return new CDocBuilderValue(self->CreateUndefined()); -} - -CDocBuilderValue* CDocBuilderContext_CreateNull(CDocBuilderContext* self) -{ - return new CDocBuilderValue(self->CreateNull()); -} - -CDocBuilderValue* CDocBuilderContext_CreateObject(CDocBuilderContext* self) -{ - return new CDocBuilderValue(self->CreateObject()); -} - -CDocBuilderValue* CDocBuilderContext_CreateArray(CDocBuilderContext* self, int length) -{ - return new CDocBuilderValue(self->CreateArray(length)); -} - -CDocBuilderValue* CDocBuilderContext_GetGlobal(CDocBuilderContext* self) -{ - return new CDocBuilderValue(self->GetGlobal()); -} - -CDocBuilderContextScope* CDocBuilderContext_CreateScope(CDocBuilderContext* self) -{ - return new CDocBuilderContextScope(self->CreateScope()); -} - -bool CDocBuilderContext_IsError(CDocBuilderContext* self) -{ - return self->IsError(); -} - -// ===== Utility ===== -void DeleteWCharP(wchar_t* str) -{ - delete[] str; -} - -void DeleteCharP(char* str) -{ - delete[] str; -} +#include "docbuilder_functions.h" + +#include + +// ===== CDocBuilderValue ===== +CDocBuilderValue* CDocBuilderValue_Create() +{ + return new CDocBuilderValue(); +} + +CDocBuilderValue* CDocBuilderValue_Copy(CDocBuilderValue* other) +{ + return new CDocBuilderValue(*other); +} + +void CDocBuilderValue_Destroy(CDocBuilderValue* self) +{ + delete self; +} + +bool CDocBuilderValue_IsEmpty(CDocBuilderValue* self) +{ + return self->IsEmpty(); +} + +void CDocBuilderValue_Clear(CDocBuilderValue* self) +{ + self->Clear(); +} + +bool CDocBuilderValue_IsNull(CDocBuilderValue* self) +{ + return self->IsNull(); +} + +bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self) +{ + return self->IsUndefined(); +} + +bool CDocBuilderValue_IsInt(CDocBuilderValue* self) +{ + return self->IsInt(); +} + +bool CDocBuilderValue_IsDouble(CDocBuilderValue* self) +{ + return self->IsDouble(); +} + +bool CDocBuilderValue_IsString(CDocBuilderValue* self) +{ + return self->IsString(); +} + +bool CDocBuilderValue_IsFunction(CDocBuilderValue* self) +{ + return self->IsFunction(); +} + +bool CDocBuilderValue_IsObject(CDocBuilderValue* self) +{ + return self->IsObject(); +} + +bool CDocBuilderValue_IsArray(CDocBuilderValue* self) +{ + return self->IsArray(); +} + +unsigned int CDocBuilderValue_GetLength(CDocBuilderValue* self) +{ + return self->GetLength(); +} + +bool CDocBuilderValue_ToBool(CDocBuilderValue* self) +{ + return self->ToBool(); +} + +int CDocBuilderValue_ToInt(CDocBuilderValue* self) +{ + return self->ToInt(); +} + +double CDocBuilderValue_ToDouble(CDocBuilderValue* self) +{ + return self->ToDouble(); +} + +const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self) +{ + // NOTE: User is responsible for calling DeleteWCharP() on returned pointer + CString strValue = self->ToString(); + size_t len = wcslen(strValue.c_str()); + wchar_t* strRes = new wchar_t[len + 1]; + memcpy(strRes, strValue.c_str(), (len + 1) + sizeof(wchar_t)); + return strRes; +} + +CDocBuilderValue* CDocBuilderValue_GetProperty(CDocBuilderValue* self, const wchar_t* name) +{ + return new CDocBuilderValue(self->GetProperty(name)); +} + +CDocBuilderValue* CDocBuilderValue_GetByIndex(CDocBuilderValue* self, int index) +{ + return new CDocBuilderValue(self->Get(index)); +} + +void CDocBuilderValue_SetProperty(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* value) +{ + self->Set(name, *value); +} + +void CDocBuilderValue_SetByIndex(CDocBuilderValue* self, int index, CDocBuilderValue* value) +{ + self->Set(index, *value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithBool(bool value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithInt(int value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithUInt(unsigned int value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithDouble(double value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateWithString(const wchar_t* value) +{ + return new CDocBuilderValue(value); +} + +CDocBuilderValue* CDocBuilderValue_CreateUndefined() +{ + return new CDocBuilderValue(CDocBuilderValue::CreateUndefined()); +} + +CDocBuilderValue* CDocBuilderValue_CreateNull() +{ + return new CDocBuilderValue(CDocBuilderValue::CreateNull()); +} + +CDocBuilderValue* CDocBuilderValue_CreateArray(int length) +{ + return new CDocBuilderValue(CDocBuilderValue::CreateArray(length)); +} + +CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name) +{ + return new CDocBuilderValue(self->Call(name)); +} + +CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1) +{ + return new CDocBuilderValue(self->Call(name, *p1)); +} + +CDocBuilderValue* CDocBuilderValue_Call2(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2)); +} + +CDocBuilderValue* CDocBuilderValue_Call3(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3)); +} + +CDocBuilderValue* CDocBuilderValue_Call4(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4)); +} + +CDocBuilderValue* CDocBuilderValue_Call5(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4, *p5)); +} + +CDocBuilderValue* CDocBuilderValue_Call6(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5, CDocBuilderValue* p6) +{ + return new CDocBuilderValue(self->Call(name, *p1, *p2, *p3, *p4, *p5, *p6)); +} + +// ===== CDocBuilder ===== +CDocBuilder* CDocBuilder_Create() +{ + return new CDocBuilder(); +} + +void CDocBuilder_Destroy(CDocBuilder* self) +{ + delete self; +} + +int CDocBuilder_OpenFile(CDocBuilder* self, const wchar_t* path, const wchar_t* params) +{ + return self->OpenFile(path, params); +} + +bool CDocBuilder_CreateFileByType(CDocBuilder* self, int type) +{ + return self->CreateFile(type); +} + +bool CDocBuilder_CreateFileByExtension(CDocBuilder* self, const wchar_t* extension) +{ + return self->CreateFile(extension); +} + +void CDocBuilder_SetTmpFolder(CDocBuilder* self, const wchar_t* folder) +{ + self->SetTmpFolder(folder); +} + +int CDocBuilder_SaveFileByType(CDocBuilder* self, int type, const wchar_t* path) +{ + return self->SaveFile(type, path); +} + +int CDocBuilder_SaveFileByTypeWithParams(CDocBuilder* self, int type, const wchar_t* path, const wchar_t* params) +{ + return self->SaveFile(type, path, params); +} + +int CDocBuilder_SaveFileByExtension(CDocBuilder* self, const wchar_t* extension, const wchar_t* path) +{ + return self->SaveFile(extension, path); +} + +int CDocBuilder_SaveFileByExtensionWithParams(CDocBuilder* self, const wchar_t* extension, const wchar_t* path, const wchar_t* params) +{ + return self->SaveFile(extension, path, params); +} + +void CDocBuilder_CloseFile(CDocBuilder* self) +{ + self->CloseFile(); +} + +bool CDocBuilder_ExecuteCommand(CDocBuilder* self, const wchar_t* command) +{ + return self->ExecuteCommand(command); +} + +bool CDocBuilder_ExecuteCommandWithRetValue(CDocBuilder* self, const wchar_t* command, CDocBuilderValue* retValue) +{ + return self->ExecuteCommand(command, retValue); +} + +bool CDocBuilder_Run(CDocBuilder* self, const wchar_t* path) +{ + return self->Run(path); +} + +bool CDocBuilder_RunText(CDocBuilder* self, const wchar_t* commands) +{ + return self->RunTextW(commands); +} + +void CDocBuilder_SetProperty(CDocBuilder* self, const wchar_t* param, const wchar_t* value) +{ + self->SetPropertyW(param, value); +} + +void CDocBuilder_WriteData(CDocBuilder* self, const wchar_t* path, const wchar_t* value, bool append) +{ + self->WriteData(path, value, append); +} + +bool CDocBuilder_IsSaveWithDoctrendererMode(CDocBuilder* self) +{ + return self->IsSaveWithDoctrendererMode(); +} + +char* CDocBuilder_GetVersion(CDocBuilder* self) +{ + // NOTE: User is responsible for calling DeleteCharP() on returned pointer + return self->GetVersion(); +} + +CDocBuilderContext* CDocBuilder_GetContext(CDocBuilder* self) +{ + return new CDocBuilderContext(self->GetContext()); +} + +void CDocBuilder_Initialize() +{ + CDocBuilder::Initialize(); +} + +void CDocBuilder_InitializeWithDirectory(const wchar_t* directory) +{ + CDocBuilder::Initialize(directory); +} + +void CDocBuilder_Dispose() +{ + CDocBuilder::Dispose(); +} + +// ===== CDocBuilderContextScope ===== +CDocBuilderContextScope* CDocBuilderContextScope_Create() +{ + return new CDocBuilderContextScope(); +} + +CDocBuilderContextScope* CDocBuilderContextScope_Copy(CDocBuilderContextScope* other) +{ + return new CDocBuilderContextScope(*other); +} + +void CDocBuilderContextScope_Destroy(CDocBuilderContextScope* self) +{ + delete self; +} + +void CDocBuilderContextScope_Close(CDocBuilderContextScope* self) +{ + self->Close(); +} + +// ===== CDocBuilderContext ===== +CDocBuilderContext* CDocBuilderContext_Create() +{ + return new CDocBuilderContext(); +} + +CDocBuilderContext* CDocBuilderContext_Copy(CDocBuilderContext* other) +{ + return new CDocBuilderContext(*other); +} + +void CDocBuilderContext_Destroy(CDocBuilderContext* self) +{ + delete self; +} + +CDocBuilderValue* CDocBuilderContext_CreateUndefined(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->CreateUndefined()); +} + +CDocBuilderValue* CDocBuilderContext_CreateNull(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->CreateNull()); +} + +CDocBuilderValue* CDocBuilderContext_CreateObject(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->CreateObject()); +} + +CDocBuilderValue* CDocBuilderContext_CreateArray(CDocBuilderContext* self, int length) +{ + return new CDocBuilderValue(self->CreateArray(length)); +} + +CDocBuilderValue* CDocBuilderContext_GetGlobal(CDocBuilderContext* self) +{ + return new CDocBuilderValue(self->GetGlobal()); +} + +CDocBuilderContextScope* CDocBuilderContext_CreateScope(CDocBuilderContext* self) +{ + return new CDocBuilderContextScope(self->CreateScope()); +} + +bool CDocBuilderContext_IsError(CDocBuilderContext* self) +{ + return self->IsError(); +} + +// ===== Utility ===== +void DeleteWCharP(wchar_t* str) +{ + delete[] str; +} + +void DeleteCharP(char* str) +{ + delete[] str; +} diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h index a3acd2e02b..64b94140b3 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h @@ -1,134 +1,134 @@ -#ifndef DOCBUILDER_FUNCTIONS_H -#define DOCBUILDER_FUNCTIONS_H - -#include "docbuilder.h" - -#include "../common/base_export.h" -#ifdef DOCBUILDER_FUNCTIONS_EXPORT -#define DOCBUILDER_FUNC_DECL Q_DECL_EXPORT -#else -#define DOCBUILDER_FUNC_DECL Q_DECL_IMPORT -#endif - -using namespace NSDoctRenderer; - -extern "C" -{ -// ===== CDocBuilderValue ===== -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Create(); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Copy(CDocBuilderValue* other); -DOCBUILDER_FUNC_DECL void CDocBuilderValue_Destroy(CDocBuilderValue* self); - -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsEmpty(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL void CDocBuilderValue_Clear(CDocBuilderValue* self); - -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsNull(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsInt(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsDouble(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsString(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsFunction(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsObject(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsArray(CDocBuilderValue* self); -// TODO: -// DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsTypedArray(CDocBuilderValue* self); - -DOCBUILDER_FUNC_DECL unsigned int CDocBuilderValue_GetLength(CDocBuilderValue* self); - -DOCBUILDER_FUNC_DECL bool CDocBuilderValue_ToBool(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL int CDocBuilderValue_ToInt(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL double CDocBuilderValue_ToDouble(CDocBuilderValue* self); -DOCBUILDER_FUNC_DECL const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self); - -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_GetProperty(CDocBuilderValue* self, const wchar_t* name); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_GetByIndex(CDocBuilderValue* self, int index); - -DOCBUILDER_FUNC_DECL void CDocBuilderValue_SetProperty(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* value); -DOCBUILDER_FUNC_DECL void CDocBuilderValue_SetByIndex(CDocBuilderValue* self, int index, CDocBuilderValue* value); - -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithBool(bool value); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithInt(int value); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithUInt(unsigned int value); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithDouble(double value); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithString(const wchar_t* value); - -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateUndefined(); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateNull(); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateArray(int length); - -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call2(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call3(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call4(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call5(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call6(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5, CDocBuilderValue* p6); - -// ===== CDocBuilder ===== -DOCBUILDER_FUNC_DECL CDocBuilder* CDocBuilder_Create(); -DOCBUILDER_FUNC_DECL void CDocBuilder_Destroy(CDocBuilder* self); - -DOCBUILDER_FUNC_DECL int CDocBuilder_OpenFile(CDocBuilder* self, const wchar_t* path, const wchar_t* params); -DOCBUILDER_FUNC_DECL bool CDocBuilder_CreateFileByType(CDocBuilder* self, int type); -DOCBUILDER_FUNC_DECL bool CDocBuilder_CreateFileByExtension(CDocBuilder* self, const wchar_t* extension); - -DOCBUILDER_FUNC_DECL void CDocBuilder_SetTmpFolder(CDocBuilder* self, const wchar_t* folder); - -DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByType(CDocBuilder* self, int type, const wchar_t* path); -DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByTypeWithParams(CDocBuilder* self, int type, const wchar_t* path, const wchar_t* params); -DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByExtension(CDocBuilder* self, const wchar_t* extension, const wchar_t* path); -DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByExtensionWithParams(CDocBuilder* self, const wchar_t* extension, const wchar_t* path, const wchar_t* params); - -DOCBUILDER_FUNC_DECL void CDocBuilder_CloseFile(CDocBuilder* self); - -DOCBUILDER_FUNC_DECL bool CDocBuilder_ExecuteCommand(CDocBuilder* self, const wchar_t* command); -DOCBUILDER_FUNC_DECL bool CDocBuilder_ExecuteCommandWithRetValue(CDocBuilder* self, const wchar_t* command, CDocBuilderValue* retValue); - -DOCBUILDER_FUNC_DECL bool CDocBuilder_Run(CDocBuilder* self, const wchar_t* path); -DOCBUILDER_FUNC_DECL bool CDocBuilder_RunText(CDocBuilder* self, const wchar_t* commands); - -DOCBUILDER_FUNC_DECL void CDocBuilder_SetProperty(CDocBuilder* self, const wchar_t* param, const wchar_t* value); - -DOCBUILDER_FUNC_DECL void CDocBuilder_WriteData(CDocBuilder* self, const wchar_t* path, const wchar_t* value, bool append); - -DOCBUILDER_FUNC_DECL bool CDocBuilder_IsSaveWithDoctrendererMode(CDocBuilder* self); - -DOCBUILDER_FUNC_DECL char* CDocBuilder_GetVersion(CDocBuilder* self); - -DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilder_GetContext(CDocBuilder* self); - -DOCBUILDER_FUNC_DECL void CDocBuilder_Initialize(); -DOCBUILDER_FUNC_DECL void CDocBuilder_InitializeWithDirectory(const wchar_t* directory); -DOCBUILDER_FUNC_DECL void CDocBuilder_Dispose(); - -// ===== CDocBuilderContextScope ===== -DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContextScope_Create(); -DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContextScope_Copy(CDocBuilderContextScope* other); -DOCBUILDER_FUNC_DECL void CDocBuilderContextScope_Destroy(CDocBuilderContextScope* self); - -DOCBUILDER_FUNC_DECL void CDocBuilderContextScope_Close(CDocBuilderContextScope* self); - -// ===== CDocBuilderContext ===== -DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilderContext_Create(); -DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilderContext_Copy(CDocBuilderContext* other); -DOCBUILDER_FUNC_DECL void CDocBuilderContext_Destroy(CDocBuilderContext* self); - -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateUndefined(CDocBuilderContext* self); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateNull(CDocBuilderContext* self); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateObject(CDocBuilderContext* self); -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateArray(CDocBuilderContext* self, int length); -// TODO: -// CDocBuilderContext_CreateTypedArray(CDocBuilderContext* self, unsigned char* buffer); - -DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_GetGlobal(CDocBuilderContext* self); - -DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContext_CreateScope(CDocBuilderContext* self); - -DOCBUILDER_FUNC_DECL bool CDocBuilderContext_IsError(CDocBuilderContext* self); - -// ===== Utility ===== -DOCBUILDER_FUNC_DECL void DeleteWCharP(wchar_t* str); -DOCBUILDER_FUNC_DECL void DeleteCharP(char* str); -} - -#endif // DOCBUILDER_FUNCTIONS_H +#ifndef DOCBUILDER_FUNCTIONS_H +#define DOCBUILDER_FUNCTIONS_H + +#include "docbuilder.h" + +#include "../common/base_export.h" +#ifdef DOCBUILDER_FUNCTIONS_EXPORT +#define DOCBUILDER_FUNC_DECL Q_DECL_EXPORT +#else +#define DOCBUILDER_FUNC_DECL Q_DECL_IMPORT +#endif + +using namespace NSDoctRenderer; + +extern "C" +{ +// ===== CDocBuilderValue ===== +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Create(); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Copy(CDocBuilderValue* other); +DOCBUILDER_FUNC_DECL void CDocBuilderValue_Destroy(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsEmpty(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL void CDocBuilderValue_Clear(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsNull(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsInt(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsDouble(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsString(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsFunction(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsObject(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsArray(CDocBuilderValue* self); +// TODO: +// DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsTypedArray(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL unsigned int CDocBuilderValue_GetLength(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_ToBool(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL int CDocBuilderValue_ToInt(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL double CDocBuilderValue_ToDouble(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_GetProperty(CDocBuilderValue* self, const wchar_t* name); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_GetByIndex(CDocBuilderValue* self, int index); + +DOCBUILDER_FUNC_DECL void CDocBuilderValue_SetProperty(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* value); +DOCBUILDER_FUNC_DECL void CDocBuilderValue_SetByIndex(CDocBuilderValue* self, int index, CDocBuilderValue* value); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithBool(bool value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithInt(int value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithUInt(unsigned int value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithDouble(double value); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithString(const wchar_t* value); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateUndefined(); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateNull(); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateArray(int length); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call2(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call3(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call4(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call5(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call6(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1, CDocBuilderValue* p2, CDocBuilderValue* p3, CDocBuilderValue* p4, CDocBuilderValue* p5, CDocBuilderValue* p6); + +// ===== CDocBuilder ===== +DOCBUILDER_FUNC_DECL CDocBuilder* CDocBuilder_Create(); +DOCBUILDER_FUNC_DECL void CDocBuilder_Destroy(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL int CDocBuilder_OpenFile(CDocBuilder* self, const wchar_t* path, const wchar_t* params); +DOCBUILDER_FUNC_DECL bool CDocBuilder_CreateFileByType(CDocBuilder* self, int type); +DOCBUILDER_FUNC_DECL bool CDocBuilder_CreateFileByExtension(CDocBuilder* self, const wchar_t* extension); + +DOCBUILDER_FUNC_DECL void CDocBuilder_SetTmpFolder(CDocBuilder* self, const wchar_t* folder); + +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByType(CDocBuilder* self, int type, const wchar_t* path); +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByTypeWithParams(CDocBuilder* self, int type, const wchar_t* path, const wchar_t* params); +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByExtension(CDocBuilder* self, const wchar_t* extension, const wchar_t* path); +DOCBUILDER_FUNC_DECL int CDocBuilder_SaveFileByExtensionWithParams(CDocBuilder* self, const wchar_t* extension, const wchar_t* path, const wchar_t* params); + +DOCBUILDER_FUNC_DECL void CDocBuilder_CloseFile(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilder_ExecuteCommand(CDocBuilder* self, const wchar_t* command); +DOCBUILDER_FUNC_DECL bool CDocBuilder_ExecuteCommandWithRetValue(CDocBuilder* self, const wchar_t* command, CDocBuilderValue* retValue); + +DOCBUILDER_FUNC_DECL bool CDocBuilder_Run(CDocBuilder* self, const wchar_t* path); +DOCBUILDER_FUNC_DECL bool CDocBuilder_RunText(CDocBuilder* self, const wchar_t* commands); + +DOCBUILDER_FUNC_DECL void CDocBuilder_SetProperty(CDocBuilder* self, const wchar_t* param, const wchar_t* value); + +DOCBUILDER_FUNC_DECL void CDocBuilder_WriteData(CDocBuilder* self, const wchar_t* path, const wchar_t* value, bool append); + +DOCBUILDER_FUNC_DECL bool CDocBuilder_IsSaveWithDoctrendererMode(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL char* CDocBuilder_GetVersion(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilder_GetContext(CDocBuilder* self); + +DOCBUILDER_FUNC_DECL void CDocBuilder_Initialize(); +DOCBUILDER_FUNC_DECL void CDocBuilder_InitializeWithDirectory(const wchar_t* directory); +DOCBUILDER_FUNC_DECL void CDocBuilder_Dispose(); + +// ===== CDocBuilderContextScope ===== +DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContextScope_Create(); +DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContextScope_Copy(CDocBuilderContextScope* other); +DOCBUILDER_FUNC_DECL void CDocBuilderContextScope_Destroy(CDocBuilderContextScope* self); + +DOCBUILDER_FUNC_DECL void CDocBuilderContextScope_Close(CDocBuilderContextScope* self); + +// ===== CDocBuilderContext ===== +DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilderContext_Create(); +DOCBUILDER_FUNC_DECL CDocBuilderContext* CDocBuilderContext_Copy(CDocBuilderContext* other); +DOCBUILDER_FUNC_DECL void CDocBuilderContext_Destroy(CDocBuilderContext* self); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateUndefined(CDocBuilderContext* self); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateNull(CDocBuilderContext* self); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateObject(CDocBuilderContext* self); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_CreateArray(CDocBuilderContext* self, int length); +// TODO: +// CDocBuilderContext_CreateTypedArray(CDocBuilderContext* self, unsigned char* buffer); + +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderContext_GetGlobal(CDocBuilderContext* self); + +DOCBUILDER_FUNC_DECL CDocBuilderContextScope* CDocBuilderContext_CreateScope(CDocBuilderContext* self); + +DOCBUILDER_FUNC_DECL bool CDocBuilderContext_IsError(CDocBuilderContext* self); + +// ===== Utility ===== +DOCBUILDER_FUNC_DECL void DeleteWCharP(wchar_t* str); +DOCBUILDER_FUNC_DECL void DeleteCharP(char* str); +} + +#endif // DOCBUILDER_FUNCTIONS_H diff --git a/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro b/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro index 19cef476ae..0af73a0782 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro +++ b/DesktopEditor/doctrenderer/docbuilder.python/test/docbuilder_func_test.pro @@ -1,28 +1,27 @@ -QT -= core -QT -= gui - -TARGET = test - -TEMPLATE = app - -CONFIG -= app_bundle -CONFIG += console - -CORE_ROOT_DIR = $$PWD/../../../.. -PWD_ROOT_DIR = $$PWD - -include($$CORE_ROOT_DIR/Common/base.pri) - -# !!! Set docbuilder path here !!! -DOCUMENT_BUILDER_INSTALL_PATH="C:/Program Files/ONLYOFFICE/DocumentBuilder" - -DEFINES += "DOCUMENT_BUILDER_INSTALL_PATH=\"$$DOCUMENT_BUILDER_INSTALL_PATH\"" -LIBS += -L'$$DOCUMENT_BUILDER_INSTALL_PATH' -ldocbuilder_functions - -DESTDIR = $$PWD/build - -INCLUDEPATH += ../.. - -SOURCES += \ - main.cpp - +QT -= core +QT -= gui + +TARGET = test + +TEMPLATE = app + +CONFIG -= app_bundle +CONFIG += console + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +# !!! Set docbuilder path here !!! +DOCUMENT_BUILDER_INSTALL_PATH="C:/Program Files/ONLYOFFICE/DocumentBuilder" + +DEFINES += "DOCUMENT_BUILDER_INSTALL_PATH=\"$$DOCUMENT_BUILDER_INSTALL_PATH\"" +LIBS += -L'$$DOCUMENT_BUILDER_INSTALL_PATH' -ldocbuilder_functions + +DESTDIR = $$PWD/build + +INCLUDEPATH += ../.. + +SOURCES += \ + main.cpp diff --git a/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp b/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp index 71f06ba9a8..9dc6874ea4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/test/main.cpp @@ -1,74 +1,74 @@ -#include "../src/docbuilder_functions.h" - -#include -#include - -#include "app_builder_lib/utils.cpp" - -#define DECLARE_RAII_DOCBUILDER_FUNC_CLASS( CLASS_NAME ) \ -class CLASS_NAME ## F \ -{ \ -public: \ - CLASS_NAME ## F(CLASS_NAME* internal) { m_internal = internal; } \ - ~CLASS_NAME ## F() { CLASS_NAME ## _Destroy(m_internal); } \ - \ - CLASS_NAME* get() { return m_internal; } \ - \ -private: \ - CLASS_NAME* m_internal; \ -}; - -DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilder) -DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderValue) -DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContext) -DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContextScope) - -int main() -{ - std::wstring sWorkDirectory = NSUtils::GetBuilderDirectory(); - -#if 1 - // Simple test that shows builder version if everything is correct - CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); - CDocBuilder* pBuilder = CDocBuilder_Create(); - - char* sVersion = CDocBuilder_GetVersion(pBuilder); - std::cout << sVersion << std::endl; - DeleteCharP(sVersion); - - CDocBuilder_Dispose(); - CDocBuilder_Destroy(pBuilder); -#else - // Test is identical to app_builder_lib.pro - // The test uses RAII wrappers - classes with 'F' postfix, which are destroyed automatically - CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); - - CDocBuilderF oBuilder = CDocBuilder_Create(); - CDocBuilder_SetProperty(oBuilder.get(), L"--work-directory", sWorkDirectory.c_str()); - - CDocBuilder_CreateFileByExtension(oBuilder.get(), L"docx"); - - CDocBuilderContextF oContext = CDocBuilder_GetContext(oBuilder.get()); - CDocBuilderContextScopeF oScope = CDocBuilderContext_CreateScope(oContext.get()); - - CDocBuilderValueF oGlobal = CDocBuilderContext_GetGlobal(oContext.get()); - - CDocBuilderValueF oApi = CDocBuilderValue_GetProperty(oGlobal.get(), L"Api"); - CDocBuilderValueF oDocument = CDocBuilderValue_Call0(oApi.get(), L"GetDocument"); - CDocBuilderValueF oParagraph = CDocBuilderValue_Call0(oApi.get(), L"CreateParagraph"); - CDocBuilderValue_Call2(oParagraph.get(), L"SetSpacingAfter", CDocBuilderValueF(CDocBuilderValue_CreateWithInt(1000)).get(), CDocBuilderValueF(CDocBuilderValue_CreateWithBool(false)).get()); - CDocBuilderValue_Call1(oParagraph.get(), L"AddText", CDocBuilderValueF(CDocBuilderValue_CreateWithString(L"Hello, world!")).get()); - CDocBuilderValueF oContent = CDocBuilderContext_CreateArray(oContext.get(), 1); - CDocBuilderValue_SetByIndex(oContent.get(), 0, oParagraph.get()); - CDocBuilderValue_Call1(oDocument.get(), L"InsertContent", oContent.get()); - - std::wstring sProcessDirectory = NSUtils::GetProcessDirectory(); - std::wstring sDstPath = sProcessDirectory + L"/result.docx"; - CDocBuilder_SaveFileByExtension(oBuilder.get(), L"docx", sDstPath.c_str()); - CDocBuilder_CloseFile(oBuilder.get()); - - CDocBuilder_Dispose(); -#endif - - return 0; -} +#include "../src/docbuilder_functions.h" + +#include +#include + +#include "app_builder_lib/utils.cpp" + +#define DECLARE_RAII_DOCBUILDER_FUNC_CLASS( CLASS_NAME ) \ +class CLASS_NAME ## F \ +{ \ +public: \ + CLASS_NAME ## F(CLASS_NAME* internal) { m_internal = internal; } \ + ~CLASS_NAME ## F() { CLASS_NAME ## _Destroy(m_internal); } \ + \ + CLASS_NAME* get() { return m_internal; } \ + \ +private: \ + CLASS_NAME* m_internal; \ +}; + +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilder) +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderValue) +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContext) +DECLARE_RAII_DOCBUILDER_FUNC_CLASS(CDocBuilderContextScope) + +int main() +{ + std::wstring sWorkDirectory = NSUtils::GetBuilderDirectory(); + +#if 1 + // Simple test that shows builder version if everything is correct + CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); + CDocBuilder* pBuilder = CDocBuilder_Create(); + + char* sVersion = CDocBuilder_GetVersion(pBuilder); + std::cout << sVersion << std::endl; + DeleteCharP(sVersion); + + CDocBuilder_Dispose(); + CDocBuilder_Destroy(pBuilder); +#else + // Test is identical to app_builder_lib.pro + // The test uses RAII wrappers - classes with 'F' postfix, which are destroyed automatically + CDocBuilder_InitializeWithDirectory(sWorkDirectory.c_str()); + + CDocBuilderF oBuilder = CDocBuilder_Create(); + CDocBuilder_SetProperty(oBuilder.get(), L"--work-directory", sWorkDirectory.c_str()); + + CDocBuilder_CreateFileByExtension(oBuilder.get(), L"docx"); + + CDocBuilderContextF oContext = CDocBuilder_GetContext(oBuilder.get()); + CDocBuilderContextScopeF oScope = CDocBuilderContext_CreateScope(oContext.get()); + + CDocBuilderValueF oGlobal = CDocBuilderContext_GetGlobal(oContext.get()); + + CDocBuilderValueF oApi = CDocBuilderValue_GetProperty(oGlobal.get(), L"Api"); + CDocBuilderValueF oDocument = CDocBuilderValue_Call0(oApi.get(), L"GetDocument"); + CDocBuilderValueF oParagraph = CDocBuilderValue_Call0(oApi.get(), L"CreateParagraph"); + CDocBuilderValue_Call2(oParagraph.get(), L"SetSpacingAfter", CDocBuilderValueF(CDocBuilderValue_CreateWithInt(1000)).get(), CDocBuilderValueF(CDocBuilderValue_CreateWithBool(false)).get()); + CDocBuilderValue_Call1(oParagraph.get(), L"AddText", CDocBuilderValueF(CDocBuilderValue_CreateWithString(L"Hello, world!")).get()); + CDocBuilderValueF oContent = CDocBuilderContext_CreateArray(oContext.get(), 1); + CDocBuilderValue_SetByIndex(oContent.get(), 0, oParagraph.get()); + CDocBuilderValue_Call1(oDocument.get(), L"InsertContent", oContent.get()); + + std::wstring sProcessDirectory = NSUtils::GetProcessDirectory(); + std::wstring sDstPath = sProcessDirectory + L"/result.docx"; + CDocBuilder_SaveFileByExtension(oBuilder.get(), L"docx", sDstPath.c_str()); + CDocBuilder_CloseFile(oBuilder.get()); + + CDocBuilder_Dispose(); +#endif + + return 0; +} From 93d77ee945a447377e5eb02756380045e87a8df4 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 17 May 2024 22:09:38 +0400 Subject: [PATCH 84/88] Added all classes to `docbuilder.py` --- .../docbuilder.python/src/docbuilder.py | 517 +++++++++++++++++- 1 file changed, 507 insertions(+), 10 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index 959d1b82ee..3f6c89f9a4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -3,7 +3,7 @@ import os import platform import sys -DOCBUILDER_HANDLE = ctypes.c_void_p +OBJECT_HANDLE = ctypes.c_void_p STRING_HANDLE = ctypes.c_void_p _lib = None @@ -15,27 +15,514 @@ def loadLibrary(path): os.environ['PATH'] += ':' + path global _lib - _lib = ctypes.CDLL('docbuilder_functions.dll') + _lib = ctypes.CDLL(path + '/docbuilder_functions.dll') # init all function signatures + # ===== CDocBuilderValue ===== + _lib.CDocBuilderValue_Create.argtypes = [] + _lib.CDocBuilderValue_Create.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Copy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_Copy.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Destroy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_Destroy.restype = None + + _lib.CDocBuilderValue_IsEmpty.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsEmpty.restype = ctypes.c_bool + + _lib.CDocBuilderValue_Clear.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_Clear.restype = None + + _lib.CDocBuilderValue_IsNull.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsNull.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsUndefined.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsUndefined.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsInt.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsInt.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsDouble.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsDouble.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsString.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsString.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsFunction.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsFunction.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsObject.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsObject.restype = ctypes.c_bool + + _lib.CDocBuilderValue_IsArray.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsArray.restype = ctypes.c_bool + + _lib.CDocBuilderValue_GetLength.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_GetLength.restype = ctypes.c_uint + + _lib.CDocBuilderValue_ToBool.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_ToBool.restype = ctypes.c_bool + + _lib.CDocBuilderValue_ToInt.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_ToInt.restype = ctypes.c_int + + _lib.CDocBuilderValue_ToDouble.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_ToDouble.restype = ctypes.c_double + + _lib.CDocBuilderValue_ToString.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_ToString.restype = STRING_HANDLE + + _lib.CDocBuilderValue_GetProperty.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilderValue_GetProperty.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_GetByIndex.argtypes = [OBJECT_HANDLE, ctypes.c_int] + _lib.CDocBuilderValue_GetByIndex.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_SetProperty.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE] + _lib.CDocBuilderValue_SetProperty.restype = None + + _lib.CDocBuilderValue_SetByIndex.argtypes = [OBJECT_HANDLE, ctypes.c_int, OBJECT_HANDLE] + _lib.CDocBuilderValue_SetByIndex.restype = None + + _lib.CDocBuilderValue_CreateWithBool.argtypes = [ctypes.c_bool] + _lib.CDocBuilderValue_CreateWithBool.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateWithInt.argtypes = [ctypes.c_int] + _lib.CDocBuilderValue_CreateWithInt.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateWithUInt.argtypes = [ctypes.c_uint] + _lib.CDocBuilderValue_CreateWithUInt.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateWithDouble.argtypes = [ctypes.c_double] + _lib.CDocBuilderValue_CreateWithDouble.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateWithString.argtypes = [ctypes.c_wchar_p] + _lib.CDocBuilderValue_CreateWithString.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateUndefined.argtypes = [] + _lib.CDocBuilderValue_CreateUndefined.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateNull.argtypes = [] + _lib.CDocBuilderValue_CreateNull.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_CreateArray.argtypes = [ctypes.c_int] + _lib.CDocBuilderValue_CreateArray.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call0.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilderValue_Call0.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call1.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE] + _lib.CDocBuilderValue_Call1.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call2.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE, OBJECT_HANDLE] + _lib.CDocBuilderValue_Call2.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call3.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE] + _lib.CDocBuilderValue_Call3.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call4.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE] + _lib.CDocBuilderValue_Call4.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call5.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE] + _lib.CDocBuilderValue_Call5.restype = OBJECT_HANDLE + + _lib.CDocBuilderValue_Call6.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE, OBJECT_HANDLE] + _lib.CDocBuilderValue_Call6.restype = OBJECT_HANDLE + + # ===== CDocBuilder ===== + _lib.CDocBuilder_Create.argtypes = [] + _lib.CDocBuilder_Create.restype = OBJECT_HANDLE + + _lib.CDocBuilder_Destroy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilder_Destroy.restype = None + + _lib.CDocBuilder_OpenFile.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, ctypes.c_wchar_p] + _lib.CDocBuilder_OpenFile.restype = ctypes.c_int + + _lib.CDocBuilder_CreateFileByType.argtypes = [OBJECT_HANDLE, ctypes.c_int] + _lib.CDocBuilder_CreateFileByType.restype = ctypes.c_bool + + _lib.CDocBuilder_CreateFileByExtension.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilder_CreateFileByExtension.restype = ctypes.c_bool + + _lib.CDocBuilder_SetTmpFolder.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilder_SetTmpFolder.restype = None + + _lib.CDocBuilder_SaveFileByType.argtypes = [OBJECT_HANDLE, ctypes.c_int, ctypes.c_wchar_p] + _lib.CDocBuilder_SaveFileByType.restype = ctypes.c_int + + _lib.CDocBuilder_SaveFileByTypeWithParams.argtypes = [OBJECT_HANDLE, ctypes.c_int, ctypes.c_wchar_p, ctypes.c_wchar_p] + _lib.CDocBuilder_SaveFileByTypeWithParams.restype = ctypes.c_int + + _lib.CDocBuilder_SaveFileByExtension.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, ctypes.c_wchar_p] + _lib.CDocBuilder_SaveFileByExtension.restype = ctypes.c_int + + _lib.CDocBuilder_SaveFileByExtensionWithParams.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_wchar_p] + _lib.CDocBuilder_SaveFileByExtensionWithParams.restype = ctypes.c_int + + _lib.CDocBuilder_CloseFile.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilder_CloseFile.restype = None + + _lib.CDocBuilder_ExecuteCommand.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilder_ExecuteCommand.restype = ctypes.c_bool + + _lib.CDocBuilder_ExecuteCommandWithRetValue.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, OBJECT_HANDLE] + _lib.CDocBuilder_ExecuteCommandWithRetValue.restype = ctypes.c_bool + + _lib.CDocBuilder_Run.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilder_Run.restype = ctypes.c_bool + + _lib.CDocBuilder_RunText.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] + _lib.CDocBuilder_RunText.restype = ctypes.c_bool + + _lib.CDocBuilder_SetProperty.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, ctypes.c_wchar_p] + _lib.CDocBuilder_SetProperty.restype = None + + _lib.CDocBuilder_WriteData.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_bool] + _lib.CDocBuilder_WriteData.restype = None + + _lib.CDocBuilder_IsSaveWithDoctrendererMode.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilder_IsSaveWithDoctrendererMode.restype = ctypes.c_bool + + _lib.CDocBuilder_GetVersion.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilder_GetVersion.restype = STRING_HANDLE + + _lib.CDocBuilder_GetContext.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilder_GetContext.restype = OBJECT_HANDLE + + _lib.CDocBuilder_Initialize.argtypes = [] + _lib.CDocBuilder_Initialize.restype = None + _lib.CDocBuilder_InitializeWithDirectory.argtypes = [ctypes.c_wchar_p] _lib.CDocBuilder_InitializeWithDirectory.restype = None - _lib.CDocBuilder_Create.argtypes = [] - _lib.CDocBuilder_Create.restype = DOCBUILDER_HANDLE - - _lib.CDocBuilder_GetVersion.argtypes = [DOCBUILDER_HANDLE] - _lib.CDocBuilder_GetVersion.restype = STRING_HANDLE - _lib.CDocBuilder_Dispose.argtypes = [] _lib.CDocBuilder_Dispose.restype = None - _lib.CDocBuilder_Destroy.argtypes = [DOCBUILDER_HANDLE] - _lib.CDocBuilder_Destroy.restype = None + # ===== CDocBuilderContextScope ===== + _lib.CDocBuilderContextScope_Create.argtypes = [] + _lib.CDocBuilderContextScope_Create.restype = OBJECT_HANDLE + + _lib.CDocBuilderContextScope_Copy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContextScope_Copy.restype = OBJECT_HANDLE + + _lib.CDocBuilderContextScope_Destroy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContextScope_Destroy.restype = None + + _lib.CDocBuilderContextScope_Close.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContextScope_Close.restype = None + + # ===== CDocBuilderContext ===== + _lib.CDocBuilderContext_Create.argtypes = [] + _lib.CDocBuilderContext_Create.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_Copy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_Copy.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_Destroy.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_Destroy.restype = None + + _lib.CDocBuilderContext_CreateUndefined.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_CreateUndefined.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_CreateNull.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_CreateNull.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_CreateObject.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_CreateObject.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_CreateArray.argtypes = [OBJECT_HANDLE, ctypes.c_int] + _lib.CDocBuilderContext_CreateArray.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_GetGlobal.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_GetGlobal.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_CreateScope.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_CreateScope.restype = OBJECT_HANDLE + + _lib.CDocBuilderContext_IsError.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderContext_IsError.restype = ctypes.c_bool + + # ===== Utility ===== + _lib.DeleteWCharP.argtypes = [ctypes.c_wchar_p] + _lib.DeleteWCharP.restype = None _lib.DeleteCharP.argtypes = [ctypes.c_char_p] _lib.DeleteCharP.restype = None +class CDocBuilderValue: + def __init__(self, value=None): + if value is None: + self._internal = _lib.CDocBuilderValue_Create() + elif isinstance(value, bool): + self._internal = _lib.CDocBuilderValue_CreateWithBool(ctypes.c_bool(value)) + elif isinstance(value, int): + self._internal = _lib.CDocBuilderValue_CreateWithInt(ctypes.c_int(value)) + elif isinstance(value, float): + self._internal = _lib.CDocBuilderValue_CreateWithDouble(ctypes.c_double(value)) + elif isinstance(value, str): + self._internal = _lib.CDocBuilderValue_CreateWithString(ctypes.c_wchar_p(value)) + elif isinstance(value, CDocBuilderValue): + self._internal = _lib.CDocBuilderValue_Copy(value._internal) + elif isinstance(value, OBJECT_HANDLE): + self._internal = value + else: + raise TypeError("Unsupported type for CDocBuilderValue constructor") + self._lib = _lib + + def __del__(self): + # using self._lib instead of global _lib because it might be already garbage collected during this function call + self._lib.CDocBuilderValue_Destroy(self._internal) + + def IsEmpty(self): + return _lib.CDocBuilderValue_IsEmpty(self._internal).value + + def Clear(self): + _lib.CDocBuilderValue_Clear(self._internal) + + def IsNull(self): + return _lib.CDocBuilderValue_IsNull(self._internal).value + + def IsUndefined(self): + return _lib.CDocBuilderValue_IsUndefined(self._internal).value + + def IsInt(self): + return _lib.CDocBuilderValue_IsInt(self._internal).value + + def IsDouble(self): + return _lib.CDocBuilderValue_IsDouble(self._internal).value + + def IsString(self): + return _lib.CDocBuilderValue_IsString(self._internal).value + + def IsFunction(self): + return _lib.CDocBuilderValue_IsFunction(self._internal).value + + def IsObject(self): + return _lib.CDocBuilderValue_IsObject(self._internal).value + + def IsArray(self): + return _lib.CDocBuilderValue_IsArray(self._internal).value + + def GetLength(self): + return _lib.CDocBuilderValue_GetLength(self._internal).value + + def ToBool(self): + return _lib.CDocBuilderValue_ToBool(self._internal).value + + def ToInt(self): + return _lib.CDocBuilderValue_ToInt(self._internal).value + + def ToDouble(self): + return _lib.CDocBuilderValue_ToDouble(self._internal).value + + def ToString(self): + strRes = _lib.CDocBuilderValue_ToString(self._internal) + res = ctypes.cast(strRes, ctypes.c_wchar_p).value + _lib.DeleteWCharP(ctypes.cast(strRes, ctypes.c_wchar_p)) + return res + + def GetProperty(self, name): + return CDocBuilderValue(_lib.CDocBuilderValue_GetProperty(self._internal, ctypes.c_wchar_p(name))) + + def Get(self, key): + if isinstance(key, int): + return CDocBuilderValue(_lib.CDocBuilderValue_GetByIndex(self._internal, ctypes.c_int(key))) + elif isinstance(key, str): + return CDocBuilderValue(_lib.CDocBuilderValue_GetProperty(self._internal, ctypes.c_wchar_p(key))) + else: + return None + + def SetProperty(self, name, value): + _lib.CDocBuilderValue_SetProperty(self._internal, ctypes.c_wchar_p(name), value._internal) + + def Set(self, key, value): + if isinstance(key, int): + _lib.CDocBuilderValue_SetByIndex(self._internal, ctypes.c_int(key), value._internal) + elif isinstance(key, str): + _lib.CDocBuilderValue_SetProperty(self._internal, ctypes.c_wchar_p(key), value._internal) + + def __getitem__(self, key): + return self.Get(key) + + def __setitem__(self, key): + self.Set(key) + + @staticmethod + def CreateUndefined(): + return CDocBuilderValue(_lib.CDocBuilderValue_CreateUndefined()) + + @staticmethod + def CreateNull(): + return CDocBuilderValue(_lib.CDocBuilderValue_CreateNull()) + + @staticmethod + def CreateArray(length): + return CDocBuilderValue(_lib.CDocBuilderValue_CreateArray(length)) + + def Call(self, name, *args): + if len(args) == 0: + return CDocBuilderValue(_lib.CDocBuilderValue_Call0(self._internal, ctypes.c_wchar_p(name))) + elif len(args) < 7: + values = [] + for i in range(len(args)): + p = args[i] + if not isinstance(p, CDocBuilderValue): + p = CDocBuilderValue(p) + values.append(p) + if len(args) == 1: + return CDocBuilderValue(_lib.CDocBuilderValue_Call1(self._internal, ctypes.c_wchar_p(name), values[0]._internal)) + elif len(args) == 2: + return CDocBuilderValue(_lib.CDocBuilderValue_Call2(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal)) + elif len(args) == 3: + return CDocBuilderValue(_lib.CDocBuilderValue_Call3(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal)) + elif len(args) == 4: + return CDocBuilderValue(_lib.CDocBuilderValue_Call4(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal)) + elif len(args) == 5: + return CDocBuilderValue(_lib.CDocBuilderValue_Call5(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal, values[4]._internal)) + elif len(args) == 6: + return CDocBuilderValue(_lib.CDocBuilderValue_Call6(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal, values[4]._internal, values[5]._internal)) + else: + raise TypeError("Call() expects at most 6 arguments") + +class CDocBuilder: + def __init__(self): + self._internal = _lib.CDocBuilder_Create() + self._lib = _lib + + def __del__(self): + # using self._lib instead of global _lib because it might be already garbage collected during this function call + self._lib.CDocBuilder_Destroy(self._internal) + + def OpenFile(self, path, params): + return _lib.CDocBuilder_OpenFile(self._internal, ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)).value + + def CreateFile(self, type): + if isinstance(type, int): + return _lib.CDocBuilder_CreateFileByType(self._internal, ctypes.c_int(type)).value + elif isinstance(type, str): + return _lib.CDocBuilder_CreateFileByExtension(self._internal, ctypes.c_wchar_p(type)).value + else: + return False + + def SetTmpFolder(self, folder): + _lib.CDocBuilder_SetTmpFolder(self._internal, ctypes.c_wchar_p(folder)) + + def SaveFile(self, type, path, params=None): + if isinstance(type, int): + if params is None: + return _lib.CDocBuilder_SaveFileByType(self._internal, ctypes.c_int(type), ctypes.c_wchar_p(path)).value + else: + return _lib.CDocBuilder_SaveFileByTypeWithParams(self._internal, ctypes.c_int(type), ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)).value + elif isinstance(type, str): + if params is None: + return _lib.CDocBuilder_SaveFileByExtension(self._internal, ctypes.c_wchar_p(type), ctypes.c_wchar_p(path)).value + else: + return _lib.CDocBuilder_SaveFileByExtensionWithParams(self._internal, ctypes.c_wchar_p(type), ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)).value + else: + return -1 + + def CloseFile(self): + _lib.CDocBuilder_CloseFile(self._internal) + + def ExecuteCommand(self, command, retValue=None): + if retValue is None: + return _lib.CDocBuilder_ExecuteCommand(self._internal, ctypes.c_wchar_p(command)).value + else: + return _lib.CDocBuilder_ExecuteCommandWithRetValue(self._internal, ctypes.c_wchar_p(command), retValue._internal).value + + def Run(self, path): + return _lib.CDocBuilder_Run(self._internal, ctypes.c_wchar_p(path)).value + + def RunText(self, commands): + return _lib.CDocBuilder_RunText(self._internal, ctypes.c_wchar_p(commands)).value + + def SetProperty(self, param, value): + _lib.CDocBuilder_SetProperty(self._internal, ctypes.c_wchar_p(param), ctypes.c_wchar_p(value)) + + def WriteData(self, path, value, append): + _lib.CDocBuilder_WriteData(self._internal, ctypes.c_wchar_p(path), ctypes.c_wchar_p(value), ctypes.c_bool(append)) + + def IsSaveWithDoctrendererMode(self): + return _lib.CDocBuilder_IsSaveWithDoctrendererMode(self._internal).value + + def GetVersion(self): + strVersion = _lib.CDocBuilder_GetVersion(self._internal) + version = ctypes.cast(strVersion, ctypes.c_char_p).value + _lib.DeleteCharP(ctypes.cast(strVersion, ctypes.c_char_p)) + return version + + def GetContext(self): + return CDocBuilderContext(_lib.CDocBuilder_GetContext(self._internal)) + + @staticmethod + def Initialize(directory=None): + if directory is None: + _lib.CDocBuilder_Initialize() + else: + _lib.CDocBuilder_InitializeWithDirectory(ctypes.c_wchar_p(directory)) + + @staticmethod + def Dispose(): + _lib.CDocBuilder_Dispose() + +class CDocBuilderContextScope: + def __init__(self, value=None): + self._lib = _lib + if value is None: + self._internal = _lib.CDocBuilderContextScope_Create() + elif isinstance(value, CDocBuilderContextScope): + self._internal = _lib.CDocBuilderContextScope_Copy(value._internal) + elif isinstance(value, OBJECT_HANDLE): + self._internal = value + else: + TypeError("Unsupported type for CDocBuilderContextScope constructor") + self._lib = _lib + + def __del__(self): + # using self._lib instead of global _lib because it might be already garbage collected during this function call + self._lib.CDocBuilderContextScope_Destroy(self._internal) + + def Close(self): + _lib.CDocBuilderContextScope_Close(self._internal) + +class CDocBuilderContext: + def __init__(self, value=None): + if value is None: + self._internal = _lib.CDocBuilderContext_Create() + elif isinstance(value, CDocBuilderContext): + self._internal = _lib.CDocBuilderContext_Copy(value._internal) + elif isinstance(value, OBJECT_HANDLE): + self._internal = value + else: + TypeError("Unsupported type for CDocBuilderContext constructor") + self._lib = _lib + + def __del__(self): + # using self._lib instead of global _lib because it might be already garbage collected during this function call + self._lib.CDocBuilderContext_Destroy(self._internal) + + def CreateUndefined(self): + return CDocBuilderValue(_lib.CDocBuilderContext_CreateUndefined(self._internal)) + + def CreateNull(self): + return CDocBuilderValue(_lib.CDocBuilderContext_CreateNull(self._internal)) + + def CreateObject(self): + return CDocBuilderValue(_lib.CDocBuilderContext_CreateObject(self._internal)) + + def CreateArray(self, length): + return CDocBuilderValue(_lib.CDocBuilderContext_CreateArray(self._internal, ctypes.c_int(length))) + + def GetGlobal(self): + return CDocBuilderValue(_lib.CDocBuilderContext_GetGlobal(self._internal)) + + def CreateScope(self): + return CDocBuilderContextScope(_lib.CDocBuilderContext_CreateScope(self._internal)) + + def IsError(self): + return _lib.CDocBuilderContext_IsError(self._internal).value if __name__ == '__main__': if len(sys.argv) < 2: @@ -47,6 +534,7 @@ if __name__ == '__main__': loadLibrary(path) # --------- + ''' _lib.CDocBuilder_InitializeWithDirectory(path) builder = _lib.CDocBuilder_Create() @@ -57,3 +545,12 @@ if __name__ == '__main__': _lib.CDocBuilder_Dispose() _lib.CDocBuilder_Destroy(builder) + ''' + # --------- + CDocBuilder.Initialize(path) + builder = CDocBuilder() + + version = builder.GetVersion() + print(version) + + CDocBuilder.Dispose() From c802944d3b619d43ef392464f789de796637a727 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 17 May 2024 23:16:02 +0400 Subject: [PATCH 85/88] Fixes in `docbuilder.py` + Add more complex example + Add .gitignore --- .../doctrenderer/docbuilder.python/.gitignore | 2 + .../docbuilder.python/src/docbuilder.py | 127 +++++++++++------- 2 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/.gitignore diff --git a/DesktopEditor/doctrenderer/docbuilder.python/.gitignore b/DesktopEditor/doctrenderer/docbuilder.python/.gitignore new file mode 100644 index 0000000000..71ac840d03 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/.gitignore @@ -0,0 +1,2 @@ +result.docx +*.pyc diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index 3f6c89f9a4..0a8f9b7cce 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -276,46 +276,46 @@ class CDocBuilderValue: self._lib.CDocBuilderValue_Destroy(self._internal) def IsEmpty(self): - return _lib.CDocBuilderValue_IsEmpty(self._internal).value + return _lib.CDocBuilderValue_IsEmpty(self._internal) def Clear(self): _lib.CDocBuilderValue_Clear(self._internal) def IsNull(self): - return _lib.CDocBuilderValue_IsNull(self._internal).value + return _lib.CDocBuilderValue_IsNull(self._internal) def IsUndefined(self): - return _lib.CDocBuilderValue_IsUndefined(self._internal).value + return _lib.CDocBuilderValue_IsUndefined(self._internal) def IsInt(self): - return _lib.CDocBuilderValue_IsInt(self._internal).value + return _lib.CDocBuilderValue_IsInt(self._internal) def IsDouble(self): - return _lib.CDocBuilderValue_IsDouble(self._internal).value + return _lib.CDocBuilderValue_IsDouble(self._internal) def IsString(self): - return _lib.CDocBuilderValue_IsString(self._internal).value + return _lib.CDocBuilderValue_IsString(self._internal) def IsFunction(self): - return _lib.CDocBuilderValue_IsFunction(self._internal).value + return _lib.CDocBuilderValue_IsFunction(self._internal) def IsObject(self): - return _lib.CDocBuilderValue_IsObject(self._internal).value + return _lib.CDocBuilderValue_IsObject(self._internal) def IsArray(self): - return _lib.CDocBuilderValue_IsArray(self._internal).value + return _lib.CDocBuilderValue_IsArray(self._internal) def GetLength(self): - return _lib.CDocBuilderValue_GetLength(self._internal).value + return _lib.CDocBuilderValue_GetLength(self._internal) def ToBool(self): - return _lib.CDocBuilderValue_ToBool(self._internal).value + return _lib.CDocBuilderValue_ToBool(self._internal) def ToInt(self): - return _lib.CDocBuilderValue_ToInt(self._internal).value + return _lib.CDocBuilderValue_ToInt(self._internal) def ToDouble(self): - return _lib.CDocBuilderValue_ToDouble(self._internal).value + return _lib.CDocBuilderValue_ToDouble(self._internal) def ToString(self): strRes = _lib.CDocBuilderValue_ToString(self._internal) @@ -324,13 +324,13 @@ class CDocBuilderValue: return res def GetProperty(self, name): - return CDocBuilderValue(_lib.CDocBuilderValue_GetProperty(self._internal, ctypes.c_wchar_p(name))) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_GetProperty(self._internal, ctypes.c_wchar_p(name)))) def Get(self, key): if isinstance(key, int): - return CDocBuilderValue(_lib.CDocBuilderValue_GetByIndex(self._internal, ctypes.c_int(key))) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_GetByIndex(self._internal, ctypes.c_int(key)))) elif isinstance(key, str): - return CDocBuilderValue(_lib.CDocBuilderValue_GetProperty(self._internal, ctypes.c_wchar_p(key))) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_GetProperty(self._internal, ctypes.c_wchar_p(key)))) else: return None @@ -346,24 +346,24 @@ class CDocBuilderValue: def __getitem__(self, key): return self.Get(key) - def __setitem__(self, key): - self.Set(key) + def __setitem__(self, key, value): + self.Set(key, value) @staticmethod def CreateUndefined(): - return CDocBuilderValue(_lib.CDocBuilderValue_CreateUndefined()) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_CreateUndefined())) @staticmethod def CreateNull(): - return CDocBuilderValue(_lib.CDocBuilderValue_CreateNull()) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_CreateNull())) @staticmethod def CreateArray(length): - return CDocBuilderValue(_lib.CDocBuilderValue_CreateArray(length)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_CreateArray(length))) def Call(self, name, *args): if len(args) == 0: - return CDocBuilderValue(_lib.CDocBuilderValue_Call0(self._internal, ctypes.c_wchar_p(name))) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call0(self._internal, ctypes.c_wchar_p(name)))) elif len(args) < 7: values = [] for i in range(len(args)): @@ -372,17 +372,17 @@ class CDocBuilderValue: p = CDocBuilderValue(p) values.append(p) if len(args) == 1: - return CDocBuilderValue(_lib.CDocBuilderValue_Call1(self._internal, ctypes.c_wchar_p(name), values[0]._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call1(self._internal, ctypes.c_wchar_p(name), values[0]._internal))) elif len(args) == 2: - return CDocBuilderValue(_lib.CDocBuilderValue_Call2(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call2(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal))) elif len(args) == 3: - return CDocBuilderValue(_lib.CDocBuilderValue_Call3(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call3(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal))) elif len(args) == 4: - return CDocBuilderValue(_lib.CDocBuilderValue_Call4(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call4(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal))) elif len(args) == 5: - return CDocBuilderValue(_lib.CDocBuilderValue_Call5(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal, values[4]._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call5(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal, values[4]._internal))) elif len(args) == 6: - return CDocBuilderValue(_lib.CDocBuilderValue_Call6(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal, values[4]._internal, values[5]._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call6(self._internal, ctypes.c_wchar_p(name), values[0]._internal, values[1]._internal, values[2]._internal, values[3]._internal, values[4]._internal, values[5]._internal))) else: raise TypeError("Call() expects at most 6 arguments") @@ -396,13 +396,13 @@ class CDocBuilder: self._lib.CDocBuilder_Destroy(self._internal) def OpenFile(self, path, params): - return _lib.CDocBuilder_OpenFile(self._internal, ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)).value + return _lib.CDocBuilder_OpenFile(self._internal, ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)) def CreateFile(self, type): if isinstance(type, int): - return _lib.CDocBuilder_CreateFileByType(self._internal, ctypes.c_int(type)).value + return _lib.CDocBuilder_CreateFileByType(self._internal, ctypes.c_int(type)) elif isinstance(type, str): - return _lib.CDocBuilder_CreateFileByExtension(self._internal, ctypes.c_wchar_p(type)).value + return _lib.CDocBuilder_CreateFileByExtension(self._internal, ctypes.c_wchar_p(type)) else: return False @@ -412,14 +412,14 @@ class CDocBuilder: def SaveFile(self, type, path, params=None): if isinstance(type, int): if params is None: - return _lib.CDocBuilder_SaveFileByType(self._internal, ctypes.c_int(type), ctypes.c_wchar_p(path)).value + return _lib.CDocBuilder_SaveFileByType(self._internal, ctypes.c_int(type), ctypes.c_wchar_p(path)) else: - return _lib.CDocBuilder_SaveFileByTypeWithParams(self._internal, ctypes.c_int(type), ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)).value + return _lib.CDocBuilder_SaveFileByTypeWithParams(self._internal, ctypes.c_int(type), ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)) elif isinstance(type, str): if params is None: - return _lib.CDocBuilder_SaveFileByExtension(self._internal, ctypes.c_wchar_p(type), ctypes.c_wchar_p(path)).value + return _lib.CDocBuilder_SaveFileByExtension(self._internal, ctypes.c_wchar_p(type), ctypes.c_wchar_p(path)) else: - return _lib.CDocBuilder_SaveFileByExtensionWithParams(self._internal, ctypes.c_wchar_p(type), ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)).value + return _lib.CDocBuilder_SaveFileByExtensionWithParams(self._internal, ctypes.c_wchar_p(type), ctypes.c_wchar_p(path), ctypes.c_wchar_p(params)) else: return -1 @@ -428,15 +428,15 @@ class CDocBuilder: def ExecuteCommand(self, command, retValue=None): if retValue is None: - return _lib.CDocBuilder_ExecuteCommand(self._internal, ctypes.c_wchar_p(command)).value + return _lib.CDocBuilder_ExecuteCommand(self._internal, ctypes.c_wchar_p(command)) else: - return _lib.CDocBuilder_ExecuteCommandWithRetValue(self._internal, ctypes.c_wchar_p(command), retValue._internal).value + return _lib.CDocBuilder_ExecuteCommandWithRetValue(self._internal, ctypes.c_wchar_p(command), retValue._internal) def Run(self, path): - return _lib.CDocBuilder_Run(self._internal, ctypes.c_wchar_p(path)).value + return _lib.CDocBuilder_Run(self._internal, ctypes.c_wchar_p(path)) def RunText(self, commands): - return _lib.CDocBuilder_RunText(self._internal, ctypes.c_wchar_p(commands)).value + return _lib.CDocBuilder_RunText(self._internal, ctypes.c_wchar_p(commands)) def SetProperty(self, param, value): _lib.CDocBuilder_SetProperty(self._internal, ctypes.c_wchar_p(param), ctypes.c_wchar_p(value)) @@ -445,7 +445,7 @@ class CDocBuilder: _lib.CDocBuilder_WriteData(self._internal, ctypes.c_wchar_p(path), ctypes.c_wchar_p(value), ctypes.c_bool(append)) def IsSaveWithDoctrendererMode(self): - return _lib.CDocBuilder_IsSaveWithDoctrendererMode(self._internal).value + return _lib.CDocBuilder_IsSaveWithDoctrendererMode(self._internal) def GetVersion(self): strVersion = _lib.CDocBuilder_GetVersion(self._internal) @@ -454,7 +454,7 @@ class CDocBuilder: return version def GetContext(self): - return CDocBuilderContext(_lib.CDocBuilder_GetContext(self._internal)) + return CDocBuilderContext(OBJECT_HANDLE(_lib.CDocBuilder_GetContext(self._internal))) @staticmethod def Initialize(directory=None): @@ -477,7 +477,7 @@ class CDocBuilderContextScope: elif isinstance(value, OBJECT_HANDLE): self._internal = value else: - TypeError("Unsupported type for CDocBuilderContextScope constructor") + raise TypeError("Unsupported type for CDocBuilderContextScope constructor") self._lib = _lib def __del__(self): @@ -496,7 +496,7 @@ class CDocBuilderContext: elif isinstance(value, OBJECT_HANDLE): self._internal = value else: - TypeError("Unsupported type for CDocBuilderContext constructor") + raise TypeError("Unsupported type for CDocBuilderContext constructor") self._lib = _lib def __del__(self): @@ -504,25 +504,25 @@ class CDocBuilderContext: self._lib.CDocBuilderContext_Destroy(self._internal) def CreateUndefined(self): - return CDocBuilderValue(_lib.CDocBuilderContext_CreateUndefined(self._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderContext_CreateUndefined(self._internal))) def CreateNull(self): - return CDocBuilderValue(_lib.CDocBuilderContext_CreateNull(self._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderContext_CreateNull(self._internal))) def CreateObject(self): - return CDocBuilderValue(_lib.CDocBuilderContext_CreateObject(self._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderContext_CreateObject(self._internal))) def CreateArray(self, length): - return CDocBuilderValue(_lib.CDocBuilderContext_CreateArray(self._internal, ctypes.c_int(length))) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderContext_CreateArray(self._internal, ctypes.c_int(length)))) def GetGlobal(self): - return CDocBuilderValue(_lib.CDocBuilderContext_GetGlobal(self._internal)) + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderContext_GetGlobal(self._internal))) def CreateScope(self): - return CDocBuilderContextScope(_lib.CDocBuilderContext_CreateScope(self._internal)) + return CDocBuilderContextScope(OBJECT_HANDLE(_lib.CDocBuilderContext_CreateScope(self._internal))) def IsError(self): - return _lib.CDocBuilderContext_IsError(self._internal).value + return _lib.CDocBuilderContext_IsError(self._internal) if __name__ == '__main__': if len(sys.argv) < 2: @@ -547,6 +547,7 @@ if __name__ == '__main__': _lib.CDocBuilder_Destroy(builder) ''' # --------- + ''' CDocBuilder.Initialize(path) builder = CDocBuilder() @@ -554,3 +555,29 @@ if __name__ == '__main__': print(version) CDocBuilder.Dispose() + ''' + # --------- + CDocBuilder.Initialize(path) + builder = CDocBuilder() + + builder.CreateFile('docx') + + context = builder.GetContext() + scope = context.CreateScope() + + globalObj = context.GetGlobal() + + api = globalObj['Api'] + document = api.Call('GetDocument') + paragraph = api.Call('CreateParagraph') + paragraph.Call('SetSpacingAfter', 1000, False) + paragraph.Call('AddText', 'Hello, World!') + content = context.CreateArray(1) + content[0] = paragraph + document.Call('InsertContent', content) + + dstPath = os.getcwd() + '/result.docx' + builder.SaveFile('docx', dstPath) + builder.CloseFile() + + CDocBuilder.Dispose() From 7a73d3288cf114770ad001e0bd4877510343bed3 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Sun, 19 May 2024 11:21:18 +0300 Subject: [PATCH 86/88] Refactoring --- .../docbuilder.python/src/docbuilder.py | 76 ++++--------------- .../src/docbuilder_func_lib.pro | 7 +- .../docbuilder.python/src/docbuilder_test.py | 28 +++++++ 3 files changed, 44 insertions(+), 67 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index 0a8f9b7cce..cff5b44a93 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -9,13 +9,17 @@ STRING_HANDLE = ctypes.c_void_p _lib = None def loadLibrary(path): - if any(platform.win32_ver()): - os.environ['PATH'] += ';' + path - else: - os.environ['PATH'] += ':' + path - + os.environ['PATH'] = path + os.pathsep + os.environ['PATH'] + + os_name = platform.system().lower() + library_ext = "dll" + if ("linux" == os_name): + library_ext = "so" + elif ("darwin" == os_name): + library_ext = "dylib" + global _lib - _lib = ctypes.CDLL(path + '/docbuilder_functions.dll') + _lib = ctypes.CDLL(path + '/docbuilder_functions.' + library_ext) # init all function signatures # ===== CDocBuilderValue ===== @@ -524,60 +528,6 @@ class CDocBuilderContext: def IsError(self): return _lib.CDocBuilderContext_IsError(self._internal) -if __name__ == '__main__': - if len(sys.argv) < 2: - print('Specify the folder with document builder and all dll-s') - exit(0) - - path = sys.argv[1] - - loadLibrary(path) - - # --------- - ''' - _lib.CDocBuilder_InitializeWithDirectory(path) - builder = _lib.CDocBuilder_Create() - - sVersion = _lib.CDocBuilder_GetVersion(builder) - version = ctypes.cast(sVersion, ctypes.c_char_p).value - print(version) - _lib.DeleteCharP(ctypes.cast(sVersion, ctypes.c_char_p)) - - _lib.CDocBuilder_Dispose() - _lib.CDocBuilder_Destroy(builder) - ''' - # --------- - ''' - CDocBuilder.Initialize(path) - builder = CDocBuilder() - - version = builder.GetVersion() - print(version) - - CDocBuilder.Dispose() - ''' - # --------- - CDocBuilder.Initialize(path) - builder = CDocBuilder() - - builder.CreateFile('docx') - - context = builder.GetContext() - scope = context.CreateScope() - - globalObj = context.GetGlobal() - - api = globalObj['Api'] - document = api.Call('GetDocument') - paragraph = api.Call('CreateParagraph') - paragraph.Call('SetSpacingAfter', 1000, False) - paragraph.Call('AddText', 'Hello, World!') - content = context.CreateArray(1) - content[0] = paragraph - document.Call('InsertContent', content) - - dstPath = os.getcwd() + '/result.docx' - builder.SaveFile('docx', dstPath) - builder.CloseFile() - - CDocBuilder.Dispose() +builder_path = os.path.dirname(os.path.realpath(__file__)) +loadLibrary(builder_path) +CDocBuilder.Initialize(builder_path) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro index 03fdfc203a..9bfc8f1648 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_func_lib.pro @@ -1,7 +1,7 @@ QT -= core QT -= gui -TARGET = docbuilder_functions +TARGET = docbuilder.c TEMPLATE = lib @@ -12,10 +12,9 @@ CORE_ROOT_DIR = $$PWD/../../../.. PWD_ROOT_DIR = $$PWD include($$CORE_ROOT_DIR/Common/base.pri) +include($$CORE_ROOT_DIR/Common/3dParty/icu/icu.pri) -ADD_DEPENDENCY(doctrenderer) - -DESTDIR = $$PWD/build +ADD_DEPENDENCY(graphics, kernel, kernel_network, UnicodeConverter, doctrenderer) INCLUDEPATH += ../.. diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py new file mode 100644 index 0000000000..265c5f9ee4 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py @@ -0,0 +1,28 @@ +import os +import sys +sys.path.append('directory_installed_docbuilder/docbuilder.py') +import docbuilder + +builder = docbuilder.CDocBuilder() + +builder.CreateFile('docx') + +context = builder.GetContext() +scope = context.CreateScope() + +globalObj = context.GetGlobal() + +api = globalObj['Api'] +document = api.Call('GetDocument') +paragraph = api.Call('CreateParagraph') +paragraph.Call('SetSpacingAfter', 1000, False) +paragraph.Call('AddText', 'Hello, World!') +content = context.CreateArray(1) +content[0] = paragraph +document.Call('InsertContent', content) + +dstPath = os.getcwd() + '/result.docx' +builder.SaveFile('docx', dstPath) +builder.CloseFile() + +docbuilder.CDocBuilder.Dispose() From 5a04f9033b0f4f74ffa670b956b434ea03190003 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Sun, 19 May 2024 11:33:45 +0300 Subject: [PATCH 87/88] Fix build --- .../doctrenderer/docbuilder.python/src/docbuilder_functions.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp index b9aab0f417..24bb38523f 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -1,6 +1,7 @@ #include "docbuilder_functions.h" #include +#include // ===== CDocBuilderValue ===== CDocBuilderValue* CDocBuilderValue_Create() From 58980e61b7defd1ecc30542a81189aa02ad6e93e Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Sun, 19 May 2024 12:02:37 +0300 Subject: [PATCH 88/88] Fix typo and create folder for tests --- DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py | 2 +- .../docbuilder.python/src/{ => test}/docbuilder_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename DesktopEditor/doctrenderer/docbuilder.python/src/{ => test}/docbuilder_test.py (90%) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index cff5b44a93..4ef45854ac 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -19,7 +19,7 @@ def loadLibrary(path): library_ext = "dylib" global _lib - _lib = ctypes.CDLL(path + '/docbuilder_functions.' + library_ext) + _lib = ctypes.CDLL(path + '/docbuilder.c.' + library_ext) # init all function signatures # ===== CDocBuilderValue ===== diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py b/DesktopEditor/doctrenderer/docbuilder.python/src/test/docbuilder_test.py similarity index 90% rename from DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py rename to DesktopEditor/doctrenderer/docbuilder.python/src/test/docbuilder_test.py index 265c5f9ee4..d1d7aec51a 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_test.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/test/docbuilder_test.py @@ -1,6 +1,6 @@ import os import sys -sys.path.append('directory_installed_docbuilder/docbuilder.py') +sys.path.append('path_to_docbuilder') import docbuilder builder = docbuilder.CDocBuilder()