Commit c6a05e49 authored by ElenaSubbotina's avatar ElenaSubbotina

OdfFormatReader - ..

parent 82e82971
...@@ -82,6 +82,8 @@ void text_tracked_context::start_changes_content() ...@@ -82,6 +82,8 @@ void text_tracked_context::start_changes_content()
void text_tracked_context::end_changes_content() void text_tracked_context::end_changes_content()
{ {
docx_context_.finish_run(); //0106GS-GettingStartedWithWriter_el.odt - удаленный заголовок
current_state_.content.push_back(changes_stream_.str()); current_state_.content.push_back(changes_stream_.str());
docx_context_.set_delete_text_state (false); docx_context_.set_delete_text_state (false);
...@@ -130,7 +132,6 @@ text_tracked_context::_state & text_tracked_context::get_tracked_change(std::wst ...@@ -130,7 +132,6 @@ text_tracked_context::_state & text_tracked_context::get_tracked_change(std::wst
//---------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------
docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfDocument) : docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfDocument) :
mediaitems_ (OdfDocument->get_folder() ),
next_dump_page_properties_ (false), next_dump_page_properties_ (false),
page_break_after_ (false), page_break_after_ (false),
page_break_before_ (false), page_break_before_ (false),
...@@ -150,7 +151,8 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfD ...@@ -150,7 +151,8 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfD
delayed_converting_ (false), delayed_converting_ (false),
process_headers_footers_ (false), process_headers_footers_ (false),
process_comment_ (false), process_comment_ (false),
math_context_ (false), mediaitems_ (OdfDocument->get_folder() ),
math_context_ (OdfDocument->odf_context().fontContainer(), false),
odf_document_ (OdfDocument) odf_document_ (OdfDocument)
{ {
streams_man_ = streams_man::create(temp_stream_); streams_man_ = streams_man::create(temp_stream_);
...@@ -832,13 +834,19 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str ...@@ -832,13 +834,19 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str
//in_styles = true -> styles.xml //in_styles = true -> styles.xml
//почему то конструкция <pPr><rPr/></pPr><rPr/> "не работает" в части в rPr в ms2010 ) //почему то конструкция <pPr><rPr/></pPr><rPr/> "не работает" в части в rPr в ms2010 )
{ {
bool in_drawing = false;
if (get_drawing_context().get_current_shape() || get_drawing_context().get_current_frame())
{
in_drawing = true;
}
std::wstringstream & paragraph_style = get_styles_context().paragraph_nodes(); std::wstringstream & paragraph_style = get_styles_context().paragraph_nodes();
std::wstringstream & run_style = get_styles_context().text_style(); std::wstringstream & run_style = get_styles_context().text_style();
CP_XML_WRITER(strm) CP_XML_WRITER(strm)
{ {
if (get_section_context().dump_.empty() == false && (!ParentId.empty() || get_section_context().get().is_dump_ || in_header_) if (get_section_context().dump_.empty() == false && (!ParentId.empty() || get_section_context().get().is_dump_ || in_header_)
&& !get_table_context().in_table()) && !get_table_context().in_table() && !in_drawing)
{//две подряд секции или если стиль определен и в заголовки нельзя пихать !!! {//две подряд секции или если стиль определен и в заголовки нельзя пихать !!!
CP_XML_NODE(L"w:pPr") CP_XML_NODE(L"w:pPr")
{ {
...@@ -853,7 +861,7 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str ...@@ -853,7 +861,7 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str
{ {
CP_XML_NODE(L"w:pPr") CP_XML_NODE(L"w:pPr")
{ {
if ( !get_table_context().in_table() ) if ( !get_table_context().in_table() && !in_drawing)
{ {
CP_XML_STREAM() << get_section_context().dump_; CP_XML_STREAM() << get_section_context().dump_;
get_section_context().dump_.clear(); get_section_context().dump_.clear();
......
...@@ -270,7 +270,7 @@ void docx_serialize_shape_child(std::wostream & strm, _docx_drawing & val) ...@@ -270,7 +270,7 @@ void docx_serialize_shape_child(std::wostream & strm, _docx_drawing & val)
{ {
CP_XML_ATTR(L"txBox", 1); CP_XML_ATTR(L"txBox", 1);
} }
if (val.inGroup == false) if (val.inGroup == false && val.sub_type != 1 && val.sub_type != 2)
{ {
CP_XML_NODE(L"a:spLocks") CP_XML_NODE(L"a:spLocks")
{ {
...@@ -439,8 +439,6 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val) ...@@ -439,8 +439,6 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
{ {
std::wstring relativeFrom = L"margin"; std::wstring relativeFrom = L"margin";
if (val.styleHorizontalRel) relativeFrom =val.styleHorizontalRel->get_type_str(); if (val.styleHorizontalRel) relativeFrom =val.styleHorizontalRel->get_type_str();
if (relativeFrom == L"column") relativeFrom = L"margin";
CP_XML_ATTR(L"relativeFrom", relativeFrom); CP_XML_ATTR(L"relativeFrom", relativeFrom);
...@@ -510,8 +508,10 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val) ...@@ -510,8 +508,10 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
} }
if (val.pctHeight) if (val.pctHeight)
{ {
std::wstring relativeFrom = L"paragraph"; std::wstring relativeFrom = L"margin";
if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str(); if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str();
if (relativeFrom == L"paragraph") relativeFrom = L"margin";
CP_XML_NODE(L"wp14:sizeRelV") CP_XML_NODE(L"wp14:sizeRelV")
{ {
......
...@@ -97,9 +97,12 @@ void headers_footers::dump_rels(rels & Rels) const//внешние релсы ...@@ -97,9 +97,12 @@ void headers_footers::dump_rels(rels & Rels) const//внешние релсы
} }
} }
bool headers_footers::write_sectPr(const std::wstring & StyleName, std::wostream & _Wostream) const bool headers_footers::write_sectPr(const std::wstring & StyleName, bool next_page/*not used*/, std::wostream & _Wostream)
{ {
if (!instances_.count(StyleName))return false; if (!instances_.count(StyleName)) return false;
if (last_write_style_ == StyleName) return true;
last_write_style_ = StyleName;
bool first = false, left = false; bool first = false, left = false;
bool res = false; bool res = false;
......
...@@ -49,7 +49,8 @@ namespace oox { ...@@ -49,7 +49,8 @@ namespace oox {
class headers_footers class headers_footers
{ {
public: public:
headers_footers() : size_(0),enable_write_(false){} headers_footers() : size_(0) {}
enum Type { header, footer, headerLeft, footerLeft, headerFirst, footerFirst, none }; enum Type { header, footer, headerLeft, footerLeft, headerFirst, footerFirst, none };
std::wstring add(const std::wstring & StyleName, const std::wstring & Content, Type type,rels &_rels); std::wstring add(const std::wstring & StyleName, const std::wstring & Content, Type type,rels &_rels);
...@@ -66,18 +67,17 @@ public: ...@@ -66,18 +67,17 @@ public:
}; };
void dump_rels(rels & Rels) const; void dump_rels(rels & Rels) const;
bool write_sectPr(const std::wstring & StyleName, std::wostream & _Wostream) const; bool write_sectPr(const std::wstring & StyleName, bool next_page, std::wostream & _Wostream);
typedef boost::shared_ptr<instance> instance_ptr; typedef boost::shared_ptr<instance> instance_ptr;
typedef std::vector<instance_ptr> instances_array; typedef std::vector<instance_ptr> instances_array;
typedef boost::unordered_map<std::wstring, instances_array> instances_map; typedef boost::unordered_map<std::wstring, instances_array> instances_map;
const instances_map & instances() const { return instances_; }
const instances_map & instances() const { return instances_; }
bool get_enable_write(){return enable_write_;}
void set_enable_write(bool val){enable_write_ = val;}
private: private:
bool enable_write_; std::wstring last_write_style_;
static std::wstring create_id(size_t i); static std::wstring create_id(size_t i);
static std::wstring create_name(size_t i, Type _Type); static std::wstring create_name(size_t i, Type _Type);
instances_map instances_; instances_map instances_;
......
...@@ -144,7 +144,7 @@ void styles_context::docx_serialize_table_style(std::wostream & strm, std::wstri ...@@ -144,7 +144,7 @@ void styles_context::docx_serialize_table_style(std::wostream & strm, std::wstri
} }
namespace oox namespace oox
{ {
math_context::math_context(bool graphic) : base_font_size_(12) math_context::math_context(odf_reader::fonts_container & fonts, bool graphic) : base_font_size_(12), fonts_container_(fonts)
{ {
graphRPR_ = graphic; graphRPR_ = graphic;
......
...@@ -44,6 +44,7 @@ namespace odf_reader ...@@ -44,6 +44,7 @@ namespace odf_reader
{ {
class style_instance; class style_instance;
class style_text_properties; class style_text_properties;
class fonts_container;
typedef boost::shared_ptr<style_text_properties> style_text_properties_ptr; typedef boost::shared_ptr<style_text_properties> style_text_properties_ptr;
}; };
...@@ -90,7 +91,7 @@ namespace oox { ...@@ -90,7 +91,7 @@ namespace oox {
class math_context : boost::noncopyable class math_context : boost::noncopyable
{ {
public: public:
math_context(bool graphic = false); math_context(odf_reader::fonts_container & fonts, bool graphic = false);
void start(); void start();
std::wstring end(); std::wstring end();
...@@ -99,6 +100,7 @@ namespace oox { ...@@ -99,6 +100,7 @@ namespace oox {
std::wstringstream & math_style_stream() { return math_style_stream_; } std::wstringstream & math_style_stream() { return math_style_stream_; }
odf_reader::fonts_container & fonts_container_;
int base_font_size_; int base_font_size_;
odf_reader::style_text_properties_ptr text_properties_; odf_reader::style_text_properties_ptr text_properties_;
......
...@@ -260,8 +260,8 @@ void oox_serialize_bodyPr(std::wostream & strm, _oox_drawing & val, const std::w ...@@ -260,8 +260,8 @@ void oox_serialize_bodyPr(std::wostream & strm, _oox_drawing & val, const std::w
if (val.inGroup == false) if (val.inGroup == false)
{ {
_CP_OPT(int) iWrap; _CP_OPT(int) iWrap;
odf_reader::GetProperty(prop,L"text-wrap" , iWrap); odf_reader::GetProperty(prop, L"text-wrap" , iWrap);
if ((iWrap) && (*iWrap == 0))CP_XML_ATTR(L"wrap", L"none"); if ((iWrap) && (*iWrap == 0)) CP_XML_ATTR(L"wrap", L"none");
} }
_CP_OPT(int) iAlign; _CP_OPT(int) iAlign;
...@@ -419,13 +419,13 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst ...@@ -419,13 +419,13 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst
std::wstring xfrm = name_space + L":xfrm"; std::wstring xfrm = name_space + L":xfrm";
_CP_OPT(double) dRotate; _CP_OPT(double) dRotate;
odf_reader::GetProperty(val.additional,L"svg:rotate",dRotate); odf_reader::GetProperty(val.additional, L"svg:rotate", dRotate);
_CP_OPT(double) dSkewX; _CP_OPT(double) dSkewX;
odf_reader::GetProperty(val.additional,L"svg:skewX",dSkewX); odf_reader::GetProperty(val.additional, L"svg:skewX", dSkewX);
_CP_OPT(double) dSkewY; _CP_OPT(double) dSkewY;
odf_reader::GetProperty(val.additional,L"svg:skewY",dSkewY); odf_reader::GetProperty(val.additional, L"svg:skewY", dSkewY);
_CP_OPT(double) dRotateAngle; _CP_OPT(double) dRotateAngle;
...@@ -443,7 +443,7 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst ...@@ -443,7 +443,7 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst
{ {
if (dRotateAngle) if (dRotateAngle)
{ {
double d =360-dRotateAngle.get()*180./3.14159265358979323846; double d =360 - dRotateAngle.get() * 180. / 3.14159265358979323846;
d *= 60000; //60 000 per 1 gr - 19.5.5 oox d *= 60000; //60 000 per 1 gr - 19.5.5 oox
CP_XML_ATTR(L"rot", (int)d); CP_XML_ATTR(L"rot", (int)d);
} }
...@@ -456,11 +456,19 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst ...@@ -456,11 +456,19 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst
CP_XML_NODE(L"a:off") CP_XML_NODE(L"a:off")
{ {
CP_XML_ATTR(L"x", val.x); if (val.inGroup)
CP_XML_ATTR(L"y", val.y); {
CP_XML_ATTR(L"x", val.x);
CP_XML_ATTR(L"y", val.y);
}
else
{
CP_XML_ATTR(L"x", 0);
CP_XML_ATTR(L"y", 0);
}
} }
if (val.cx >0 || val.cy >0) if (val.cx > 0 || val.cy > 0)
{ {
CP_XML_NODE(L"a:ext") CP_XML_NODE(L"a:ext")
{ {
......
...@@ -61,16 +61,16 @@ namespace package ...@@ -61,16 +61,16 @@ namespace package
class pptx_document; class pptx_document;
} }
pptx_conversion_context::pptx_conversion_context( odf_reader::odf_document * odfDocument): pptx_conversion_context::pptx_conversion_context( odf_reader::odf_document * odfDocument)
output_document_(NULL) :output_document_ (NULL)
,odf_document_(odfDocument) ,odf_document_ (odfDocument)
,pptx_text_context_(odf_document_->odf_context(),*this) ,pptx_text_context_ (odf_document_->odf_context(), *this)
,pptx_table_context_(*this) ,pptx_table_context_ (*this)
,pptx_comments_context_(comments_context_handle_) ,pptx_comments_context_ (comments_context_handle_)
,pptx_slide_context_(*this/*, pptx_text_context_*/) ,pptx_slide_context_ (*this/*, pptx_text_context_*/)
,math_context_(true) ,math_context_ (odf_document_->odf_context().fontContainer(), true)
,last_idx_placeHolder(1) ,last_idx_placeHolder (1)
,last_uniq_big_id(1) ,last_uniq_big_id (1)
{ {
applicationFonts_ = new CApplicationFonts(); applicationFonts_ = new CApplicationFonts();
} }
......
...@@ -66,7 +66,7 @@ xlsx_conversion_context::xlsx_conversion_context(odf_reader::odf_document * odfD ...@@ -66,7 +66,7 @@ xlsx_conversion_context::xlsx_conversion_context(odf_reader::odf_document * odfD
num_format_context_ (odf_document_->odf_context()), num_format_context_ (odf_document_->odf_context()),
xlsx_text_context_ (odf_document_->odf_context().styleContainer()), xlsx_text_context_ (odf_document_->odf_context().styleContainer()),
xlsx_table_context_ (this, xlsx_text_context_), xlsx_table_context_ (this, xlsx_text_context_),
math_context_ (true), math_context_ (odf_document_->odf_context().fontContainer(), true),
xlsx_style_ (this), xlsx_style_ (this),
maxDigitSize_ (std::pair<float,float>(-1.0, -1.0) ), maxDigitSize_ (std::pair<float,float>(-1.0, -1.0) ),
......
...@@ -52,10 +52,10 @@ static const _shape_converter _OO_OOX_custom_shapes[]= ...@@ -52,10 +52,10 @@ static const _shape_converter _OO_OOX_custom_shapes[]=
{L"hexagon" ,L"hexagon" ,0 ,0 ,0 }, {L"hexagon" ,L"hexagon" ,0 ,0 ,0 },
{L"octagon" ,L"octagon" ,0 ,0 ,0 }, {L"octagon" ,L"octagon" ,0 ,0 ,0 },
{L"star4" ,L"star4" ,1 ,0 ,50000 }, {L"star4" ,L"star4" ,1 ,0 ,50000 },
{L"star5" ,L"star5" ,1 ,0 ,50000 }, {L"star5" ,L"star5" ,0 ,0 ,50000 },//??? 19098 неверно
{L"star8" ,L"star8" ,1 ,0 ,50000 }, {L"star8" ,L"star8" ,1 ,0 ,50000 },
{L"star24" ,L"star24" ,1 ,0 ,50000 }, {L"star24" ,L"star24" ,1 ,0 ,50000 },
{L"star6" ,L"star6" ,1 ,0 ,50000 }, {L"star6" ,L"star6" ,0 ,0 ,50000 },
{L"star12" ,L"star12" ,1 ,0 ,50000 }, {L"star12" ,L"star12" ,1 ,0 ,50000 },
{L"round-rectangle" ,L"roundRect" ,0 ,0 ,0 }, {L"round-rectangle" ,L"roundRect" ,0 ,0 ,0 },
{L"ellipse" ,L"ellipse" ,0 ,0 ,0 }, {L"ellipse" ,L"ellipse" ,0 ,0 ,0 },
...@@ -137,6 +137,7 @@ static const _shape_converter _OO_OOX_custom_shapes[]= ...@@ -137,6 +137,7 @@ static const _shape_converter _OO_OOX_custom_shapes[]=
{L"mso-spt14" ,L"thickArrow" ,0 ,0 ,0 }, {L"mso-spt14" ,L"thickArrow" ,0 ,0 ,0 },
{L"mso-spt17" ,L"Balloon" ,0 ,0 ,0 }, {L"mso-spt17" ,L"Balloon" ,0 ,0 ,0 },
{L"mso-spt18" ,L"irregularSeal1" ,0 ,0 ,0 }, {L"mso-spt18" ,L"irregularSeal1" ,0 ,0 ,0 },
{L"mso-spt19" ,L"rect" ,0 ,0 ,0 },
{L"mso-spt24" ,L"textBox" ,0 ,0 ,0 }, {L"mso-spt24" ,L"textBox" ,0 ,0 ,0 },
{L"mso-spt25" ,L"" ,0 ,0 ,0 }, {L"mso-spt25" ,L"" ,0 ,0 ,0 },
{L"mso-spt26" ,L"" ,0 ,0 ,0 }, {L"mso-spt26" ,L"" ,0 ,0 ,0 },
......
...@@ -1286,7 +1286,10 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context) ...@@ -1286,7 +1286,10 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
if (drawing.cx > max_x) drawing.cy = max_x; if (drawing.cx > max_x) drawing.cy = max_x;
} }
if (auto_fit_shape) if (auto_fit_shape)
{
drawing.additional.push_back(_property(L"text-wrap" , 0));
drawing.additional.push_back(_property(L"auto-grow-height", auto_fit_shape)); drawing.additional.push_back(_property(L"auto-grow-height", auto_fit_shape));
}
else if (auto_fit_text) else if (auto_fit_text)
drawing.additional.push_back(_property(L"fit-to-size", auto_fit_text)); drawing.additional.push_back(_property(L"fit-to-size", auto_fit_text));
......
...@@ -230,7 +230,11 @@ void draw_path::add_attributes( const xml::attributes_wc_ptr & Attributes ) ...@@ -230,7 +230,11 @@ void draw_path::add_attributes( const xml::attributes_wc_ptr & Attributes )
} }
void draw_path::reset_svg_path() void draw_path::reset_svg_path()
{ {
if (draw_path_attlist_.svg_d_) if (!draw_path_attlist_.svg_d_)
{
bad_shape_ = true;
}
else
{ {
std::vector<svg_path::_polyline> o_Polyline_pt; std::vector<svg_path::_polyline> o_Polyline_pt;
std::vector<svg_path::_polyline> o_Polyline_cm; std::vector<svg_path::_polyline> o_Polyline_cm;
...@@ -286,7 +290,11 @@ void draw_polygon::add_attributes( const xml::attributes_wc_ptr & Attributes ) ...@@ -286,7 +290,11 @@ void draw_polygon::add_attributes( const xml::attributes_wc_ptr & Attributes )
} }
void draw_polygon::reset_polygon_path() void draw_polygon::reset_polygon_path()
{ {
if (draw_polygon_attlist_.draw_points_) if (!draw_polygon_attlist_.draw_points_)
{
bad_shape_ = true;
}
else
{ {
std::vector<svg_path::_polyline> o_Polyline_pt; std::vector<svg_path::_polyline> o_Polyline_pt;
std::vector<svg_path::_polyline> o_Polyline_cm; std::vector<svg_path::_polyline> o_Polyline_cm;
...@@ -338,7 +346,11 @@ void draw_polyline::add_attributes( const xml::attributes_wc_ptr & Attributes ) ...@@ -338,7 +346,11 @@ void draw_polyline::add_attributes( const xml::attributes_wc_ptr & Attributes )
} }
void draw_polyline::reset_polyline_path() void draw_polyline::reset_polyline_path()
{ {
if (draw_polyline_attlist_.draw_points_) if (!draw_polyline_attlist_.draw_points_)
{
bad_shape_ = true;
}
else
{ {
std::vector<svg_path::_polyline> o_Polyline_pt; std::vector<svg_path::_polyline> o_Polyline_pt;
std::vector<svg_path::_polyline> o_Polyline_cm; std::vector<svg_path::_polyline> o_Polyline_cm;
...@@ -601,7 +613,11 @@ void draw_connector::add_attributes( const xml::attributes_wc_ptr & Attributes ) ...@@ -601,7 +613,11 @@ void draw_connector::add_attributes( const xml::attributes_wc_ptr & Attributes )
} }
void draw_connector::reset_svg_path() void draw_connector::reset_svg_path()
{ {
if (draw_connector_attlist_.svg_d_) if (!draw_connector_attlist_.svg_d_)
{
bad_shape_ = true;
}
else
{ {
std::vector<svg_path::_polyline> o_Polyline_pt; std::vector<svg_path::_polyline> o_Polyline_pt;
std::vector<svg_path::_polyline> o_Polyline_cm; std::vector<svg_path::_polyline> o_Polyline_cm;
......
...@@ -292,7 +292,7 @@ void math_mstyle::oox_convert(oox::math_context & Context) ...@@ -292,7 +292,7 @@ void math_mstyle::oox_convert(oox::math_context & Context)
{ {
CP_XML_NODE(L"m:ctrlPr") CP_XML_NODE(L"m:ctrlPr")
{ {
Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_); Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_, Context.fonts_container_);
} }
} }
} }
...@@ -317,7 +317,7 @@ void math_mstyle::oox_convert(oox::math_context & Context) ...@@ -317,7 +317,7 @@ void math_mstyle::oox_convert(oox::math_context & Context)
{ {
CP_XML_NODE(L"m:ctrlPr") CP_XML_NODE(L"m:ctrlPr")
{ {
Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_); Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_, Context.fonts_container_);
} }
} }
} }
......
...@@ -94,8 +94,10 @@ void math_mtr::oox_convert(oox::math_context & Context) ...@@ -94,8 +94,10 @@ void math_mtr::oox_convert(oox::math_context & Context)
strm << L"<m:mr>"; strm << L"<m:mr>";
for (int i = 0; i < content_.size(); i++) for (int i = 0; i < content_.size(); i++)
{ {
strm << L"<m:e>";
office_math_element* math_element = dynamic_cast<office_math_element*>(content_[i].get()); office_math_element* math_element = dynamic_cast<office_math_element*>(content_[i].get());
math_element->oox_convert(Context); math_element->oox_convert(Context);
strm << L"</m:e>";
} }
strm << L"</m:mr>"; strm << L"</m:mr>";
} }
......
...@@ -114,7 +114,7 @@ void math_mi::oox_convert(oox::math_context & Context) ...@@ -114,7 +114,7 @@ void math_mi::oox_convert(oox::math_context & Context)
} }
} }
Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_); Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_, Context.fonts_container_);
CP_XML_NODE(L"m:t") CP_XML_NODE(L"m:t")
{ {
...@@ -162,7 +162,7 @@ void math_mo::oox_convert(oox::math_context & Context) ...@@ -162,7 +162,7 @@ void math_mo::oox_convert(oox::math_context & Context)
{ {
// + доп стили текста ... todoooo // + доп стили текста ... todoooo
Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_); Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_, Context.fonts_container_);
CP_XML_NODE(L"m:t") CP_XML_NODE(L"m:t")
{ {
...@@ -203,7 +203,7 @@ void math_mn::oox_convert(oox::math_context & Context) ...@@ -203,7 +203,7 @@ void math_mn::oox_convert(oox::math_context & Context)
{ {
// + доп стили текста ... todoooo // + доп стили текста ... todoooo
Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_); Context.text_properties_->content().oox_convert(CP_XML_STREAM(), Context.graphRPR_, Context.fonts_container_);
CP_XML_NODE(L"m:t") CP_XML_NODE(L"m:t")
{ {
......
...@@ -128,8 +128,6 @@ void office_body::docx_convert(oox::docx_conversion_context & Context) ...@@ -128,8 +128,6 @@ void office_body::docx_convert(oox::docx_conversion_context & Context)
if (content_) if (content_)
content_->docx_convert(Context); content_->docx_convert(Context);
Context.get_headers_footers().set_enable_write(true);
if (!Context.get_section_context().dump_.empty() && !Context.get_table_context().in_table()) if (!Context.get_section_context().dump_.empty() && !Context.get_table_context().in_table())
{ {
Context.output_stream() << Context.get_section_context().dump_; Context.output_stream() << Context.get_section_context().dump_;
......
...@@ -276,18 +276,20 @@ void text_format_properties_content::pptx_convert_as_list(oox::pptx_conversion_c ...@@ -276,18 +276,20 @@ void text_format_properties_content::pptx_convert_as_list(oox::pptx_conversion_c
{ {
std::wstring w_font = (fo_font_family_ ? *fo_font_family_: L""); std::wstring w_font = (fo_font_family_ ? *fo_font_family_: L"");
if (w_font.length() < 1) if (w_font.empty())
{ {
std::wstring w_ascii = (style_font_name_ ? *style_font_name_: L""); std::wstring w_ascii = (style_font_name_ ? *style_font_name_ : L"");
std::wstring w_eastAsia = (style_font_name_asian_ ? *style_font_name_asian_: L""); std::wstring w_eastAsia = (style_font_name_asian_ ? *style_font_name_asian_ : L"");
std::wstring w_cs = (style_font_name_complex_ ? *style_font_name_complex_: L""); std::wstring w_cs = (style_font_name_complex_ ? *style_font_name_complex_ : L"");
fonts_container & fonts = Context.root()->odf_context().fontContainer(); fonts_container & fonts = Context.root()->odf_context().fontContainer();
font_instance * font = fonts.font_by_style_name(w_ascii); font_instance * font = fonts.font_by_style_name(w_ascii);
if (font == NULL)font = fonts.font_by_style_name(w_eastAsia); if (font == NULL) font = fonts.font_by_style_name(w_eastAsia);
if (font == NULL)font = fonts.font_by_style_name(w_cs); if (font == NULL) font = fonts.font_by_style_name(w_cs);
if (font)w_font = font->name();
if (font)
w_font = font->name();
//'Arial' глючит //'Arial' глючит
removeCharsFromString(w_font, _T("'")); removeCharsFromString(w_font, _T("'"));
...@@ -852,22 +854,38 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context & ...@@ -852,22 +854,38 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context &
if (style_font_name_ || style_font_name_asian_ || style_font_name_complex_ || fo_font_family_) if (style_font_name_ || style_font_name_asian_ || style_font_name_complex_ || fo_font_family_)
{ {
fonts_container & fonts = Context.root()->odf_context().fontContainer();
std::wstring w_eastAsia; std::wstring w_eastAsia;
std::wstring w_hAnsi; std::wstring w_hAnsi;
std::wstring w_cs; std::wstring w_cs;
std::wstring w_ascii = w_hAnsi = w_cs = (style_font_name_ ? *style_font_name_: L""); std::wstring w_ascii = w_hAnsi = w_cs = (fo_font_family_ ? *fo_font_family_ : L"");
_rPr << L"<w:rFonts "; if (style_font_name_complex_)
if (!w_ascii.empty()) {
_rPr << L"w:ascii=\"" << w_ascii <<"\" "; font_instance * font = fonts.font_by_style_name(*style_font_name_complex_);
if (!w_hAnsi.empty()) if (font)
_rPr << L"w:hAnsi=\"" << w_hAnsi <<"\" "; w_cs = font->name();
if (!w_eastAsia.empty()) }
_rPr << L"w:eastAsia=\"" << w_eastAsia <<"\" "; if (style_font_name_asian_)
if (!w_cs.empty()) {
_rPr << L"w:cs=\"" << w_cs <<"\" "; font_instance * font = fonts.font_by_style_name(*style_font_name_asian_);
if (font)
w_eastAsia = font->name();
}
if (style_font_name_)
{
font_instance * font = fonts.font_by_style_name(*style_font_name_);
if (font)
w_ascii = w_hAnsi = font->name();
}
_rPr << L" />"; _rPr << L"<w:rFonts";
if (!w_ascii.empty()) _rPr << L" w:ascii=\"" << w_ascii <<"\"";
if (!w_hAnsi.empty()) _rPr << L" w:hAnsi=\"" << w_hAnsi <<"\"";
if (!w_eastAsia.empty()) _rPr << L" w:eastAsia=\"" << w_eastAsia <<"\"";
if (!w_cs.empty()) _rPr << L" w:cs=\"" << w_cs <<"\"";
_rPr << L"/>";
} }
_CP_OPT(color) color_text = fo_color_; _CP_OPT(color) color_text = fo_color_;
...@@ -974,12 +992,12 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context & ...@@ -974,12 +992,12 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context &
} }
void text_format_properties_content::oox_convert (std::wostream & _rPr, bool graphic) void text_format_properties_content::oox_convert (std::wostream & _rPr, bool graphic, fonts_container & fonts)
{ {
const int W = process_font_weight (fo_font_weight_); const int W = process_font_weight (fo_font_weight_);
const int fontStyle = process_font_style (fo_font_style_); const int fontStyle = process_font_style (fo_font_style_);
const int WCs = process_font_weight (style_font_weight_complex_); const int WCs = process_font_weight (style_font_weight_complex_);
if (graphic) if (graphic)
{ {
_rPr << L"<a:rPr"; _rPr << L"<a:rPr";
...@@ -1324,19 +1342,33 @@ void text_format_properties_content::oox_convert (std::wostream & _rPr, bool gra ...@@ -1324,19 +1342,33 @@ void text_format_properties_content::oox_convert (std::wostream & _rPr, bool gra
std::wstring w_eastAsia; std::wstring w_eastAsia;
std::wstring w_hAnsi; std::wstring w_hAnsi;
std::wstring w_cs; std::wstring w_cs;
std::wstring w_ascii = w_hAnsi = w_cs = (style_font_name_ ? *style_font_name_: L""); std::wstring w_ascii = w_hAnsi = w_cs = (fo_font_family_ ? *fo_font_family_ : L"");
_rPr << L"<w:rFonts "; if (style_font_name_complex_)
if (!w_ascii.empty()) {
_rPr << L"w:ascii=\"" << w_ascii <<"\" "; font_instance * font = fonts.font_by_style_name(*style_font_name_complex_);
if (!w_hAnsi.empty()) if (font)
_rPr << L"w:hAnsi=\"" << w_hAnsi <<"\" "; w_cs = font->name();
if (!w_eastAsia.empty()) }
_rPr << L"w:eastAsia=\"" << w_eastAsia <<"\" "; if (style_font_name_asian_)
if (!w_cs.empty()) {
_rPr << L"w:cs=\"" << w_cs <<"\" "; font_instance * font = fonts.font_by_style_name(*style_font_name_asian_);
if (font)
w_eastAsia = font->name();
}
if (style_font_name_)
{
font_instance * font = fonts.font_by_style_name(*style_font_name_);
if (font)
w_ascii = w_hAnsi = font->name();
}
_rPr << L" />"; _rPr << L"<w:rFonts";
if (!w_ascii.empty()) _rPr << L" w:ascii=\"" << w_ascii <<"\"";
if (!w_hAnsi.empty()) _rPr << L" w:hAnsi=\"" << w_hAnsi <<"\"";
if (!w_eastAsia.empty()) _rPr << L" w:eastAsia=\"" << w_eastAsia <<"\"";
if (!w_cs.empty()) _rPr << L" w:cs=\"" << w_cs <<"\"";
_rPr << L"/>";
} }
_CP_OPT(color) color_text = fo_color_; _CP_OPT(color) color_text = fo_color_;
......
...@@ -69,6 +69,7 @@ namespace cpdoccore { ...@@ -69,6 +69,7 @@ namespace cpdoccore {
namespace odf_reader { namespace odf_reader {
class style_instance; class style_instance;
class fonts_container;
// 15.4 // 15.4
class text_format_properties_content : public oox::conversion_element class text_format_properties_content : public oox::conversion_element
...@@ -79,7 +80,8 @@ public: ...@@ -79,7 +80,8 @@ public:
void docx_convert (oox::docx_conversion_context & Context); void docx_convert (oox::docx_conversion_context & Context);
void pptx_convert (oox::pptx_conversion_context & Context); void pptx_convert (oox::pptx_conversion_context & Context);
void pptx_convert_as_list (oox::pptx_conversion_context & Context); void pptx_convert_as_list (oox::pptx_conversion_context & Context);
void oox_convert (std::wostream & stream, bool graphic);
void oox_convert (std::wostream & stream, bool graphic, fonts_container & fonts);
void apply_from (const text_format_properties_content & Other); void apply_from (const text_format_properties_content & Other);
void apply_to (std::vector<_property> & properties); void apply_to (std::vector<_property> & properties);
......
...@@ -1134,14 +1134,14 @@ void style_page_layout_properties_attlist::docx_convert_serialize(std::wostream ...@@ -1134,14 +1134,14 @@ void style_page_layout_properties_attlist::docx_convert_serialize(std::wostream
CP_XML_NODE(L"w:pgMar") CP_XML_NODE(L"w:pgMar")
{ {
CP_XML_ATTR(L"w:header" , process_page_margin(common_vertical_margin_attlist_.fo_margin_top_ ) );
CP_XML_ATTR(L"w:footer" , process_page_margin(common_vertical_margin_attlist_.fo_margin_bottom_ ) );
CP_XML_ATTR(L"w:gutter" , 0 );
CP_XML_ATTR(L"w:left" , process_page_margin(common_horizontal_margin_attlist_.fo_margin_left_ , margin_left_length) ); CP_XML_ATTR(L"w:left" , process_page_margin(common_horizontal_margin_attlist_.fo_margin_left_ , margin_left_length) );
CP_XML_ATTR(L"w:right" , process_page_margin(common_horizontal_margin_attlist_.fo_margin_right_, margin_right_length) ); CP_XML_ATTR(L"w:right" , process_page_margin(common_horizontal_margin_attlist_.fo_margin_right_, margin_right_length) );
CP_XML_ATTR(L"w:top" , process_page_margin(common_vertical_margin_attlist_.fo_margin_top_ , Context.get_header_footer_context().header()) ); CP_XML_ATTR(L"w:top" , process_page_margin(common_vertical_margin_attlist_.fo_margin_top_ , Context.get_header_footer_context().header()) );
CP_XML_ATTR(L"w:bottom" , process_page_margin(common_vertical_margin_attlist_.fo_margin_bottom_ , Context.get_header_footer_context().footer()) ); CP_XML_ATTR(L"w:bottom" , process_page_margin(common_vertical_margin_attlist_.fo_margin_bottom_ , Context.get_header_footer_context().footer()) );
CP_XML_ATTR(L"w:header" , process_page_margin(common_vertical_margin_attlist_.fo_margin_top_ ) );
CP_XML_ATTR(L"w:footer" , process_page_margin(common_vertical_margin_attlist_.fo_margin_bottom_ ) );
CP_XML_ATTR(L"w:gutter" , 0 );
} }
} }
...@@ -1286,19 +1286,17 @@ void style_page_layout_properties::docx_convert_serialize(std::wostream & strm, ...@@ -1286,19 +1286,17 @@ void style_page_layout_properties::docx_convert_serialize(std::wostream & strm,
{ {
Context.process_section( CP_XML_STREAM(), columns); Context.process_section( CP_XML_STREAM(), columns);
bool next_page = Context.is_next_dump_page_properties();
CP_XML_NODE(L"w:type") CP_XML_NODE(L"w:type")
{ {
if (Context.is_next_dump_page_properties()) if (next_page) CP_XML_ATTR(L"w:val", L"nextPage");
{ else CP_XML_ATTR(L"w:val", L"continuous");
CP_XML_ATTR(L"w:val", L"nextPage");
}else
{
CP_XML_ATTR(L"w:val", L"continuous");
}
} }
std::wstring masterPageName = Context.get_master_page_name(); std::wstring masterPageName = Context.get_master_page_name();
bool res = Context.get_headers_footers().write_sectPr(masterPageName, strm); bool res = Context.get_headers_footers().write_sectPr(masterPageName, next_page, strm);
if (res == false) if (res == false)
{ {
// default??? // default???
...@@ -1308,7 +1306,7 @@ void style_page_layout_properties::docx_convert_serialize(std::wostream & strm, ...@@ -1308,7 +1306,7 @@ void style_page_layout_properties::docx_convert_serialize(std::wostream & strm,
Context.remove_page_properties(); Context.remove_page_properties();
Context.add_page_properties(masterPageNameLayout); Context.add_page_properties(masterPageNameLayout);
bool res = Context.get_headers_footers().write_sectPr(masterPageName, strm); bool res = Context.get_headers_footers().write_sectPr(masterPageName, next_page, strm);
} }
oox::section_context::_section & section = Context.get_section_context().get(); oox::section_context::_section & section = Context.get_section_context().get();
......
...@@ -137,7 +137,14 @@ typedef std::map<std::wstring, oox::text_tracked_context::_state>::iterator map_ ...@@ -137,7 +137,14 @@ typedef std::map<std::wstring, oox::text_tracked_context::_state>::iterator map_
int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_context & Context) int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_context & Context)
{ {
if (!Attr.text_style_name_.empty()) bool in_drawing = false;
if (Context.get_drawing_context().get_current_shape() || Context.get_drawing_context().get_current_frame())
{
in_drawing = true;
}
if (!Attr.text_style_name_.empty())
{ {
if (style_instance * styleInst = if (style_instance * styleInst =
Context.root()->odf_context().styleContainer().style_by_name(Attr.text_style_name_.style_name(), style_family::Paragraph, Context.process_headers_footers_) Context.root()->odf_context().styleContainer().style_by_name(Attr.text_style_name_.style_name(), style_family::Paragraph, Context.process_headers_footers_)
...@@ -188,9 +195,10 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co ...@@ -188,9 +195,10 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co
const std::wstring id = Context.styles_map_.get( styleInst->name(), styleInst->type() ); const std::wstring id = Context.styles_map_.get( styleInst->name(), styleInst->type() );
Context.output_stream() << L"<w:pPr>"; Context.output_stream() << L"<w:pPr>";
//todooo причесать //todooo причесать
if (!Context.get_section_context().dump_.empty() && if (!Context.get_section_context().dump_.empty()
!Context.get_table_context().in_table() && && !Context.get_table_context().in_table()
(Context.get_process_note() == oox::docx_conversion_context::noNote)) && (Context.get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{ {
if (Context.is_paragraph_header() ) if (Context.is_paragraph_header() )
{ {
...@@ -236,9 +244,10 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co ...@@ -236,9 +244,10 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co
} }
} }
} }
if (!Context.get_section_context().dump_.empty() && if (!Context.get_section_context().dump_.empty()
!Context.get_table_context().in_table() && && !Context.get_table_context().in_table()
(Context.get_process_note() == oox::docx_conversion_context::noNote)) && (Context.get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{ {
Context.output_stream() << L"<w:pPr>"; Context.output_stream() << L"<w:pPr>";
Context.output_stream() << Context.get_section_context().dump_; Context.output_stream() << Context.get_section_context().dump_;
...@@ -361,18 +370,18 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context) ...@@ -361,18 +370,18 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
{ {
const std::wstring & styleName = attrs_.text_style_name_.style_name(); const std::wstring & styleName = attrs_.text_style_name_.style_name();
bool drawing = false; bool in_drawing = false;
if (Context.get_drawing_context().get_current_shape() || Context.get_drawing_context().get_current_frame()) if (Context.get_drawing_context().get_current_shape() || Context.get_drawing_context().get_current_frame())
{ {
drawing = true; in_drawing = true;
} }
bool bIsNewParagraph = true; bool bIsNewParagraph = true;
bool is_empty = content_.empty(); bool is_empty = content_.empty();
if (Context.get_paragraph_state() && (Context.get_process_note() == oox::docx_conversion_context::noNote) && !drawing) if (Context.get_paragraph_state() && (Context.get_process_note() == oox::docx_conversion_context::noNote) && !in_drawing)
{//вложеннные элементы ... или после графики embedded_linux_kernel_and_drivers_labs_zh_TW.odt {//вложеннные элементы ... или после графики embedded_linux_kernel_and_drivers_labs_zh_TW.odt
bIsNewParagraph = false; bIsNewParagraph = false;
...@@ -425,8 +434,6 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context) ...@@ -425,8 +434,6 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
Context.remove_page_properties(); Context.remove_page_properties();
Context.add_page_properties(masterPageNameLayout); Context.add_page_properties(masterPageNameLayout);
Context.set_page_break(true);
is_empty = false; is_empty = false;
} }
...@@ -453,7 +460,8 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context) ...@@ -453,7 +460,8 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
if (Context.get_page_break()) if (Context.get_page_break())
{ {
if (Context.process_headers_footers_ == false) if (Context.process_headers_footers_ == false)
_Wostream << L"<w:lastRenderedPageBreak/>"; //_Wostream << L"<w:lastRenderedPageBreak/>";
_Wostream << L"<w:br w:type=\"page\"/>";
Context.set_page_break(false); Context.set_page_break(false);
} }
elm->docx_convert(Context); elm->docx_convert(Context);
...@@ -482,7 +490,7 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context) ...@@ -482,7 +490,7 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
is_empty = false; is_empty = false;
Context.add_new_run(_T("")); Context.add_new_run(_T(""));
_Wostream << L"<w:br w:type=\"page\" />"; _Wostream << L"<w:br w:type=\"page\"/>";
Context.finish_run(); Context.finish_run();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment