Commit 9cc54393 authored by ElenaSubbotina's avatar ElenaSubbotina

Merge branch 'develop' into hotfix/v4.2.1

parents 29b4a104 16386f4b
......@@ -94,12 +94,12 @@ namespace DocFileFormat
//In some files there is a indent but no sprmTWidthIndent is set.
//For this cases we can calculate the indent of the table by getting the
//first boundary of the TDef and adding the padding of the cells
tblIndent = FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize );
//add the gabHalf
tblIndent += gabHalf;
//If there follows a real sprmTWidthIndent, this value will be overwritten
tblIndent = (std::max)((int)tblIndent,0);
//tblIndent = (std::max)((int)tblIndent,0); //cerere.doc
}
break;
......
......@@ -82,6 +82,8 @@ void text_tracked_context::start_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());
docx_context_.set_delete_text_state (false);
......@@ -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) :
mediaitems_ (OdfDocument->get_folder() ),
next_dump_page_properties_ (false),
page_break_after_ (false),
page_break_before_ (false),
......@@ -150,7 +151,8 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfD
delayed_converting_ (false),
process_headers_footers_ (false),
process_comment_ (false),
math_context_ (false),
mediaitems_ (OdfDocument->get_folder() ),
math_context_ (OdfDocument->odf_context().fontContainer(), false),
odf_document_ (OdfDocument)
{
streams_man_ = streams_man::create(temp_stream_);
......@@ -832,13 +834,20 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str
//in_styles = true -> styles.xml
//почему то конструкция <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 & run_style = get_styles_context().text_style();
CP_XML_WRITER(strm)
{
//Tutor_Charlotte_Tutor_the_Entire_World_.odt
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")
{
......@@ -853,7 +862,7 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str
{
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_;
get_section_context().dump_.clear();
......
......@@ -270,7 +270,7 @@ void docx_serialize_shape_child(std::wostream & strm, _docx_drawing & val)
{
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")
{
......@@ -439,8 +439,6 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
{
std::wstring relativeFrom = L"margin";
if (val.styleHorizontalRel) relativeFrom =val.styleHorizontalRel->get_type_str();
if (relativeFrom == L"column") relativeFrom = L"margin";
CP_XML_ATTR(L"relativeFrom", relativeFrom);
......@@ -510,8 +508,10 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
}
if (val.pctHeight)
{
std::wstring relativeFrom = L"paragraph";
if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str();
std::wstring relativeFrom = L"margin";
if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str();
if (relativeFrom == L"paragraph") relativeFrom = L"margin";
CP_XML_NODE(L"wp14:sizeRelV")
{
......
......@@ -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 res = false;
......
......@@ -49,7 +49,8 @@ namespace oox {
class headers_footers
{
public:
headers_footers() : size_(0),enable_write_(false){}
headers_footers() : size_(0) {}
enum Type { header, footer, headerLeft, footerLeft, headerFirst, footerFirst, none };
std::wstring add(const std::wstring & StyleName, const std::wstring & Content, Type type,rels &_rels);
......@@ -66,18 +67,17 @@ public:
};
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 std::vector<instance_ptr> instances_array;
typedef boost::unordered_map<std::wstring, instances_array> instances_map;
const instances_map & instances() const { return instances_; }
bool get_enable_write(){return enable_write_;}
void set_enable_write(bool val){enable_write_ = val;}
const instances_map & instances() const { return instances_; }
private:
bool enable_write_;
std::wstring last_write_style_;
static std::wstring create_id(size_t i);
static std::wstring create_name(size_t i, Type _Type);
instances_map instances_;
......
......@@ -144,7 +144,7 @@ void styles_context::docx_serialize_table_style(std::wostream & strm, std::wstri
}
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;
......
......@@ -44,6 +44,7 @@ namespace odf_reader
{
class style_instance;
class style_text_properties;
class fonts_container;
typedef boost::shared_ptr<style_text_properties> style_text_properties_ptr;
};
......@@ -90,7 +91,7 @@ namespace oox {
class math_context : boost::noncopyable
{
public:
math_context(bool graphic = false);
math_context(odf_reader::fonts_container & fonts, bool graphic = false);
void start();
std::wstring end();
......@@ -99,6 +100,7 @@ namespace oox {
std::wstringstream & math_style_stream() { return math_style_stream_; }
odf_reader::fonts_container & fonts_container_;
int base_font_size_;
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
if (val.inGroup == false)
{
_CP_OPT(int) iWrap;
odf_reader::GetProperty(prop,L"text-wrap" , iWrap);
if ((iWrap) && (*iWrap == 0))CP_XML_ATTR(L"wrap", L"none");
odf_reader::GetProperty(prop, L"text-wrap" , iWrap);
if ((iWrap) && (*iWrap == 0)) CP_XML_ATTR(L"wrap", L"none");
}
_CP_OPT(int) iAlign;
......@@ -419,13 +419,13 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst
std::wstring xfrm = name_space + L":xfrm";
_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;
odf_reader::GetProperty(val.additional,L"svg:skewX",dSkewX);
odf_reader::GetProperty(val.additional, L"svg:skewX", dSkewX);
_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;
......@@ -443,7 +443,7 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst
{
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
CP_XML_ATTR(L"rot", (int)d);
}
......@@ -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_ATTR(L"x", val.x);
CP_XML_ATTR(L"y", val.y);
if (val.inGroup)
{
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")
{
......
......@@ -61,16 +61,16 @@ namespace package
class pptx_document;
}
pptx_conversion_context::pptx_conversion_context( odf_reader::odf_document * odfDocument):
output_document_(NULL)
,odf_document_(odfDocument)
,pptx_text_context_(odf_document_->odf_context(),*this)
,pptx_table_context_(*this)
,pptx_comments_context_(comments_context_handle_)
,pptx_slide_context_(*this/*, pptx_text_context_*/)
,math_context_(true)
,last_idx_placeHolder(1)
,last_uniq_big_id(1)
pptx_conversion_context::pptx_conversion_context( odf_reader::odf_document * odfDocument)
:output_document_ (NULL)
,odf_document_ (odfDocument)
,pptx_text_context_ (odf_document_->odf_context(), *this)
,pptx_table_context_ (*this)
,pptx_comments_context_ (comments_context_handle_)
,pptx_slide_context_ (*this/*, pptx_text_context_*/)
,math_context_ (odf_document_->odf_context().fontContainer(), true)
,last_idx_placeHolder (1)
,last_uniq_big_id (1)
{
applicationFonts_ = new CApplicationFonts();
}
......
......@@ -66,7 +66,7 @@ xlsx_conversion_context::xlsx_conversion_context(odf_reader::odf_document * odfD
num_format_context_ (odf_document_->odf_context()),
xlsx_text_context_ (odf_document_->odf_context().styleContainer()),
xlsx_table_context_ (this, xlsx_text_context_),
math_context_ (true),
math_context_ (odf_document_->odf_context().fontContainer(), true),
xlsx_style_ (this),
maxDigitSize_ (std::pair<float,float>(-1.0, -1.0) ),
......
......@@ -52,10 +52,10 @@ static const _shape_converter _OO_OOX_custom_shapes[]=
{L"hexagon" ,L"hexagon" ,0 ,0 ,0 },
{L"octagon" ,L"octagon" ,0 ,0 ,0 },
{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"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"round-rectangle" ,L"roundRect" ,0 ,0 ,0 },
{L"ellipse" ,L"ellipse" ,0 ,0 ,0 },
......@@ -137,6 +137,7 @@ static const _shape_converter _OO_OOX_custom_shapes[]=
{L"mso-spt14" ,L"thickArrow" ,0 ,0 ,0 },
{L"mso-spt17" ,L"Balloon" ,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-spt25" ,L"" ,0 ,0 ,0 },
{L"mso-spt26" ,L"" ,0 ,0 ,0 },
......
......@@ -865,13 +865,15 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
if (attlists_.rel_size_.style_rel_width_)
{
int type = attlists_.rel_size_.style_rel_width_->get_type();
drawing.pctWidth = attlists_.rel_size_.style_rel_width_->get_percent().get_value();
int type = attlists_.rel_size_.style_rel_width_->get_type();
if (type == odf_types::percent_or_scale::Percent)
drawing.pctWidth = attlists_.rel_size_.style_rel_width_->get_percent().get_value();
}
if (attlists_.rel_size_.style_rel_height_ )
{
int type = attlists_.rel_size_.style_rel_height_->get_type();
drawing.pctHeight = attlists_.rel_size_.style_rel_height_->get_percent().get_value();
int type = attlists_.rel_size_.style_rel_height_->get_type();
if (type == odf_types::percent_or_scale::Percent)
drawing.pctHeight = attlists_.rel_size_.style_rel_height_->get_percent().get_value();
}
}
......@@ -1286,7 +1288,10 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
if (drawing.cx > max_x) drawing.cy = max_x;
}
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));
}
else if (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 )
}
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_cm;
......@@ -286,7 +290,11 @@ void draw_polygon::add_attributes( const xml::attributes_wc_ptr & Attributes )
}
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_cm;
......@@ -338,7 +346,11 @@ void draw_polyline::add_attributes( const xml::attributes_wc_ptr & Attributes )
}
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_cm;
......@@ -601,7 +613,11 @@ void draw_connector::add_attributes( const xml::attributes_wc_ptr & Attributes )
}
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_cm;
......
......@@ -292,7 +292,7 @@ void math_mstyle::oox_convert(oox::math_context & Context)
{
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)
{
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)
strm << L"<m:mr>";
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());
math_element->oox_convert(Context);
strm << L"</m:e>";
}
strm << L"</m:mr>";
}
......
......@@ -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")
{
......@@ -162,7 +162,7 @@ void math_mo::oox_convert(oox::math_context & Context)
{
// + доп стили текста ... 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")
{
......@@ -203,7 +203,7 @@ void math_mn::oox_convert(oox::math_context & Context)
{
// + доп стили текста ... 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")
{
......
......@@ -128,8 +128,6 @@ void office_body::docx_convert(oox::docx_conversion_context & Context)
if (content_)
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())
{
Context.output_stream() << Context.get_section_context().dump_;
......
......@@ -137,7 +137,7 @@ void table_format_properties::docx_convert(oox::docx_conversion_context & Contex
if (table_align_)
{
std::wstring w_val = L"left";
if (table_align_->get_type() == table_align::Margins)
if (table_align_->get_type() == table_align::Margins || table_align_->get_type() == table_align::Left)
{
if (common_horizontal_margin_attlist_.fo_margin_left_ && common_horizontal_margin_attlist_.fo_margin_right_)
{
......@@ -147,19 +147,15 @@ void table_format_properties::docx_convert(oox::docx_conversion_context & Contex
if (w_val != L"center" && common_horizontal_margin_attlist_.fo_margin_left_ )
{
odf_types::length indent = common_horizontal_margin_attlist_.fo_margin_left_->get_length();
_tblPr << L"<w:tblInd w:w=\"" << indent.get_value_unit(odf_types::length::pt) * 20<< "\" w:type=\"dxa\" />";
_tblPr << L"<w:tblInd w:w=\"" << indent.get_value_unit(odf_types::length::pt) * 20 << "\" w:type=\"dxa\" />";
}
}
else
else //if (table_align_->get_type() == table_align::Center)
w_val = boost::lexical_cast<std::wstring>(*table_align_);
_tblPr << L"<w:jc w:val=\"" << w_val << "\" />";
}
if (table_align_ && table_align_->get_type() == table_align::Center)
{
// TODO ()
}
_tblPr << "<w:tblLayout w:type=\"fixed\" />";
if (common_background_color_attlist_.fo_background_color_)
......
......@@ -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"");
if (w_font.length() < 1)
if (w_font.empty())
{
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_cs = (style_font_name_complex_ ? *style_font_name_complex_: 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_cs = (style_font_name_complex_ ? *style_font_name_complex_ : L"");
fonts_container & fonts = Context.root()->odf_context().fontContainer();
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_cs);
if (font)w_font = font->name();
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_cs);
if (font)
w_font = font->name();
//'Arial' глючит
removeCharsFromString(w_font, _T("'"));
......@@ -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_)
{
fonts_container & fonts = Context.root()->odf_context().fontContainer();
std::wstring w_eastAsia;
std::wstring w_hAnsi;
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 (!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 <<"\" ";
if (style_font_name_complex_)
{
font_instance * font = fonts.font_by_style_name(*style_font_name_complex_);
if (font)
w_cs = font->name();
}
if (style_font_name_asian_)
{
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_;
......@@ -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 fontStyle = process_font_style (fo_font_style_);
const int WCs = process_font_weight (style_font_weight_complex_);
if (graphic)
{
_rPr << L"<a:rPr";
......@@ -1324,19 +1342,33 @@ void text_format_properties_content::oox_convert (std::wostream & _rPr, bool gra
std::wstring w_eastAsia;
std::wstring w_hAnsi;
std::wstring w_cs;
std::wstring w_ascii = w_hAnsi = w_cs = (style_font_name_ ? *style_font_name_: 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 <<"\" ";
std::wstring w_ascii = w_hAnsi = w_cs = (fo_font_family_ ? *fo_font_family_ : L"");
if (style_font_name_complex_)
{
font_instance * font = fonts.font_by_style_name(*style_font_name_complex_);
if (font)
w_cs = font->name();
}
if (style_font_name_asian_)
{
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_;
......
......@@ -69,6 +69,7 @@ namespace cpdoccore {
namespace odf_reader {
class style_instance;
class fonts_container;
// 15.4
class text_format_properties_content : public oox::conversion_element
......@@ -79,7 +80,8 @@ public:
void docx_convert (oox::docx_conversion_context & Context);
void pptx_convert (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_to (std::vector<_property> & properties);
......
......@@ -1134,14 +1134,14 @@ void style_page_layout_properties_attlist::docx_convert_serialize(std::wostream
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: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: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,
{
Context.process_section( CP_XML_STREAM(), columns);
bool next_page = Context.is_next_dump_page_properties();
CP_XML_NODE(L"w:type")
{
if (Context.is_next_dump_page_properties())
{
CP_XML_ATTR(L"w:val", L"nextPage");
}else
{
CP_XML_ATTR(L"w:val", L"continuous");
}
if (next_page) 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();
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)
{
// default???
......@@ -1308,7 +1306,7 @@ void style_page_layout_properties::docx_convert_serialize(std::wostream & strm,
Context.remove_page_properties();
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();
......
......@@ -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)
{
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 =
Context.root()->odf_context().styleContainer().style_by_name(Attr.text_style_name_.style_name(), style_family::Paragraph, Context.process_headers_footers_)
......@@ -180,7 +187,7 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co
Context.end_automatic_style();
Context.push_text_properties(styleContent->get_style_text_properties());
return 1;
return 1;
}
}
else
......@@ -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() );
Context.output_stream() << L"<w:pPr>";
//todooo причесать
if (!Context.get_section_context().dump_.empty() &&
!Context.get_table_context().in_table() &&
(Context.get_process_note() == oox::docx_conversion_context::noNote))
if (!Context.get_section_context().dump_.empty()
&& !Context.get_table_context().in_table()
&& (Context.get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
if (Context.is_paragraph_header() )
{
......@@ -236,9 +244,10 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co
}
}
}
if (!Context.get_section_context().dump_.empty() &&
!Context.get_table_context().in_table() &&
(Context.get_process_note() == oox::docx_conversion_context::noNote))
if (!Context.get_section_context().dump_.empty()
&& !Context.get_table_context().in_table()
&& (Context.get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
Context.output_stream() << L"<w:pPr>";
Context.output_stream() << Context.get_section_context().dump_;
......@@ -361,18 +370,18 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
{
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())
{
drawing = true;
in_drawing = true;
}
bool bIsNewParagraph = true;
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
bIsNewParagraph = false;
......@@ -425,8 +434,6 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
Context.remove_page_properties();
Context.add_page_properties(masterPageNameLayout);
Context.set_page_break(true);
is_empty = false;
}
......@@ -453,7 +460,8 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
if (Context.get_page_break())
{
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);
}
elm->docx_convert(Context);
......@@ -482,7 +490,7 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
is_empty = false;
Context.add_new_run(_T(""));
_Wostream << L"<w:br w:type=\"page\" />";
_Wostream << L"<w:br w:type=\"page\"/>";
Context.finish_run();
}
......@@ -967,9 +975,39 @@ void text_table_index::add_child_element( xml::sax * Reader, const std::wstring
const wchar_t * text_illustration_index::ns = L"text";
const wchar_t * text_illustration_index::name = L"illustration-index";
void text_illustration_index::afterCreate()
{
if (document_context * context = getContext())
{
if (paragraph * lastPar = context->get_last_paragraph())
{
lastPar->set_next_section(true);
}
}
}
void text_illustration_index::afterReadContent()
{
if (document_context * context = getContext())
{
if (paragraph * lastPar = context->get_last_paragraph())
{
lastPar->set_next_end_section(true);
}
}
}
void text_illustration_index::docx_convert(oox::docx_conversion_context & Context)
{
if (text_index_body_)
std::wstring current_page_properties = Context.get_page_properties();
Context.get_section_context().add_section(
text_section_attr_.text_name_,
text_section_attr_.text_style_name_.get_value_or(style_ref()).style_name(),
current_page_properties
);
Context.add_page_properties(current_page_properties);
if (text_index_body_)
text_index_body_->docx_convert(Context);
}
......@@ -997,8 +1035,77 @@ void text_illustration_index::add_child_element( xml::sax * Reader, const std::w
{
CP_CREATE_ELEMENT(text_index_body_);
}
// TODO text-illustration-index-source
// todooo text-illustration-index-source
}
// text:alphabetical-index
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * text_alphabetical_index::ns = L"text";
const wchar_t * text_alphabetical_index::name = L"alphabetical-index";
void text_alphabetical_index::afterCreate()
{
if (document_context * context = getContext())
{
if (paragraph * lastPar = context->get_last_paragraph())
{
lastPar->set_next_section(true);
}
}
}
void text_alphabetical_index::afterReadContent()
{
if (document_context * context = getContext())
{
if (paragraph * lastPar = context->get_last_paragraph())
{
lastPar->set_next_end_section(true);
}
}
}
void text_alphabetical_index::docx_convert(oox::docx_conversion_context & Context)
{
std::wstring current_page_properties = Context.get_page_properties();
Context.get_section_context().add_section(
text_section_attr_.text_name_,
text_section_attr_.text_style_name_.get_value_or(style_ref()).style_name(),
current_page_properties
);
Context.add_page_properties(current_page_properties);
if (text_index_body_)
text_index_body_->docx_convert(Context);
}
void text_alphabetical_index::pptx_convert(oox::pptx_conversion_context & Context)
{
if (text_index_body_)
text_index_body_->pptx_convert(Context);
}
std::wostream & text_alphabetical_index::text_to_stream(std::wostream & _Wostream) const
{
CP_SERIALIZE_TEXT(text_index_body_);
return _Wostream;
}
void text_alphabetical_index::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
text_section_attr_.add_attributes( Attributes );
}
void text_alphabetical_index::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"text", L"index-body")
{
CP_CREATE_ELEMENT(text_index_body_);
}
// todooo text-alphabetical-index-source
}
//--------------------------------------------------------------------------------------------------------
// text:tracked-changes
const wchar_t * text_tracked_changes::ns = L"text";
......
......@@ -360,6 +360,9 @@ public:
static const ElementType type = typeTextIllustrationIndex;
CPDOCCORE_DEFINE_VISITABLE();
virtual void afterCreate();
virtual void afterReadContent();
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context) ;
......@@ -377,6 +380,36 @@ public:
};
CP_REGISTER_OFFICE_ELEMENT2(text_illustration_index);
//---------------------------------------------------------------------------------------------------
class text_alphabetical_index : public text_content_impl<text_alphabetical_index>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextAlphabeticalIndex;
CPDOCCORE_DEFINE_VISITABLE();
virtual void afterCreate();
virtual void afterReadContent();
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context) ;
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
public:
text_section_attr text_section_attr_;
office_element_ptr text_alphabetical_index_source_;
office_element_ptr text_index_body_;
};
CP_REGISTER_OFFICE_ELEMENT2(text_alphabetical_index);
//---------------------------------------------------------------------------------------------------
class text_index_body : public text_content_impl<text_index_body>
......
......@@ -116,7 +116,7 @@ namespace OOX
}
virtual void toXML(NSStringUtils::CStringBuilder& writer) const
{
if(m_oName.IsInit() && m_arrItems.size() > 0)
if(m_oName.IsInit())
{
writer.WriteString(_T("<tableStyle"));
WritingStringNullableAttrEncodeXmlString(L"name", m_oName, m_oName.get());
......@@ -249,4 +249,4 @@ namespace OOX
} //Spreadsheet
} // namespace OOX
#endif // OOX_TABLESTYLES_FILE_INCLUDE_H_
\ No newline at end of file
#endif // OOX_TABLESTYLES_FILE_INCLUDE_H_
......@@ -744,12 +744,11 @@
#define ASC_MENU_EVENT_TYPE_ERROR 500
#define ASC_MENU_EVENT_TYPE_COLOR_SCHEMES 2404 // CAscColorSchemes
#define ASC_MENU_EVENT_TYPE_CHANGE_COLOR_SCHEME 2415 // SET(int)
#define ASC_MENU_EVENT_TYPE_COLOR_SCHEMES 2404 // CAscColorSchemes
#define ASC_MENU_EVENT_TYPE_CHANGE_COLOR_SCHEME 2415 // SET(int)
#define ASC_MENU_EVENT_TYPE_AUTH_PARTICIPANTS_CHANGED 2416
#define ASC_MENU_EVENT_TYPE_LOST_CONNECTION 2420
#define ASC_MENU_EVENT_TYPE_DROP_CONNECTION 2421
#define ASC_COAUTH_EVENT_TYPE_PARTICIPANTS_CHANGED 20101
#define ASC_COAUTH_EVENT_TYPE_LOST_CONNECTION 20102
#define ASC_COAUTH_EVENT_TYPE_DROP_CONNECTION 20103
#endif //_BUILD_EDITOR_DEFINES_CROSSPLATFORM_H_
......@@ -46,7 +46,7 @@
//#define ONLINE_WORD_TO_PDF
//#define TO_PDF
#define TO_HTML_RENDERER
#define ONLY_TEXT
//#define ONLY_TEXT
int main(int argc, char *argv[])
{
......@@ -97,7 +97,7 @@ int main(int argc, char *argv[])
//std::wstring sFile = L"D:\\bankomats.xps";
//std::wstring sFile = L"\\\\kirillov8\\_Office\\DJVU\\Основы разработки приложений на платформе Microsoft .NET Framework. Учебный курс Microsoft экзамен 70-536.djvu";
//std::wstring sFile = L"D:\\TESTFILES\\Алгоритмы - построение и анализ.djvu";
std::wstring sFile = L"D:\\TESTFILES\\PDF 1-7 (756p).pdf";
std::wstring sFile = L"D:\\knopk5_0.pdf";
std::wstring sDst = L"D:\\test\\Document";
//std::wstring sFile = L"/home/oleg/activex/Android intro(2p).pdf";
......@@ -170,5 +170,7 @@ int main(int argc, char *argv[])
oRenderer.SaveToFile(L"/home/oleg/activex/1/1.pdf");
#endif
RELEASEOBJECT(pReader);
return 0;
}
......@@ -13,19 +13,28 @@ ifeq ($(OS),Windows_NT)
endif
else
UNAME_S := $(shell uname -s)
UNAME_P := $(shell uname -p)
ifeq ($(UNAME_S),Linux)
PLATFORM := linux
SHARED_EXT := .so*
SHELL_EXT := .sh
LIB_EXT := .a
MAKE := make -j $(shell grep -c ^processor /proc/cpuinfo)
ifeq ($(UNAME_P),x86_64)
ARCHITECTURE := 64
endif
ifneq ($(filter %86,$(UNAME_P)),)
ARCHITECTURE := 32
endif
endif
UNAME_P := $(shell uname -p)
ifeq ($(UNAME_P),x86_64)
ifeq ($(UNAME_S),Darwin)
PLATFORM := mac
ARCHITECTURE := 64
endif
ifneq ($(filter %86,$(UNAME_P)),)
ARCHITECTURE := 32
SHARED_EXT := .dylib*
SHELL_EXT := .sh
LIB_EXT := .a
MAKE := make -j $(shell sysctl -n hw.ncpu)
endif
endif
......
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