Compare commits

...

2 Commits

Author SHA1 Message Date
c9100737e0 fix prev 2025-12-17 14:38:52 +03:00
bcdcfa8bf7 fix bug #74265 2025-12-08 16:36:25 +03:00
4 changed files with 105 additions and 3 deletions

View File

@ -785,7 +785,44 @@ void odf_document::Impl::parse_styles(office_element *element)
_CP_LOG << L"[warning] empty styles\n";
break;
}
if(document)
{
office_master_styles * master_style = dynamic_cast<office_master_styles *>( document->office_master_styles_.get() );
if (!master_style)
break;
unsigned int elements_master_page = master_style->style_master_page_.size();
if(master_style->style_master_page_.size() > 1)
{
for (size_t i = 1; i < master_style->style_master_page_.size(); i++)
{
office_element_ptr & elm = master_style->style_master_page_[i];
style_master_page * master_page = dynamic_cast<style_master_page *>(elm.get());
if (!master_page)
continue;
std::wstring ws_style_name = master_page->attlist_.style_name_.get_value_or(L"");
for(unsigned int t = 0; t < i;t++)
{
office_element_ptr& elm_prev = master_style->style_master_page_[t];
style_master_page* master_page_prev = dynamic_cast<style_master_page*>(elm_prev.get());
if(!master_page_prev)
continue;
if(ws_style_name == master_page_prev->attlist_.style_name_.get_value_or(L""))
{
master_page->attlist_.style_name_ = ws_style_name + L"_" + std::to_wstring(elements_master_page++);
context_->styleContainer().set_new_name_master_page(L"",master_page->attlist_.style_name_.get_value_or(L""));
break;
}
}
}
}
}
// parse automatic styles - эти стили используют объекты которые в оазис находятся в этом же документе
//переопределяем имя - иначе при поиске может возникнуть коллизия.
do
@ -876,7 +913,6 @@ void odf_document::Impl::parse_styles(office_element *element)
_CP_LOG << L"[warning] error reading master page\n";
continue;
}
const std::wstring styleName = masterPage->attlist_.style_name_.get_value_or(L"");
const std::wstring pageLayoutName = masterPage->attlist_.style_page_layout_name_.get_value_or(L"");

View File

@ -350,6 +350,16 @@ namespace cpdoccore {
master_page = res->second;
return master_page;
}
void styles_container::set_new_name_master_page(std::wstring ws_name_layout, std::wstring ws_new_name)
{
vec_new_name_master_page.push_back({ws_name_layout,ws_new_name});
}
std::vector<std::pair<std::wstring, std::wstring> >& styles_container::get_vec_new_name()
{
return vec_new_name_master_page;
}
style_instance* styles_container::style_default_by_type(style_family::type Type) const
{

View File

@ -190,6 +190,9 @@ public:
presentation_layouts_instance & presentation_layouts() { return presentation_layouts_; }
presentation_masters_instance & presentation_masters() { return presentation_masters_; }
void set_new_name_master_page(std::wstring ws_name_layout, std::wstring ws_new_name);
std::vector<std::pair<std::wstring,std::wstring>>& get_vec_new_name();
private:
presentation_layouts_instance presentation_layouts_;
@ -209,6 +212,8 @@ private:
map_style_family_int default_map_;
int hyperlink_style_pos_;
std::vector<std::pair<std::wstring,std::wstring>> vec_new_name_master_page;
};
class page_layout_instance;

View File

@ -128,6 +128,22 @@ void office_presentation::xlsx_convert(oox::xlsx_conversion_context & Context)
Context.end_office_spreadsheet();
}
bool CheckPageLayout(std::vector<std::pair<std::wstring,std::wstring>>* vec_name_layout, draw_page* page, bool new_name)
{
if(vec_name_layout->empty() || !page)
return true;
for(size_t i = 0; i < vec_name_layout->size();i++)
{
if((*vec_name_layout)[i].first == page->attlist_.page_layout_name_.get_value_or(L""))
{
if(new_name)
page->attlist_.master_page_name_ = (*vec_name_layout)[i].second;
return true;
}
}
return false;
}
void office_presentation::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.start_office_presentation();
@ -165,8 +181,43 @@ void office_presentation::pptx_convert(oox::pptx_conversion_context & Context)
collect_page_names(Context);
std::vector<std::pair<std::wstring,std::wstring>>* vec_name_master_page = &(Context.root()->odf_context().styleContainer().get_vec_new_name());
unsigned int pos_in_vec = 0;
if(!vec_name_master_page->empty())
{
for (size_t i = 0; i < pages_.size(); i++)
{
if(i >= 1)
{
office_element_ptr & elm = pages_[i];
draw_page* page = dynamic_cast<draw_page*>(elm.get());
if(CheckPageLayout(vec_name_master_page,page,true))
continue;
for(size_t t = 0 ; t < i ; t++)
{
office_element_ptr & elm_prev_page = pages_[t];
draw_page* prev_page = dynamic_cast<draw_page*>(elm_prev_page.get());
if(!prev_page)
break;
if(page->attlist_.master_page_name_.get_value_or(L"") == prev_page->attlist_.master_page_name_.get_value_or(L"") && page->attlist_.page_layout_name_.get_value_or(L"") != prev_page->attlist_.page_layout_name_.get_value_or(L""))
{
page->attlist_.master_page_name_ = (*vec_name_master_page)[pos_in_vec].second;
(*vec_name_master_page)[pos_in_vec].first = page->attlist_.page_layout_name_.get_value_or(L"");
pos_in_vec++;
break;
}
}
}
if(pos_in_vec == vec_name_master_page->size())
break;
}
}
for (size_t i = 0; i < pages_.size(); i++)
{
{
office_element_ptr & elm = pages_[i];
draw_page* page = dynamic_cast<draw_page*>(elm.get());
CheckPageLayout(vec_name_master_page,page,true);
pages_[i]->pptx_convert(Context);
}
Context.end_office_presentation();