/* * (c) Copyright Ascensio System SIA 2010-2023 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ #include "pptx_conversion_context.h" #include "pptx_text_context.h" #include #include #include #include #include "../Format/odf_document.h" #include "../Format/odfcontext.h" #include "../Format/calcs_styles.h" #include "../Format/style_text_properties.h" namespace cpdoccore { namespace oox { class pptx_text_context::Impl: boost::noncopyable { public: Impl(odf_reader::odf_read_context & odf_context_, pptx_conversion_context & pptx_context_); public: styles_context & get_styles_context() { return styles_context_; } void add_text(const std::wstring & text); void add_paragraph(const std::wstring & para); void start_paragraph(const std::wstring & styleName); void end_paragraph (); void start_span (const std::wstring & styleName); void end_span (); std::wstring end_span2 (); void start_object(); std::wstring end_object (); void start_base_style(const std::wstring baseStyleName, const odf_types::style_family::type baseStyleType); void end_base_style(); void ApplyTextProperties (std::wstring style, std::wstring para_style, odf_reader::text_format_properties & propertiesOut, bool inStyle = false); void ApplyParagraphProperties (std::wstring para_style, odf_reader::paragraph_format_properties & propertiesOut, bool inStyle = false); void ApplyListProperties (odf_reader::paragraph_format_properties & propertiesOut, int Level); odf_reader::style_list_level_properties* ApplyListProperties (odf_reader::paragraph_format_properties & propertiesOut, odf_reader::text_list_style* text_list_style, int Level); void set_local_styles_container(odf_reader::styles_container* local_styles_);//это если стили объектов содержатся в другом документе hyperlink_data get_hyperlink(); void start_hyperlink(); void set_rel_id(const std::wstring& rId); void set_action(const std::wstring& action); void end_hyperlink (); void start_list (const std::wstring & StyleName, bool Continue = false); void end_list (); void start_list_item(bool restart = false); void end_list_item (); void start_field (field_type type, const std::wstring & styleName); void end_field (); void start_comment (); std::wstring end_comment(); std::wstring get_last_paragraph_style_name(); bool in_list_; bool process_layouts_; private: styles_context styles_context_; odf_reader::odf_read_context & odf_context_ ; std::wstring hyperlink_hId; hyperlink_data hyperlink_; bool in_span; bool in_paragraph; bool in_comment; bool is_predump; odf_reader::styles_container * local_styles_ptr_; void write_rPr (std::wostream & strm); void write_pPr (std::wostream & strm); void write_t (std::wostream & strm); std::wstring dump_paragraph(); void dump_run(); void dump_field(); size_t paragraphs_cout_; //???? тока из за начала отсчета? std::wstringstream text_; //приходящий текст std::wstringstream paragraph_; //перманенто скидываемые параграфы std::wstringstream run_; //перманенто скидываемые куски с быть может разными свойствами std::wstring last_paragraph_style_name_; std::wstring paragraph_style_name_; std::wstring span_style_name_; std::wstring base_style_name_; odf_types::style_family::type base_style_family_;//Presentation Or SpreadSheet //------------------------------------------------------------------------------- std::vector list_style_stack_; bool first_element_list_item_; _CP_OPT(odf_types::length) last_run_font_size_; int new_list_style_number_; // счетчик для нумерации имен созданных в процессе конвертации стилей boost::unordered_map list_style_renames_; // цепочки переименований нумераций void write_list_styles(std::wostream & strm); //void write_list_properties(std::wostream & strm); std::wstring find_list_rename(const std::wstring & ListStyleName); std::wstring current_list_style(); /////////////////////////// field_type field_type_; std::wstringstream field_value_; pptx_conversion_context & pptx_context_; }; pptx_text_context::Impl::Impl(odf_reader::odf_read_context & odf_contxt_, pptx_conversion_context & pptx_contxt_): odf_context_(odf_contxt_), pptx_context_(pptx_contxt_), paragraphs_cout_(0), in_paragraph(false),in_span(false), in_comment(false), field_type_(none) { new_list_style_number_=0; local_styles_ptr_ = NULL; process_layouts_ = false; } void pptx_text_context::Impl::add_text(const std::wstring & text) { if (field_type_) field_value_ << text; else text_ << text; } void pptx_text_context::Impl::add_paragraph(const std::wstring & para) { paragraph_ << para; } void pptx_text_context::Impl::set_local_styles_container(odf_reader::styles_container * local_styles_) { local_styles_ptr_= local_styles_; } void pptx_text_context::Impl::start_paragraph(const std::wstring & styleName) { if (paragraphs_cout_++ > 0) { //if (in_list_ == false || in_comment == true) //{ //// конец предыдущего абзаца и начало следующего ////text_ << L" "; // text_ << L"\n"; //} //else/* (paragraph_style_name_ != styleName)*/ { is_predump = true; dump_paragraph(); } }else { text_.str(std::wstring()); field_value_.str(std::wstring()); } last_paragraph_style_name_ = paragraph_style_name_; paragraph_style_name_ = styleName; in_paragraph = true; is_predump = false; } void pptx_text_context::Impl::end_paragraph() { in_paragraph = false; } void pptx_text_context::Impl::start_span(const std::wstring & styleName)//кусок текста в абзаце(параграфе) со своими свойствами - этто может быть и 1 буква { int text_size = text_.str().length(); if ((span_style_name_ != styleName && text_size > 0) || in_span) { dump_run(); } span_style_name_ = styleName; in_span = true; } void pptx_text_context::Impl::end_span() { dump_run(); span_style_name_ = L""; in_span = false; } std::wstring pptx_text_context::Impl::end_span2() { dump_run(); span_style_name_ = L""; in_span = false; return run_.str(); } void pptx_text_context::Impl::start_hyperlink() { dump_run();//проверить } void pptx_text_context::Impl::end_hyperlink() { dump_run(); hyperlink_ = { L"", L"" }; } void pptx_text_context::Impl::ApplyTextProperties(std::wstring style_name, std::wstring para_style_name, odf_reader::text_format_properties & propertiesOut, bool inStyle) { std::vector instances; odf_reader::style_instance* defaultStyle = NULL; odf_reader::style_instance* para_style = NULL; odf_reader::style_instance* text_style = NULL; odf_reader::style_instance* baseStyle = NULL; if (local_styles_ptr_) { para_style = local_styles_ptr_->style_by_name (para_style_name, odf_types::style_family::Paragraph, inStyle); text_style = local_styles_ptr_->style_by_name (style_name, odf_types::style_family::Text, inStyle); defaultStyle = local_styles_ptr_->style_default_by_type (odf_types::style_family::Text); baseStyle = local_styles_ptr_->style_by_name (base_style_name_, base_style_family_, inStyle); } else { para_style = odf_context_.styleContainer().style_by_name (para_style_name, odf_types::style_family::Paragraph, inStyle); text_style = odf_context_.styleContainer().style_by_name (style_name, odf_types::style_family::Text, inStyle); defaultStyle = odf_context_.styleContainer().style_default_by_type (odf_types::style_family::Text); baseStyle = odf_context_.styleContainer().style_by_name (base_style_name_, base_style_family_, inStyle); } if (defaultStyle) instances.push_back(defaultStyle); if (baseStyle) instances.push_back(baseStyle); if (para_style) instances.push_back(para_style); if (text_style) instances.push_back(text_style); if (text_style) get_styles_context().start_process_style(text_style); else if (para_style) get_styles_context().start_process_style(para_style); else get_styles_context().start_process_style(baseStyle); odf_reader::text_format_properties_ptr text_props = calc_text_properties_content(instances); if (text_props) { propertiesOut.apply_from(*text_props.get()); } } odf_reader::style_list_level_properties* pptx_text_context::Impl::ApplyListProperties(odf_reader::paragraph_format_properties & propertiesOut, odf_reader::text_list_style* text_list_style, int Level) { if (!text_list_style) return NULL; if (Level >= (int)text_list_style->content_.size()) return NULL; odf_reader::office_element_ptr elm = text_list_style->content_[Level]; odf_reader::office_element_ptr elm_list; if (elm->get_type() == typeTextListLevelStyleBullet) { odf_reader::text_list_level_style_bullet* list_bullet = dynamic_cast(elm.get()); if (list_bullet)elm_list = list_bullet->list_level_properties_; } if (elm->get_type() == typeTextListLevelStyleNumber) { odf_reader::text_list_level_style_number* list_number = dynamic_cast(elm.get()); if (list_number)elm_list = list_number->list_level_properties_; } if (elm->get_type() == typeTextListLevelStyleImage) { odf_reader::text_list_level_style_image* list_image = dynamic_cast(elm.get()); if (list_image)elm_list = list_image->list_level_properties_; } //////////////////// odf_reader::style_list_level_properties* list_properties = NULL; if (elm_list) { list_properties = dynamic_cast(elm_list.get()); } elm->pptx_convert(pptx_context_); return list_properties; } void pptx_text_context::Impl::ApplyListProperties(odf_reader::paragraph_format_properties & propertiesOut, int Level) { if (Level < 0) return; if (list_style_stack_.empty()) return; odf_reader::text_list_style* text_list_style = odf_context_.listStyleContainer().list_style_by_name(list_style_stack_.back()); odf_reader::style_list_level_properties* list_properties = ApplyListProperties(propertiesOut, text_list_style, Level); if (list_properties) { propertiesOut.fo_text_indent_ = list_properties->text_min_label_width_; if (list_properties->text_space_before_) { double spaceBeforeTwip = list_properties->text_space_before_->get_value_unit(odf_types::length::pt); if (list_properties->text_min_label_width_) { spaceBeforeTwip += list_properties->text_min_label_width_->get_value_unit(odf_types::length::pt); } if (spaceBeforeTwip>0) propertiesOut.fo_margin_left_ = odf_types::length(spaceBeforeTwip,odf_types::length::pt); } } } void pptx_text_context::Impl::ApplyParagraphProperties(std::wstring style_name, odf_reader::paragraph_format_properties & propertiesOut, bool inStyle) { std::vector instances; odf_reader::style_instance* style = NULL; odf_reader::style_instance* defaultStyle = NULL; odf_reader::style_instance* baseStyle = NULL; if (local_styles_ptr_) { style = local_styles_ptr_->style_by_name (style_name, odf_types::style_family::Paragraph, inStyle); defaultStyle = local_styles_ptr_->style_default_by_type (odf_types::style_family::Paragraph); baseStyle = local_styles_ptr_->style_by_name (base_style_name_, base_style_family_, inStyle); } else { style = odf_context_.styleContainer().style_by_name (style_name, odf_types::style_family::Paragraph, inStyle); defaultStyle = odf_context_.styleContainer().style_default_by_type (odf_types::style_family::Paragraph); baseStyle = odf_context_.styleContainer().style_by_name (base_style_name_, base_style_family_, inStyle); } if (defaultStyle) instances.push_back(defaultStyle); if (baseStyle) instances.push_back(baseStyle); if (style) instances.push_back(style); if (style) get_styles_context().start_process_style(style); else get_styles_context().start_process_style(baseStyle); propertiesOut.apply_from(calc_paragraph_properties_content(instances)); } void pptx_text_context::Impl::write_pPr(std::wostream & strm) { get_styles_context().start(); int level = list_style_stack_.size() - 1; if (is_predump) level--; odf_reader::paragraph_format_properties paragraph_properties_; ApplyParagraphProperties (paragraph_style_name_, paragraph_properties_, process_layouts_); ApplyListProperties (paragraph_properties_, level);//выравнивания листа накатим на свойства параграфа paragraph_properties_.pptx_convert(pptx_context_); const std::wstring& paragraphAttr = get_styles_context().paragraph_attr().str(); const std::wstring & paragraphNodes = get_styles_context().paragraph_nodes().str(); if (level < 0 && paragraphAttr.length() < 1 && paragraphNodes.empty()) return; strm << L"= 0) { if (level > 8) level = 0; strm << L"lvl=\"" << level << L"\" "; } strm << paragraphAttr; strm << ">"; strm << paragraphNodes; if (process_layouts_) { odf_reader::text_format_properties text_properties_; ApplyTextProperties(L"", paragraph_style_name_, text_properties_, process_layouts_); text_properties_.oox_serialize(strm, true, odf_context_.fontContainer(), true); } if (level >= 0 ) { strm << get_styles_context().list_style().str(); } strm << L""; } void pptx_text_context::Impl::write_t(std::wostream & strm) { } void pptx_text_context::Impl::write_rPr(std::wostream & strm) { if (paragraph_style_name_.empty() && span_style_name_.empty() && !(!hyperlink_hId.empty()) && base_style_name_.empty()) return; odf_reader::text_format_properties text_properties_; ApplyTextProperties(span_style_name_, paragraph_style_name_, text_properties_, true); get_styles_context().start(); get_styles_context().hlinkClick() = hyperlink_hId; text_properties_.pptx_convert(pptx_context_); if (text_properties_.fo_font_size_ && text_properties_.fo_font_size_->get_type() == odf_types::font_size::Length) last_run_font_size_ = text_properties_.fo_font_size_->get_length(); strm << get_styles_context().text_style().str(); } std::wstring pptx_text_context::Impl::dump_paragraph(/*bool last*/) { if (in_comment) return L""; end_span(); std::wstring str_run = run_.str(); if (false == str_run.empty() || false == paragraph_style_name_.empty() || (false == base_style_name_.empty() && process_layouts_)) { CP_XML_WRITER(paragraph_) { CP_XML_NODE(L"a:p") { write_pPr(CP_XML_STREAM()); if (str_run.length() > 0) { CP_XML_STREAM() << run_.str(); } CP_XML_NODE(L"a:endParaRPr") { odf_reader::paragraph_format_properties parap_props; ApplyParagraphProperties(paragraph_style_name_, parap_props, false); if (last_run_font_size_ && !parap_props.fo_margin_top_) { int sz = last_run_font_size_->get_value_unit(odf_types::length::pt) * 100; CP_XML_ATTR(L"sz", sz); } last_run_font_size_ = boost::none; } } } run_.str(std::wstring()); } return paragraph_.str(); } #if defined (_WIN32) || defined (_WIN64) #include #endif void pptx_text_context::Impl::dump_field() { if (field_type_ == none) return; CP_XML_WRITER(run_) { CP_XML_NODE(L"a:fld") { std::wstring content = XmlUtils::EncodeXmlString(field_value_.str()); std::wstring string_id; std::wstring string_type; #if defined (_WIN32) || defined (_WIN64) GUID new_id; CoCreateGuid(&new_id); wchar_t str[100]={}; StringFromGUID2(new_id,str,100); string_id = str; #endif switch (field_type_) { case page_number: { string_type = L"slidenum"; #if !defined (_WIN32) && !defined (_WIN64) string_id = L"{5CC2A059-B141-45A7-B910-B096D6D06820}"; #endif // content = L"‹#›"; } break; case date: { string_type = L"datetime1"; #if !defined (_WIN32) && !defined (_WIN64) string_id = L"{1D1B89AE-8D35-4BB5-B492-6D9BE4F23A39}"; #endif if (content.length()<1)content = XmlUtils::EncodeXmlString(L"01.01.2000"); } break; case time: { string_type = L"datetime11"; #if !defined (_WIN32) && !defined (_WIN64) string_id = L"{03DA74A9-E3F2-4F30-AAF9-CC1A83980D5E}"; #endif if (content.length()<1)content = XmlUtils::EncodeXmlString(L"00:00:00"); } break; case datetime: { string_type = L"datetime1"; #if !defined (_WIN32) && !defined (_WIN64) string_id = L"{A9EA0FE8-FEF9-4B2F-BC9D-19DDCDB4AB9B}"; #endif }break; } if (string_type.length()>0) { CP_XML_ATTR(L"id", string_id); CP_XML_ATTR(L"type", string_type); CP_XML_NODE(L"a:t") { CP_XML_STREAM() << content; } } else { //запишем как обычный текст text_ << content; } } } field_value_.str(std::wstring()); field_type_ = none; } void pptx_text_context::Impl::dump_run() { if (in_comment) return; dump_field(); //if (process_layouts_) // return; const std::wstring content = XmlUtils::EncodeXmlString(text_.str()); //if (content.length() <1 && span_style_name_.length()<1) return ; ... провеить с пустыми строками нужны ли ... if (content.length() > 0) { CP_XML_WRITER(run_) { CP_XML_NODE(L"a:r") { write_rPr(CP_XML_STREAM()); CP_XML_NODE(L"a:t") { //CP_XML_ATTR(L"xml:space", L"preserve"); CP_XML_STREAM() << content; } } text_.str(std::wstring()); } } else { odf_reader::text_format_properties text_properties_; ApplyTextProperties(span_style_name_, paragraph_style_name_, text_properties_); if (text_properties_.fo_font_size_ && text_properties_.fo_font_size_->get_type() == odf_types::font_size::Length) last_run_font_size_ = text_properties_.fo_font_size_->get_length(); } hyperlink_hId =L""; } void pptx_text_context::Impl::start_base_style(const std::wstring baseStyleName, const odf_types::style_family::type baseStyleType) { base_style_name_ = baseStyleName; base_style_family_ = baseStyleType; } void pptx_text_context::Impl::end_base_style() { base_style_name_ = L""; base_style_family_ = odf_types::style_family::None; } void pptx_text_context::Impl::start_object() { paragraphs_cout_ = 0; run_.str(std::wstring()); paragraph_.str(std::wstring()); text_.str(std::wstring()); field_value_.str(std::wstring()); paragraph_style_name_ = L""; span_style_name_ = L""; } std::wstring pptx_text_context::Impl::end_object() { dump_paragraph(/*true*/); std::wstring str_paragraph = paragraph_.str(); std::wstringstream str_output; if (str_paragraph.length() > 0) { write_list_styles(str_output); str_output << str_paragraph; } paragraphs_cout_ = 0; run_.str(std::wstring()); paragraph_.str(std::wstring()); text_.str(std::wstring()); field_value_.str(std::wstring()); paragraph_style_name_ = L""; span_style_name_=L""; return str_output.str(); } void pptx_text_context::Impl::start_list_item(bool restart) { if (paragraphs_cout_ > 0 && restart) { dump_paragraph(); } in_list_ = true; first_element_list_item_ = true; if (restart && !list_style_stack_.empty()) { const std::wstring curStyleName = current_list_style(); const std::wstring newStyleName = curStyleName + std::to_wstring(new_list_style_number_++); list_style_renames_[curStyleName] = newStyleName; odf_reader::list_style_container & lists = odf_context_.listStyleContainer(); odf_reader::text_list_style * curStyle = lists.list_style_by_name(curStyleName); lists.add_list_style(curStyle, newStyleName); end_list(); start_list(newStyleName); } } void pptx_text_context::Impl::start_list(const std::wstring & StyleName, bool Continue) { if (paragraphs_cout_ > 0 && ( in_paragraph || !list_style_stack_.empty())) { dump_paragraph(); } if (!StyleName.empty()) { std::wstring name = StyleName; if (Continue) name = find_list_rename(name); list_style_stack_.push_back(name); } else if (!list_style_stack_.empty()) list_style_stack_.push_back(list_style_stack_.back()); else list_style_stack_.push_back(L""); } void pptx_text_context::Impl::end_list() { in_list_ = false; list_style_stack_.pop_back();// пока не стираем .. как сохраним в lstStyles - очистим } std::wstring pptx_text_context::Impl::current_list_style() { if (!list_style_stack_.empty()) return list_style_stack_.back(); else return L""; } std::wstring pptx_text_context::Impl::find_list_rename(const std::wstring & ListStyleName) { std::wstring name = ListStyleName; while (list_style_renames_.count(name) > 0) name = list_style_renames_.at(name); return name; } void pptx_text_context::Impl::end_list_item() { dump_paragraph(); if (paragraphs_cout_ != 0) paragraphs_cout_--; paragraph_style_name_ = L""; in_list_ = false; } void pptx_text_context::Impl::start_field(field_type type, const std::wstring & styleName) { field_type_ = type; } void pptx_text_context::Impl::start_comment() { in_comment = true;//отдельная ветка - так как без форматирования } std::wstring pptx_text_context::Impl::end_comment() { std::wstring str_comment = text_.str(); text_.str(std::wstring()); in_comment = false; paragraphs_cout_ = 0; paragraph_style_name_ = L""; span_style_name_=L""; return str_comment; } void pptx_text_context::Impl::end_field() { dump_run(); field_type_ = none; } void pptx_text_context::Impl::write_list_styles(std::wostream & strm)//defaults style paragraph & lists { odf_reader::list_style_container & list_styles = odf_context_.listStyleContainer(); if (list_styles.empty()) return; CP_XML_WRITER(strm) { CP_XML_NODE(L"a:lstStyle"); //{ // //defPPr // //... // //list levels 0 - 8 // BOOST_FOREACH(std::wstring & st_name, list_style_stack_ ) // { // odf_reader::text_list_style * s = list_styles.list_style_by_name(st_name); // // BOOST_FOREACH(odf_reader::office_element_ptr & elm, s->get_content()) // { // elm->pptx_convert(pptx_context_); // } // } // CP_XML_STREAM() << get_styles_context().list_style().str(); //} } list_style_stack_.clear(); } void pptx_text_context::Impl::set_rel_id(const std::wstring& rId) { hyperlink_.rId = rId; } void pptx_text_context::Impl::set_action(const std::wstring& action) { hyperlink_.action = action; } hyperlink_data pptx_text_context::Impl::get_hyperlink() { return hyperlink_; } std::wstring pptx_text_context::Impl::get_last_paragraph_style_name() { return last_paragraph_style_name_; } ///////////////////////////////////////////////////////////////////////////////////////////////////// pptx_text_context::pptx_text_context(odf_reader::odf_read_context & odf_context_, pptx_conversion_context & pptx_context_): impl_(new pptx_text_context::Impl(odf_context_,pptx_context_)) {} pptx_text_context::~pptx_text_context() { } void pptx_text_context::set_local_styles_container(odf_reader::styles_container* local_styles_) { return impl_->set_local_styles_container(local_styles_); } void pptx_text_context::add_paragraph(const std::wstring & para) { return impl_->add_paragraph(para); } void pptx_text_context::add_text(const std::wstring & text) { return impl_->add_text(text); } bool pptx_text_context::in_list() { return impl_->in_list_; } void pptx_text_context::start_paragraph(const std::wstring & styleName) { return impl_->start_paragraph(styleName); } void pptx_text_context::end_paragraph() { return impl_->end_paragraph(); } void pptx_text_context::start_span(const std::wstring & styleName) { return impl_->start_span(styleName); } void pptx_text_context::end_span() { return impl_->end_span(); } std::wstring pptx_text_context::end_span2() { return impl_->end_span2(); } void pptx_text_context::start_list_item(bool restart) { return impl_->start_list_item(restart); } void pptx_text_context::end_list_item() { return impl_->end_list_item(); } void pptx_text_context::start_list(const std::wstring & StyleName, bool Continue) { return impl_->start_list(StyleName,Continue); } void pptx_text_context::end_list() { return impl_->end_list(); } void pptx_text_context::start_base_style(const std::wstring baseStyleName, const odf_types::style_family::type baseStyleType) { return impl_->start_base_style(baseStyleName, baseStyleType); } void pptx_text_context::end_base_style() { return impl_->end_base_style(); } void pptx_text_context::start_object() { return impl_->start_object(); } void pptx_text_context::start_hyperlink() { return impl_->start_hyperlink(); } void pptx_text_context::set_rel_id(const std::wstring& rId) { impl_->set_rel_id(rId); } void pptx_text_context::set_action(const std::wstring& action) { impl_->set_action(action); } void pptx_text_context::end_hyperlink() { return impl_->end_hyperlink(); } std::wstring pptx_text_context::end_object() { return impl_->end_object(); } hyperlink_data pptx_text_context::get_hyperlink() { return impl_->get_hyperlink(); } styles_context & pptx_text_context::get_styles_context() { return impl_->get_styles_context() ; } void pptx_text_context::start_field(field_type type, const std::wstring & styleName) { impl_->start_field(type, styleName); } void pptx_text_context::end_field() { impl_->end_field(); } void pptx_text_context::start_comment_content() { impl_->start_comment(); } std::wstring pptx_text_context::end_comment_content() { return impl_->end_comment(); } void pptx_text_context::set_process_layouts(bool val) { impl_->process_layouts_ = val; } std::wstring pptx_text_context::get_last_paragraph_style_name() { return impl_->get_last_paragraph_style_name(); } } }