Compare commits

...

19 Commits

Author SHA1 Message Date
c6a05e493f OdfFormatReader - .. 2016-12-01 20:06:19 +03:00
82e82971d0 Changed architecture detection for linux and macos 2016-12-01 18:00:15 +03:00
4b8c2b4f6d Update Makefile 2016-12-01 16:09:25 +03:00
a7e3158c06 Merge branch 'release/v4.2.0' into develop 2016-11-30 16:18:25 +03:00
329077caaf . 2016-11-30 14:20:09 +03:00
807eace056 . 2016-11-30 12:03:55 +03:00
cfdc8c9051 x2t version up 2.0.2.417 2016-11-29 19:39:27 +03:00
da18ecd89c OdfFormatReader - fix same small bags 2016-11-29 19:35:08 +03:00
7ae68b53db OdfFormatReader - fix same small bags 2016-11-29 16:55:22 +03:00
57bd7a0d93 for bug 33110 2016-11-29 16:46:23 +03:00
daba1ad2a3 DocFormatReader - fix bug #33397 2016-11-29 14:38:57 +03:00
755ea97af8 OdfFormatReader - fix same bugs 2016-11-28 19:20:53 +03:00
0f9669aa2b x2t version up 2.0.2.415 2016-11-28 11:07:18 +03:00
71aabb5f3f OdfFormatReader - fix bugs in track changes 2016-11-28 10:19:08 +03:00
18a963231a PPTFormatReader - shape convert fix 2016-11-27 17:09:36 +03:00
e3d6d370f7 Update Makefile 2016-11-26 11:30:39 +03:00
b06681bd97 OdfFormatReader - fix mac build, ... 2016-11-25 18:37:01 +03:00
ab4412155d Switched build sequence for the all target
It done in hope to escape double building the libraries.
2016-11-25 18:13:53 +03:00
f37394db00 OdfFormatReader - fix errors content 2016-11-24 18:29:51 +03:00
53 changed files with 773 additions and 536 deletions

View File

@ -41,7 +41,7 @@
namespace DocFileFormat
{
DocumentMapping::DocumentMapping(ConversionContext* context, IMapping* caller):_skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL), _writeInstrText(false),
DocumentMapping::DocumentMapping(ConversionContext* context, IMapping* caller) : _skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL),
_fldCharCounter(0), AbstractOpenXmlMapping( new XMLTools::CStringXmlWriter() ), _sectionNr(0), _footnoteNr(0),
_endnoteNr(0), _commentNr(0), _caller(caller)
{
@ -53,6 +53,10 @@ namespace DocFileFormat
_writeInstrText = false;
_isSectionPageBreak = 0;
_isTextBoxContent = false;
//--------------------------------------------
_embeddedObject = false;
_writeInstrText = false;
}
DocumentMapping::DocumentMapping(ConversionContext* context, XMLTools::CStringXmlWriter* writer, IMapping* caller):_skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL), _writeInstrText(false),
@ -67,6 +71,7 @@ namespace DocFileFormat
_writeInstrText = false;
_isSectionPageBreak = 0;
_isTextBoxContent = false;
_embeddedObject = false;
}
DocumentMapping::~DocumentMapping()
@ -643,13 +648,13 @@ namespace DocFileFormat
}
cpFieldSep1 = cpFieldSep2;
}
_skipRuns = 5;
_skipRuns = 5; //with separator
}
}
else if ( bEMBED || bLINK || bQUOTE)
{
int cpPic = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::Picture);
int cpFieldSep = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::FieldSeparator);
int cpPic = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::Picture);
int cpFieldSep = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::FieldSeparator);
if (cpPic < cpFieldEnd)
{
@ -731,14 +736,8 @@ namespace DocFileFormat
}
}
if (bEMBED)
{
//Приложения_011015.doc(9 стр) ellipt_eq.doc конфликтные
cp = cpFieldEnd;
_skipRuns = 3;
}
else
_skipRuns = 5;
_skipRuns = 3;
_embeddedObject = true;
}
else
{
@ -759,6 +758,7 @@ namespace DocFileFormat
m_pXmlWriter->WriteString( elem.GetXMLString().c_str() );
}
if (_embeddedObject) _skipRuns += 2;
}
else if (TextMark::FieldEndMark == code)
{
@ -781,6 +781,7 @@ namespace DocFileFormat
{
_writeInstrText = false;
}
_embeddedObject = false;
}
else if ((TextMark::Symbol == code) && fSpec)
{

View File

@ -137,6 +137,7 @@ namespace DocFileFormat
ParagraphPropertyExceptions* _lastValidPapx;
SectionPropertyExceptions* _lastValidSepx;
bool _embeddedObject;
int _skipRuns;
int _sectionNr;
int _footnoteNr;

View File

@ -82,12 +82,15 @@ 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);
docx_context_.set_paragraph_state (bParaStateDocx_);
docx_context_.set_run_state (bRunStateDocx_);
docx_context_.set_delete_text_state (false);
current_state_.content = changes_stream_.str();
docx_context_.set_stream_man(docx_stream_);
docx_context_.set_stream_man (docx_stream_);
}
void text_tracked_context::start_change (std::wstring id)
{
@ -129,29 +132,28 @@ 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),
in_run_ (false),
in_automatic_style_ (false),
in_paragraph_ (false),
in_header_ (false),
in_drawing_content_ (false),
text_tracked_context_ (*this),
table_context_ (*this),
output_document_ (NULL),
section_properties_in_table_(NULL),
process_note_ (noNote),
new_list_style_number_ (0),
is_rtl_ (false),
is_paragraph_keep_ (false),
is_delete_text_ (false),
delayed_converting_ (false),
process_headers_footers_(false),
process_comment_ (false),
math_context_ (false),
odf_document_ (OdfDocument)
next_dump_page_properties_ (false),
page_break_after_ (false),
page_break_before_ (false),
in_run_ (false),
in_automatic_style_ (false),
in_paragraph_ (false),
in_header_ (false),
in_drawing_content_ (false),
text_tracked_context_ (*this),
table_context_ (*this),
output_document_ (NULL),
process_note_ (noNote),
new_list_style_number_ (0),
is_rtl_ (false),
is_paragraph_keep_ (false),
is_delete_text_ (false),
delayed_converting_ (false),
process_headers_footers_ (false),
process_comment_ (false),
mediaitems_ (OdfDocument->get_folder() ),
math_context_ (OdfDocument->odf_context().fontContainer(), false),
odf_document_ (OdfDocument)
{
streams_man_ = streams_man::create(temp_stream_);
applicationFonts_ = new CApplicationFonts();
@ -832,13 +834,19 @@ 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)
{
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 +861,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();
@ -1102,7 +1110,7 @@ void docx_conversion_context::docx_serialize_list_properties(std::wostream & str
void docx_conversion_context::add_delayed_element(odf_reader::office_element * Elm)
{
delayed_elements_.push_back(Elm);
delayed_elements_.push_back(Elm);
}
void docx_conversion_context::docx_convert_delayed()
@ -1110,14 +1118,15 @@ void docx_conversion_context::docx_convert_delayed()
if (delayed_elements_.empty()) return;
if(delayed_converting_)return; //зацикливание иначе
if(get_drawing_context().get_current_level() > 0 )return; //вложенный frame
if(get_drawing_context().get_current_level() > 0 )
return; //вложенный frame
delayed_converting_ = true;
while(!delayed_elements_.empty())
{
odf_reader::office_element * elm = delayed_elements_.front();
elm->docx_convert(*this);
delayed_elements_.pop_front();
delayed_elements_.pop_front();
}
delayed_converting_=false;
}
@ -1128,19 +1137,6 @@ void section_context::add_section(const std::wstring & SectionName, const std::w
sections_.push_back(newSec);
}
void docx_conversion_context::section_properties_in_table(odf_reader::office_element * Elm)
{
section_properties_in_table_ = Elm;
}
odf_reader::office_element * docx_conversion_context::get_section_properties_in_table()
{
odf_reader::office_element * elm = section_properties_in_table_;
section_properties_in_table_ = NULL;
return elm;
}
namespace
{
// обработка Header/Footer
@ -1273,31 +1269,47 @@ typedef std::map<std::wstring, text_tracked_context::_state>::iterator map_chang
void docx_conversion_context::start_text_changes (std::wstring id)
{
text_tracked_context::_state &state = text_tracked_context_.get_tracked_change(id);
if (state.id != id) return;
text_tracked_context::_state &state_add = text_tracked_context_.get_tracked_change(id);
if (state_add.id != id) return;
map_current_changes_.insert(std::pair<std::wstring, text_tracked_context::_state> (id, state));
map_current_changes_.insert(std::pair<std::wstring, text_tracked_context::_state> (id, state_add));
if (in_paragraph_ && (state.type == 1 || state.type == 2))
if (in_paragraph_ && ( state_add.type == 1 || state_add.type == 2 ))
{
finish_run();
if (state.type == 1) output_stream() << L"<w:ins";
if (state.type == 2) output_stream() << L"<w:del";
output_stream() << L" w:date=\"" << state.date << L"\"";
output_stream() << L" w:author=\"" << state.author << L"\"";
output_stream() << L" w:id=\"" << std::to_wstring(current_id_changes++) << L"\"";
output_stream() << L">";
map_changes_iterator it = map_current_changes_.find(id);
text_tracked_context::_state &state = it->second;
if (state.type == 2)
output_stream() << state.content;
std::wstring format_change = L" w:date=\"" + state.date + L"\"" +
L" w:author=\"" + state.author + L"\"" ;
finish_run();
state.active = true;
if (state.type == 1)
{
output_stream() << L"<w:ins" << format_change << L" w:id=\"" << std::to_wstring(current_id_changes++) << L"\">";
}
if (state.type == 2)
{
for (int i = 0 ; i < state.content.size(); i++)
{
output_stream() << L"<w:del" << format_change << L" w:id=\"" << std::to_wstring(current_id_changes++) << L"\">";
output_stream() << state.content[i];
output_stream() << L"</w:del>";
}
map_current_changes_.erase(it);
}
}
}
void docx_conversion_context::start_changes()
{
if (map_current_changes_.empty()) return;
if (process_comment_) return;
text_tracked_context_.dumpPPr_.clear();
text_tracked_context_.dumpRPr_.clear();
@ -1309,8 +1321,8 @@ void docx_conversion_context::start_changes()
{
text_tracked_context::_state &state = it->second;
if (state.type == 0) continue; //unknown change ... todooo
if (state.type == 0) continue; //unknown change ... todooo
if (state.active) continue;
std::wstring change_attr;
change_attr += L" w:date=\"" + state.date + L"\"";
@ -1396,16 +1408,21 @@ void docx_conversion_context::start_changes()
void docx_conversion_context::end_changes()
{
//for (map_changes_iterator it = map_current_changes_.begin(); it != map_current_changes_.end(); it++)
//{
// text_tracked_context::_state &state = it->second;
if (process_comment_) return;
// if (state.type == 0) continue; //unknown change ... libra format change skip
// if (state.type == 3) continue;
for (map_changes_iterator it = map_current_changes_.begin(); it != map_current_changes_.end(); it++)
{
text_tracked_context::_state &state = it->second;
// if (state.type == 1) output_stream() << L"</w:ins>";
// if (state.type == 2) output_stream() << L"</w:del>";
//}
if (state.type == 0) continue; //unknown change ... libra format change skip
if (state.type == 3) continue;
if (!state.active) continue;
if (state.type == 1) output_stream() << L"</w:ins>";
if (state.type == 2) output_stream() << L"</w:del>";
state.active = false;
}
text_tracked_context_.dumpTcPr_.clear();
text_tracked_context_.dumpTblPr_.clear();
@ -1421,14 +1438,15 @@ void docx_conversion_context::end_text_changes (std::wstring id)
if (it == map_current_changes_.end()) return;
if (in_paragraph_)
text_tracked_context::_state &state = it->second;
if (state.active)
{
finish_run();
text_tracked_context::_state &state = it->second;
if (in_paragraph_)
finish_run();
if (state.type == 1) output_stream() << L"</w:ins>";
if (state.type == 2) output_stream() << L"</w:del>";
if (state.type == 1) output_stream() << L"</w:ins>";
if (state.type == 2) output_stream() << L"</w:del>";
}
map_current_changes_.erase(it);

View File

@ -490,13 +490,14 @@ class text_tracked_context
public:
struct _state
{
std::wstring id;
std::wstring author;
std::wstring date;
int type;
std::wstring content; //delete elements
std::wstring style_name;
std::wstring id;
std::wstring author;
std::wstring date;
int type;
std::wstring style_name;
std::vector<std::wstring> content; //delete elements
bool active;
void clear()
{
type = 0;
@ -504,6 +505,7 @@ public:
author.clear();
date.clear();
content.clear();
active = false;
}
};
std::wstring dumpPPr_;
@ -683,9 +685,6 @@ public:
docx_table_context & get_table_context() { return table_context_; }
odf_reader::office_element * get_section_properties_in_table();
void section_properties_in_table (odf_reader::office_element * Elm);
StreamsManPtr get_stream_man() const { return streams_man_; }
void set_stream_man(StreamsManPtr Sm) { streams_man_ = Sm; }
@ -752,23 +751,23 @@ private:
odf_reader::odf_document * odf_document_;
CApplicationFonts * applicationFonts_;
std::vector<odf_reader::_property> settings_properties_;
std::vector<odf_reader::_property> settings_properties_;
hyperlinks hyperlinks_;
mediaitems mediaitems_;
hyperlinks hyperlinks_;
mediaitems mediaitems_;
std::vector<oox_chart_context_ptr> charts_;
headers_footers headers_footers_;
std::wstring automatic_parent_style_;
std::list< const odf_reader::style_text_properties * > text_properties_stack_;
std::wstring automatic_parent_style_;
std::wstring current_master_page_name_;
std::wstring text_list_style_name_;
std::list<std::wstring> list_style_stack_;
bool first_element_list_item_;
bool page_break_after_;
bool page_break_before_;
bool page_break_;
std::wstring text_list_style_name_;
std::list<std::wstring> list_style_stack_;
bool first_element_list_item_;
bool in_automatic_style_;
bool in_drawing_content_;
bool in_paragraph_;
@ -777,25 +776,14 @@ private:
bool is_delete_text_;
bool is_rtl_; // right-to-left
bool is_paragraph_keep_;
NoteType process_note_;
int new_list_style_number_; // счетчик для нумерации имен созданных в процессе конвертации стилей
NoteType process_note_;
std::list<odf_reader::office_element *> delayed_elements_;
std::vector<oox_chart_context_ptr> charts_;
odf_reader::office_element * section_properties_in_table_;
headers_footers headers_footers_;
std::wstring current_master_page_name_;
// счетчик для нумерации имен созданных в процессе конвертации стилей
int new_list_style_number_;
std::map<std::wstring, text_tracked_context::_state> map_current_changes_;
// цепочки переименований нумераций
boost::unordered_map<std::wstring, std::wstring> list_style_renames_;
std::list< const odf_reader::style_text_properties * > text_properties_stack_;
std::map<std::wstring, text_tracked_context::_state> map_current_changes_;
boost::unordered_map<std::wstring, std::wstring> list_style_renames_;// цепочки переименований нумераций
};
}

View File

@ -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")
{
@ -435,7 +435,6 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
CP_XML_ATTR(L"y",0);
}
CP_XML_NODE(L"wp:positionH")
{
std::wstring relativeFrom = L"margin";
@ -453,15 +452,14 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
else
{
CP_XML_NODE(L"wp:posOffset") {CP_XML_STREAM() << val.posOffsetH;}
}
}
}
CP_XML_NODE(L"wp:positionV")
{
std::wstring relativeFrom = L"paragraph";
if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str();
CP_XML_ATTR(L"relativeFrom",relativeFrom);
if (val.styleVerticalPos &&
@ -481,7 +479,6 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
}
}
}
CP_XML_NODE(L"wp:extent")
{
CP_XML_ATTR(L"cx",val.cx);
@ -492,6 +489,39 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
}
docx_serialize_common(CP_XML_STREAM(), val);
if (val.pctWidth)
{
std::wstring relativeFrom = L"margin";
if (val.styleHorizontalRel) relativeFrom =val.styleHorizontalRel->get_type_str();
if (relativeFrom == L"column") relativeFrom = L"margin";
CP_XML_NODE(L"wp14:sizeRelH")
{
CP_XML_ATTR(L"relativeFrom", relativeFrom);
CP_XML_NODE(L"wp14:pctWidth")
{
CP_XML_STREAM() << (val.pctWidth.get() * 1000);
}
}
}
if (val.pctHeight)
{
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")
{
CP_XML_ATTR(L"relativeFrom", relativeFrom);
CP_XML_NODE(L"wp14:pctHeight")
{
CP_XML_STREAM() << (val.pctHeight.get() * 1000);
}
}
}
}
}
}

View File

@ -49,17 +49,18 @@ struct _docx_drawing : _oox_drawing
_docx_drawing():_oox_drawing(), parallel(0), isInline(false), number_wrapped_paragraphs(0), posOffsetV(0), posOffsetH(0)
{
}
unsigned int parallel;
bool isInline;
unsigned int parallel;
//_CP_OPT(run_through) styleRunThrough ;
//_CP_OPT(run_through) styleRunThrough ;
_CP_OPT(odf_types::horizontal_rel) styleHorizontalRel;
_CP_OPT(odf_types::horizontal_pos) styleHorizontalPos;
_CP_OPT(odf_types::vertical_pos) styleVerticalPos;
_CP_OPT(odf_types::vertical_rel) styleVerticalRel;
_CP_OPT(odf_types::style_wrap) styleWrap;
_CP_OPT(odf_types::style_wrap) styleWrap;
bool isInline;
int number_wrapped_paragraphs;
std::wstring relativeHeight;
@ -67,6 +68,9 @@ struct _docx_drawing : _oox_drawing
int posOffsetV;
int posOffsetH;
_CP_OPT(int) pctWidth;
_CP_OPT(int) pctHeight;
int margin_rect[4];//0-left, 1 -top, 2- right, 3 - bottom
//std::wstring distB;

View File

@ -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;

View File

@ -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_;

View File

@ -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;

View File

@ -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_;

View File

@ -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")
{

View File

@ -61,18 +61,21 @@ static void ConvertSvmToImage(std::wstring &file_svm, std::wstring &file_png, CA
static std::wstring get_mime_type(const std::wstring & extension)
{
if (L"eps" == extension) return L"image/x-eps";
if (L"wmf" == extension) return L"image/x-wmf";
if (L"emf" == extension) return L"image/x-emf";
if (L"gif" == extension) return L"image/x-gif";
if (L"png" == extension) return L"image/x-png";
if (L"jpg" == extension) return L"image/x-jpeg";
if (L"jpeg" == extension) return L"image/x-jpeg";
if (L"tiff" == extension) return L"image/x-tiff";
if (L"pdf" == extension) return L"application/pdf";
if (L"wav" == extension) return L"audio/wav";
if (L"bin" == extension) return L"application/vnd.openxmlformats-officedocument.oleObject";
if (L"xlsx" == extension) return L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
if (L"eps" == extension) return L"image/x-eps";
else if (L"wmf" == extension) return L"image/x-wmf";
else if (L"emf" == extension) return L"image/x-emf";
else if (L"gif" == extension) return L"image/x-gif";
else if (L"png" == extension) return L"image/x-png";
else if (L"jpg" == extension) return L"image/x-jpeg";
else if (L"jpeg" == extension) return L"image/x-jpeg";
else if (L"tif" == extension) return L"image/x-tiff";
else if (L"tiff" == extension) return L"image/x-tiff";
else if (L"pdf" == extension) return L"application/pdf";
else if (L"wav" == extension) return L"audio/wav";
else if (L"bin" == extension) return L"application/vnd.openxmlformats-officedocument.oleObject";
else if (L"xlsx" == extension) return L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
else return L"application/octet-stream";
return L"";
}

View File

@ -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();
}

View File

@ -89,11 +89,14 @@ void pptx_xml_slide::write_to(std::wostream & strm)
{
CP_XML_NODE(L"p:sld")
{
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_NODE(L"p:cSld")
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:p14", L"http://schemas.microsoft.com/office/powerpoint/2010/main");
CP_XML_ATTR(L"xmlns:p15", L"http://schemas.microsoft.com/office/powerpoint/2012/main");
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
CP_XML_NODE(L"p:cSld")
{
CP_XML_ATTR(L"name", name());
@ -147,15 +150,19 @@ void pptx_xml_slideLayout::write_to(std::wostream & strm)
{
CP_XML_NODE(L"p:sldLayout")
{
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:p14", L"http://schemas.microsoft.com/office/powerpoint/2010/main");
CP_XML_ATTR(L"xmlns:p15", L"http://schemas.microsoft.com/office/powerpoint/2012/main");
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
//if (slideLayoutData_.str().length()<0)
// CP_XML_ATTR(L"type",L"cust");//---------------------------!!!!!!!!!!!!
//else
// CP_XML_ATTR(L"type",L"cust");
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_NODE(L"p:cSld")
// CP_XML_ATTR(L"type",L"cust");
CP_XML_NODE(L"p:cSld")
{
CP_XML_NODE(L"p:spTree")
{
@ -239,9 +246,12 @@ void pptx_xml_slideMaster::write_to(std::wostream & strm)
{
CP_XML_NODE(L"p:sldMaster")
{
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_ATTR(L"xmlns:p", L"http://schemas.openxmlformats.org/presentationml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:p14", L"http://schemas.microsoft.com/office/powerpoint/2010/main");
CP_XML_ATTR(L"xmlns:p15", L"http://schemas.microsoft.com/office/powerpoint/2012/main");
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
CP_XML_NODE(L"p:cSld")
{

View File

@ -363,19 +363,20 @@ void pptx_text_context::Impl::write_pPr(std::wostream & strm)
odf_reader::paragraph_format_properties paragraph_properties_;
ApplyParagraphProperties (paragraph_style_name_, paragraph_properties_,odf_types::style_family::Paragraph);
ApplyListProperties (paragraph_properties_,level);//выравнивания листа накатим на свойства параграфа
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.length()<1) return;
if (level < 0 && paragraphAttr.length() < 1 && !paragraphNodes.empty()) return;
strm << L"<a:pPr ";
if (level>=0)
if (level >= 0)
{
if (level > 8) level = 0;
strm << L"lvl=\"" << level << L"\" ";
}
@ -384,7 +385,7 @@ void pptx_text_context::Impl::write_pPr(std::wostream & strm)
strm << ">";
strm << paragraphNodes;
if (level >=0 )
if (level >= 0 )
{

View File

@ -223,7 +223,7 @@ public:
const std::pair<int, double> c = cols_.search (x_pt);
const std::pair<int, double> r = rows_.search (y_pt);
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
return res;
}
@ -236,7 +236,7 @@ public:
r = rows_.search(offset_row, y_pt);
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
return res;
}
@ -246,7 +246,7 @@ public:
std::pair<int, double> r = rows_.search (last_row, 0);
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
return res;
}

View File

@ -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) ),

View File

@ -533,8 +533,9 @@ void common_draw_rel_size_attlist::apply_from(const common_draw_rel_size_attlist
void common_draw_rel_size_attlist::serialize(CP_ATTR_NODE)
{
common_draw_size_attlist_.serialize(CP_GET_XML_NODE());
CP_XML_ATTR_OPT(L"style:rel-width", style_rel_width_);
CP_XML_ATTR_OPT(L"style:rel-height", style_rel_height_);
CP_XML_ATTR_OPT(L"style:rel-width", style_rel_width_);
CP_XML_ATTR_OPT(L"style:rel-height", style_rel_height_);
}
//////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -443,10 +443,10 @@ public:
void apply_from(const common_draw_rel_size_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
common_draw_size_attlist common_draw_size_attlist_;
_CP_OPT(percent_or_scale) style_rel_width_;
_CP_OPT(percent_or_scale) style_rel_height_;
common_draw_size_attlist common_draw_size_attlist_;
_CP_OPT(percent_or_scale) style_rel_width_;
_CP_OPT(percent_or_scale) style_rel_height_;
};
/// common-vertical-rel-attlist

View File

@ -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 },
@ -185,6 +186,7 @@ static const _shape_converter _OO_OOX_custom_shapes[]=
{L"mso-spt179" ,L"" ,0 ,0 ,0 },
{L"mso-spt180" ,L"" ,0 ,0 ,0 },
{L"mso-spt182" ,L"leftRightUpArrow" ,0 ,0 ,0 },
{L"mso-spt188" ,L"flowChartPunchedTape",0 ,0 ,0 },
{L"mso-spt189" ,L"actionButtonBlank" ,0 ,0 ,0 },
{L"mso-spt190" ,L"actionButtonHome" ,0 ,0 ,0 },
{L"mso-spt191" ,L"actionButtonHelp" ,0 ,0 ,0 },
@ -284,7 +286,7 @@ static const _shape_converter _OO_OOX_wordart[]=
{L"fontwork-triangle-up" ,L"textTriangle" ,0 ,0 ,0 },
{L"fontwork-triangle-down" ,L"textTriangleInverted" ,0 ,0 ,0 },
{L"fontwork-circle-pour" ,L"textCirclePour" ,0 ,0 ,0 },
{L"fontwork-circle-pour" ,L"textCirclePour" ,0 ,0 ,0 },
{L"fontwork-circle-curve" ,L"textCircle" ,0 ,0 ,0 },
{L"fontwork-open-circle-curve" ,L"textPlain" ,1 ,30000 , 70000 },
{L"fontwork-open-circle-pour" ,L"textPlain" ,1 ,30000 , 70000 },
@ -296,18 +298,18 @@ static const _shape_converter _OO_OOX_wordart[]=
{L"mso-spt142" ,L"textRingInside" ,0 ,0 ,0 },
{L"mso-spt143" ,L"textRingOutside" ,0 ,0 ,0 },
{L"mso-spt157" ,L"textWave2" ,0 ,0 ,0 },
{L"mso-spt157" ,L"textWave2" ,0 ,0 ,0 },
{L"mso-spt158" ,L"textDoubleWave1" ,0 ,0 ,0 },
{L"mso-spt159" ,L"textWave4" ,0 ,0 ,0 },
{L"mso-spt160" ,L"textInflate" ,0 ,0 ,0 },//???
{L"mso-spt161" ,L"textDeflate" ,0 ,0 ,0 },
{L"mso-spt159" ,L"textWave4" ,0 ,0 ,0 },
{L"mso-spt160" ,L"textInflate" ,0 ,0 ,0 },//???
{L"mso-spt161" ,L"textDeflate" ,0 ,0 ,0 },
{L"mso-spt162" ,L"textInflateBottom" ,0 ,0 ,0 },
{L"mso-spt163" ,L"textDeflateBottom" ,0 ,0 ,0 },
{L"mso-spt164" ,L"textInflateTop" ,0 ,0 ,0 },
{L"mso-spt165" ,L"textDeflateTop" ,0 ,0 ,0 },
{L"mso-spt166" ,L"textDeflateInflateDeflate" ,0 ,0 ,0 },
{L"mso-spt174" ,L"textCanUp" ,0 ,0 ,0 },
{L"mso-spt175" ,L"textCanDown" ,0 ,0 ,0 },
{L"mso-spt174" ,L"textCanUp" ,0 ,0 ,0 },
{L"mso-spt175" ,L"textCanDown" ,0 ,0 ,0 },
{L"mso-spt188" ,L"textDoubleWave1" ,0 ,0 ,0 },
};

View File

@ -31,12 +31,11 @@
*/
#include "length.h"
#include "../../../../Common/DocxFormat/Source/Base/Types_32.h"
#include <iostream>
#include <sstream>
#include <boost/lexical_cast.hpp>
namespace cpdoccore { namespace odf_types {
std::wostream & operator << (std::wostream & _Wostream, const length::unit _Unit)
@ -223,9 +222,9 @@ double to_pt(const length & Val)
return 0.0;
}
int pt_to_emu(double Val)
_INT64 pt_to_emu(double Val)
{
return static_cast<int>(Val * 360000 * 2.54) / 72;
return static_cast<_INT64>(Val * 360000 * 2.54) / 72;
}
}

View File

@ -855,7 +855,6 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
drawing. behindDoc = L"1";
}
drawing.margin_rect[0] = GetMargin(graphicProperties, sideLeft);
drawing.margin_rect[1] = GetMargin(graphicProperties, sideTop);
drawing.margin_rect[2] = GetMargin(graphicProperties, sideRight);
@ -864,6 +863,17 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
drawing.posOffsetH = ComputeMarginX(pagePropertiesNode, pageProperties, attlists_, graphicProperties, drawing.additional);
drawing.posOffsetV = ComputeMarginY( pageProperties, attlists_, graphicProperties, drawing.additional);
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();
}
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();
}
}
drawing.number_wrapped_paragraphs=graphicProperties.style_number_wrapped_paragraphs_.
get_value_or( integer_or_nolimit( integer_or_nolimit::NoLimit) ).get_value();
@ -998,7 +1008,7 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
}
void draw_shape::docx_convert(oox::docx_conversion_context & Context)
{
/////...../////
//--------------------------------------------------------------------------------------------------
oox::_docx_drawing drawing = oox::_docx_drawing();
@ -1016,10 +1026,17 @@ void draw_shape::docx_convert(oox::docx_conversion_context & Context)
}
Context.get_drawing_context().clear_stream_shape();
/////////
common_draw_docx_convert(Context, common_draw_attlists_, drawing);
/////////
if (bad_shape_ && drawing.fill.bitmap) // CV_Kucheruk_Maria(rus).odt - картинка по дебильному
{
drawing.sub_type = 1;
bad_shape_ = false;
}
if (drawing.fill.type < 1 && !IsExistProperty(drawing.additional,L"stroke"))//бывает что и не определено ничего
{
drawing.fill.solid = oox::oox_solid_fill::create();
@ -1027,6 +1044,12 @@ void draw_shape::docx_convert(oox::docx_conversion_context & Context)
drawing.fill.type = 1;
}
if (bad_shape_)
{
Context.get_drawing_context().stop_shape();
return;
}
std::wostream & strm = Context.output_stream();
bool pState = Context.get_paragraph_state();
@ -1170,13 +1193,6 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
{
// if (Context.get_drawing_context().get_current_level() > 1 )
//{
// if(Context.delayed_converting_ == false)
// Context.add_delayed_element(Context.get_drawing_context().get_current_frame());
// return;
//}
//тут может быть не только текст , но и таблицы, другие объекты ...
oox::StreamsManPtr prev = Context.get_stream_man();
@ -1185,11 +1201,11 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
bool pState = Context.get_paragraph_state ();
bool runState = Context.get_run_state ();
bool keepState = Context.get_paragraph_keep ();
Context.set_run_state (false);
Context.set_paragraph_state (false);
bool drState = Context.get_drawing_state_content();
Context.set_drawing_state_content(true);
@ -1205,6 +1221,7 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
Context.set_run_state (runState);
Context.set_paragraph_state (pState);
Context.set_drawing_state_content (drState);
Context.set_paragraph_keep (keepState);
/////...../////
@ -1229,6 +1246,7 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
//+ локальные
bool auto_fit_text = false;
bool auto_fit_shape = false;
if (!draw_text_box_attlist_.fo_min_height_) draw_text_box_attlist_.fo_min_height_ = frame->draw_frame_attlist_.fo_min_height_;
if (!draw_text_box_attlist_.fo_min_width_) draw_text_box_attlist_.fo_min_width_ = frame->draw_frame_attlist_.fo_min_width_;
@ -1238,19 +1256,25 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
size_t min_y = get_value_emu(draw_text_box_attlist_.fo_min_height_->get_length());
if (drawing.cy < min_y)
{
drawing.cy = min_y;
auto_fit_text = true;
drawing.cy = min_y;
}
if (drawing.cy < 36000) auto_fit_shape = true;
}
if ((draw_text_box_attlist_.fo_min_width_) && (draw_text_box_attlist_.fo_min_width_->get_type()==length_or_percent::Length))
{
size_t min_x = get_value_emu(draw_text_box_attlist_.fo_min_width_->get_length());
if (drawing.cx < min_x)
{
drawing.cx = min_x;
auto_fit_text = true;
drawing.cx = min_x;
}
if (drawing.cx < 36000) auto_fit_shape = true;
}
if ((draw_text_box_attlist_.fo_max_height_) && (draw_text_box_attlist_.fo_max_height_->get_type()==length_or_percent::Length))
{
size_t max_y = get_value_emu(draw_text_box_attlist_.fo_max_height_->get_length());
@ -1261,9 +1285,15 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
size_t max_x = get_value_emu(draw_text_box_attlist_.fo_max_width_->get_length());
if (drawing.cx > max_x) drawing.cy = max_x;
}
if (auto_fit_text)
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));
///////////////////////////////////////////////////////////////////
std::wostream & strm = Context.output_stream();
@ -1277,6 +1307,7 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
Context.set_paragraph_keep(true);
pState = Context.get_paragraph_state();
}
keepState = Context.get_paragraph_keep();
Context.set_paragraph_state(false);
@ -1288,7 +1319,8 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
if (!Context.get_drawing_context().in_group())
Context.finish_run();
Context.set_paragraph_state(pState);
Context.set_paragraph_state (pState);
Context.set_paragraph_keep (keepState);
}
void draw_g::docx_convert(oox::docx_conversion_context & Context)
{
@ -1406,7 +1438,6 @@ void draw_g::docx_convert(oox::docx_conversion_context & Context)
}
void draw_frame::docx_convert(oox::docx_conversion_context & Context)
{
//if ((!Context.get_paragraph_state() && !Context.get_drawing_context().in_group()) && !Context.delayed_converting_)
if (Context.get_drawing_context().get_current_level() > 0 && !Context.get_drawing_context().in_group() )
{
Context.add_delayed_element(this);

View File

@ -109,8 +109,8 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context)
double x_pt = common_draw_attlists_.position_.svg_x_.get_value_or(length(0)).get_value_unit(length::pt);
double y_pt = common_draw_attlists_.position_.svg_y_.get_value_or(length(0)).get_value_unit(length::pt);
if (x_pt <0) x_pt =0;
if (y_pt <0) y_pt =0;
if (x_pt < 0) x_pt =0;
if (y_pt < 0) y_pt =0;
Context.get_slide_context().set_rect(width_pt, height_pt, x_pt, y_pt);
}

View File

@ -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;
@ -467,8 +479,6 @@ void draw_enhanced_geometry::add_child_element( xml::sax * Reader, const std::ws
}
void draw_enhanced_geometry::find_draw_type_oox()
{
word_art_ = false;
if (draw_enhanced_geometry_attlist_.draw_text_path_ &&
*draw_enhanced_geometry_attlist_.draw_text_path_ == true)
{
@ -489,12 +499,13 @@ void draw_enhanced_geometry::find_draw_type_oox()
{
if (_OO_OOX_wordart[i].odf_reader == odf_type)
{
word_art_ = true;
draw_type_oox_index_ = i;
break;
}
}
}
else
if (!draw_type_oox_index_)
{
int count = sizeof(_OO_OOX_custom_shapes) / sizeof(_shape_converter);
int pos = odf_type.find(L"ooxml-");
@ -546,7 +557,7 @@ void draw_enhanced_geometry::find_draw_type_oox()
catch(...)
{
}
if (min <0 ) min=0;
if (min < 0 ) min=0;
try
{
@ -602,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;

View File

@ -65,6 +65,8 @@ public:
static const ElementType type = typeDrawShape;
static const xml::NodeType xml_type = xml::typeElement;
draw_shape() : bad_shape_(false), word_art_(false) {}
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);
@ -87,6 +89,7 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
friend class odf_document;
//----------------------------------------------------------------------------------------------
bool bad_shape_;
bool word_art_;
int sub_type_;
std::vector<odf_reader::_property> additional_;

View File

@ -60,8 +60,6 @@ namespace cpdoccore {
namespace odf_reader {
void draw_shape::common_docx_convert(oox::docx_conversion_context & Context)
{
Context.get_drawing_context().start_shape(this);
@ -115,7 +113,6 @@ void draw_shape::common_docx_convert(oox::docx_conversion_context & Context)
}
void draw_rect::docx_convert(oox::docx_conversion_context & Context)
{
//if (Context.get_drawing_context().get_current_level() >0 )return;
if (Context.get_drawing_context().get_current_level() > 0 && !Context.get_drawing_context().in_group() )
{
if(Context.delayed_converting_ == false)
@ -245,17 +242,21 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
shape->word_art_ = word_art_;
bool set_shape = false;
if (draw_type_oox_index_)
{
shape->additional_.push_back(_property(L"odf-custom-draw-index", draw_type_oox_index_.get()));
if (shape->word_art_ == true)
shape->additional_.push_back(_property(L"wordArt", true));
shape->additional_.push_back(_property(L"wordArt", true));
set_shape = true;
}
if (sub_type_)
{
shape->sub_type_ = sub_type_.get();
set_shape = true;
}
if (draw_enhanced_geometry_attlist_.draw_enhanced_path_)
@ -279,6 +280,8 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
std::wstringstream output_;
svg_path::oox_serialize(output_, o_Polyline);
shape->additional_.push_back(odf_reader::_property(L"custom_path", output_.str()));
set_shape = true;
if (draw_enhanced_geometry_attlist_.drawooo_sub_view_size_)
{
@ -303,12 +306,9 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
}
}
}
else if (!draw_type_oox_index_)
{
draw_type_oox_index_ = 0;
}
}
else if (draw_enhanced_geometry_attlist_.draw_modifiers_)
if (draw_enhanced_geometry_attlist_.draw_modifiers_)
{
shape->additional_.push_back(_property(L"draw-modifiers",draw_enhanced_geometry_attlist_.draw_modifiers_.get()));
if (draw_handle_geometry_.size()>0)
@ -320,6 +320,12 @@ void draw_enhanced_geometry::docx_convert(oox::docx_conversion_context & Context
}
}
}
if (!set_shape)
{
shape->bad_shape_ = true;
}
}
}
}

View File

@ -166,8 +166,6 @@ void draw_shape::common_pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().set_property(_property(L"text-content",text_content_));
}
//Context.get_slide_context().end_drawing();
}
void draw_rect::pptx_convert(oox::pptx_conversion_context & Context)
{
@ -304,6 +302,8 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
{
find_draw_type_oox();
bool set_shape = false;
if (draw_type_oox_index_)
{
Context.get_slide_context().set_property(_property(L"odf-custom-draw-index", draw_type_oox_index_.get()));
@ -311,10 +311,12 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
if (word_art_ == true)
Context.get_slide_context().set_property(_property(L"wordArt", true));
set_shape = true;
}
if (sub_type_)
{
Context.get_slide_context().start_shape(sub_type_.get());
set_shape = true;
}
if (draw_enhanced_geometry_attlist_.draw_enhanced_path_)
@ -339,6 +341,8 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
svg_path::oox_serialize(output_, o_Polyline);
Context.get_slide_context().set_property(odf_reader::_property(L"custom_path", output_.str()));
set_shape = true;
if (draw_enhanced_geometry_attlist_.drawooo_sub_view_size_)
{
std::vector< std::wstring > splitted;
@ -362,10 +366,6 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
}
}
}
else if (!draw_type_oox_index_)
{
draw_type_oox_index_ = 0;
}
}
if (draw_enhanced_geometry_attlist_.draw_modifiers_)
{
@ -380,6 +380,10 @@ void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context
}
}
}
if (!set_shape)
{
Context.get_slide_context().start_shape(1); //restart type shape
}
}
}
}

View File

@ -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_);
}
}
}

View File

@ -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>";
}

View File

@ -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")
{

View File

@ -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_;

View File

@ -147,6 +147,14 @@ void office_text::pptx_convert(oox::pptx_conversion_context & Context)
const wchar_t * office_change_info::ns = L"office";
const wchar_t * office_change_info::name = L"change-info";
void office_change_info::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
int count = Attributes->size();
CP_APPLY_ATTR(L"office:chg-author", office_chg_author_);
CP_APPLY_ATTR(L"office:chg-date-time", office_chg_date_time_);
}
void office_change_info::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"dc", L"date")
@ -165,14 +173,23 @@ void office_change_info::docx_convert(oox::docx_conversion_context & Context)
{
std::wstring date;
std::wstring author;
if (dc_date_)
{
date = xml::utils::replace_text_to_xml(dynamic_cast<dc_date * >(dc_date_.get())->content_);
}
else if (office_chg_date_time_)
{
date = *office_chg_date_time_;
}
if (dc_creator_)
{
author = xml::utils::replace_text_to_xml(dynamic_cast<dc_creator * >(dc_creator_.get())->content_);
}
else if (office_chg_author_)
{
author = *office_chg_author_;
}
Context.get_text_tracked_context().set_user_info(author, date);
}

View File

@ -88,11 +88,14 @@ public:
virtual void docx_convert(oox::docx_conversion_context & Context) ;
private:
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes ){}
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);
office_element_ptr dc_date_;
office_element_ptr dc_creator_;
_CP_OPT(std::wstring) office_chg_author_;
_CP_OPT(std::wstring) office_chg_date_time_;
};
CP_REGISTER_OFFICE_ELEMENT2(office_change_info)

View File

@ -332,7 +332,7 @@ const wchar_t * span::name = L"span";
std::wostream & span::text_to_stream(std::wostream & _Wostream) const
{
BOOST_FOREACH(const office_element_ptr & parElement, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & parElement, content_)
{
parElement->text_to_stream(_Wostream);
}
@ -359,13 +359,13 @@ void span::add_attributes( const xml::attributes_wc_ptr & Attributes )
void span::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(paragraph_content_);
CP_CREATE_ELEMENT(content_);
}
void span::add_text(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text);
paragraph_content_.push_back( elm );
content_.push_back( elm );
}
void span::docx_convert(oox::docx_conversion_context & Context)
@ -406,7 +406,7 @@ void span::docx_convert(oox::docx_conversion_context & Context)
if (!addNewRun)Context.add_new_run();
BOOST_FOREACH(const office_element_ptr & parElement, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & parElement, content_)
{
parElement->docx_convert(Context);
}
@ -420,7 +420,7 @@ void span::docx_convert(oox::docx_conversion_context & Context)
void span::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.start_span(text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
elm->xlsx_convert(Context);
}
@ -432,7 +432,7 @@ void span::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_text_context().get_styles_context().start_process_style(styleInst);
Context.get_text_context().start_span(text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
elm->pptx_convert(Context);
}
@ -446,7 +446,7 @@ const wchar_t * a::name = L"a";
std::wostream & a::text_to_stream(std::wostream & _Wostream) const
{
BOOST_FOREACH(const office_element_ptr & element, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & element, content_)
{
element->text_to_stream(_Wostream);
}
@ -465,13 +465,13 @@ void a::add_attributes( const xml::attributes_wc_ptr & Attributes )
void a::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(paragraph_content_);
CP_CREATE_ELEMENT(content_);
}
void a::add_text(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text) ;
paragraph_content_.push_back( elm );
content_.push_back( elm );
}
void a::docx_convert(oox::docx_conversion_context & Context)
@ -527,7 +527,7 @@ void a::docx_convert(oox::docx_conversion_context & Context)
if (!addNewRun)
Context.add_new_run();
BOOST_FOREACH(const office_element_ptr & parElement, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & parElement, content_)
{
parElement->docx_convert(Context);
}
@ -542,7 +542,7 @@ void a::docx_convert(oox::docx_conversion_context & Context)
void a::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.start_hyperlink(text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
elm->xlsx_convert(Context);
}
@ -551,7 +551,7 @@ void a::xlsx_convert(oox::xlsx_conversion_context & Context)
void a::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_text_context().start_hyperlink();
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
elm->pptx_convert(Context);
}

View File

@ -378,7 +378,7 @@ public:
span() {}
office_element_ptr_array paragraph_content_;
office_element_ptr_array content_;
odf_types::style_ref text_style_name_;
odf_types::style_ref_array text_class_names_;
@ -424,7 +424,7 @@ private:
odf_types::style_ref text_style_name_;
odf_types::style_ref text_visited_style_name_;
office_element_ptr_array paragraph_content_;
office_element_ptr_array content_;
};
CP_REGISTER_OFFICE_ELEMENT2(a);

View File

@ -55,7 +55,7 @@ const wchar_t * ruby_base::name = L"ruby-base";
std::wostream & ruby_base::text_to_stream(std::wostream & _Wostream) const
{
serialize_elements_text(_Wostream, paragraph_content_);
serialize_elements_text(_Wostream, content_);
return _Wostream;
}
@ -65,13 +65,13 @@ void ruby_base::add_attributes( const xml::attributes_wc_ptr & Attributes )
void ruby_base::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(paragraph_content_);
CP_CREATE_ELEMENT(content_);
}
void ruby_base::add_text(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text) ;
paragraph_content_.push_back( elm );
content_.push_back( elm );
}
// text:ruby-text

View File

@ -64,7 +64,7 @@ private:
virtual void add_text(const std::wstring & Text);
private:
office_element_ptr_array paragraph_content_;
office_element_ptr_array content_;
};
@ -94,8 +94,8 @@ private:
virtual void add_text(const std::wstring & Text);
private:
odf_types::style_ref text_style_name_;
office_element_ptr_array content_;
odf_types::style_ref text_style_name_;
office_element_ptr_array content_;
};

View File

@ -276,25 +276,6 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co
{
std::wstringstream & _pPr = Context.get_text_context().get_styles_context().paragraph_attr();
//сначала аттрибуты к самому pPr или defPPr
if (fo_text_align_)
{
std::wstring jc;
switch(fo_text_align_->get_type())
{
case text_align::Start:
case text_align::Left:
jc = L"l"; break;
case text_align::End:
case text_align::Right:
jc = L"r"; break;
case text_align::Center:
jc = L"ctr"; break;
case text_align::Justify:
jc = L"just"; break;
}
if (jc.length()>0) _pPr << L"algn=\"" << jc << "\" ";
}
if (fo_margin_left_ || fo_margin_right_ || fo_text_indent_ )
{
// TODO auto indent
@ -315,6 +296,26 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co
if (!w_firstLine.empty())
_pPr << L"indent=\"" << w_firstLine << "\" ";
}
if (fo_text_align_)
{
std::wstring jc;
switch(fo_text_align_->get_type())
{
case text_align::Start:
case text_align::Left:
jc = L"l"; break;
case text_align::End:
case text_align::Right:
jc = L"r"; break;
case text_align::Center:
jc = L"ctr"; break;
case text_align::Justify:
jc = L"just"; break;
}
if (jc.length()>0) _pPr << L"algn=\"" << jc << "\" ";
}
if (style_vertical_align_)
{
std::wstring w_val;
@ -329,7 +330,6 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co
if (!w_val.empty())
_pPr << L"fontAlgn=\"" << w_val << "\" ";
}
//if (style_writing_mode_)
//{

View File

@ -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("'"));
@ -343,7 +345,18 @@ void text_format_properties_content::pptx_convert(oox::pptx_conversion_context &
CP_XML_ATTR(L"cap", "small");
}
}
// underline
if (fo_text_transform_)
{
if (fo_text_transform_->get_type() == text_transform::Uppercase)
{
CP_XML_ATTR(L"cap", "all");
}
else if (fo_text_transform_->get_type() == text_transform::Lowercase)
{
CP_XML_ATTR(L"cap", "small");
}
}
// underline
line_width under = style_text_underline_width_.get_value_or(line_width::Auto);
bool underlineBold = under.get_type() == line_width::Bold ||
under.get_type() == line_width::Thick;
@ -363,7 +376,7 @@ void text_format_properties_content::pptx_convert(oox::pptx_conversion_context &
switch (style_text_underline_type_->get_type())
{
case line_type::Single: underline = L"sng"; break;
case line_type::Double: underline = L"double"; break;
case line_type::Double: underline = L"dbl"; break;
}
}
else if (style_text_underline_style_)
@ -397,8 +410,8 @@ void text_format_properties_content::pptx_convert(oox::pptx_conversion_context &
case line_style::Wave:
if (underlineBold) underline = L"wavyHeavy";
else if (style_text_underline_type_.get_value_or( line_type(line_type::Single) ).get_type() == line_type::Double)
underline = L"wavyDouble";
else underline = L"wave";
underline = L"wavyDbl";
else underline = L"wavy";
break;
}
}
@ -425,10 +438,10 @@ void text_format_properties_content::pptx_convert(oox::pptx_conversion_context &
if (fo_language_ || style_language_asian_ || style_language_complex_)
{
std::wstring w_val;
if (fo_language_) w_val = *fo_language_;
else if (fo_country_) w_val = *fo_country_;
else if (style_country_asian_)w_val = *style_country_asian_;
else if (style_language_asian_)w_val = *style_language_asian_;
if (fo_language_) w_val = *fo_language_;
else if (fo_country_) w_val = *fo_country_;
else if (style_country_asian_) w_val = *style_country_asian_;
else if (style_language_asian_) w_val = *style_language_asian_;
else if (style_language_complex_)w_val = *style_language_complex_;
else if (style_country_complex_)w_val = *style_country_complex_;
@ -619,7 +632,7 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context &
underline = L"single";
break;
case line_type::Double:
underline = L"double";
underline = L"dbl";
break;
}
}
@ -666,9 +679,9 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context &
if (underlineBold)
underline = L"wavyHeavy";
else if (style_text_underline_type_.get_value_or( line_type(line_type::Single) ).get_type() == line_type::Double)
underline = L"wavyDouble";
underline = L"wavyDbl";
else
underline = L"wave";
underline = L"wavy";
break;
}
}
@ -841,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_;
@ -963,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";
@ -1109,7 +1138,7 @@ void text_format_properties_content::oox_convert (std::wostream & _rPr, bool gra
underline = L"single";
break;
case line_type::Double:
underline = L"double";
underline = L"dbl";
break;
}
}
@ -1156,9 +1185,9 @@ void text_format_properties_content::oox_convert (std::wostream & _rPr, bool gra
if (underlineBold)
underline = L"wavyHeavy";
else if (style_text_underline_type_.get_value_or( line_type(line_type::Single) ).get_type() == line_type::Double)
underline = L"wavyDouble";
underline = L"wavyDbl";
else
underline = L"wave";
underline = L"wavy";
break;
}
}
@ -1313,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"");
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"<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" />";
_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_;

View File

@ -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);

View File

@ -747,11 +747,11 @@ const wchar_t * style_column::name = L"column";
void style_column::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:rel-width", style_rel_width_);
CP_APPLY_ATTR(L"fo:start-indent", fo_start_indent_, length(0.0, length::cm));
CP_APPLY_ATTR(L"fo:end-indent", fo_end_indent_, length(0.0, length::cm));
CP_APPLY_ATTR(L"fo:space-before", fo_space_before_, length(0.0, length::cm));
CP_APPLY_ATTR(L"fo:space-after", fo_space_after_, length(0.0, length::cm));
CP_APPLY_ATTR(L"style:rel-width", style_rel_width_);
CP_APPLY_ATTR(L"fo:start-indent", fo_start_indent_, length(0.0, length::cm));
CP_APPLY_ATTR(L"fo:end-indent", fo_end_indent_, length(0.0, length::cm));
CP_APPLY_ATTR(L"fo:space-before", fo_space_before_, length(0.0, length::cm));
CP_APPLY_ATTR(L"fo:space-after", fo_space_after_, length(0.0, length::cm));
}
@ -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 );
}
}
@ -1177,20 +1177,23 @@ void style_page_layout_properties_attlist::pptx_convert(oox::pptx_conversion_con
if (fo_page_width_ || fo_page_height_ || style_print_orientation_)
{
std::wstring w_w = L"",w_h = L"";
std::wstring w_w, w_h;
int h=0,w=0;
_INT64 h = 0, w = 0;
if (fo_page_width_)
{
w = fo_page_width_->get_value_unit(length::emu);
if (w < 914400) w = 914400;
w_w = boost::lexical_cast<std::wstring>(w);
w_w = std::to_wstring(w);
}
if (fo_page_height_)
{
h = fo_page_height_->get_value_unit(length::emu);
w_h = boost::lexical_cast<std::wstring>(h);
if (h < 914400) h = 914400;
w_h = std::to_wstring(h);
}
std::wstring w_orient = L"custom";
@ -1219,13 +1222,13 @@ void style_page_layout_properties_attlist::pptx_convert(oox::pptx_conversion_con
// style-footnote-sep-attlist
void style_footnote_sep_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:width", style_width_);
CP_APPLY_ATTR(L"style:rel-width", style_rel_width_);
CP_APPLY_ATTR(L"style:color", style_color_);
CP_APPLY_ATTR(L"style:line-style", style_line_style_);
CP_APPLY_ATTR(L"style:type", style_adjustment_, style_type(style_type::Left)); // default Left
CP_APPLY_ATTR(L"style:distance-before-sep", style_distance_before_sep_);
CP_APPLY_ATTR(L"style:distance-after-sep", style_distance_after_sep_);
CP_APPLY_ATTR(L"style:width", style_width_);
CP_APPLY_ATTR(L"style:rel-width", style_rel_width_);
CP_APPLY_ATTR(L"style:color", style_color_);
CP_APPLY_ATTR(L"style:line-style", style_line_style_);
CP_APPLY_ATTR(L"style:type", style_adjustment_, style_type(style_type::Left)); // default Left
CP_APPLY_ATTR(L"style:distance-before-sep", style_distance_before_sep_);
CP_APPLY_ATTR(L"style:distance-after-sep", style_distance_after_sep_);
}
/// style:footnote-sep
@ -1275,13 +1278,6 @@ bool style_page_layout_properties::docx_back_serialize(std::wostream & strm, oox
}
void style_page_layout_properties::docx_convert_serialize(std::wostream & strm, oox::docx_conversion_context & Context)
{
if (Context.get_table_context().in_table())
{
// мы находимся внутри таблицы, устанавливаем специальное значение
Context.section_properties_in_table(this);
return;
}
style_columns * columns = dynamic_cast<style_columns *>( style_page_layout_properties_elements_.style_columns_.get());
CP_XML_WRITER(strm)
@ -1290,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???
@ -1312,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();
@ -1462,39 +1456,42 @@ void style_master_page::pptx_convert(oox::pptx_conversion_context & Context)
////////////////
const wchar_t * hdrHeader = L"<w:hdr \
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" \
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" \
xmlns:v=\"urn:schemas-microsoft-com:vml\" \
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
mc:Ignorable=\"w14 wp14\">";
const wchar_t * ftrHeader = L"<w:ftr \
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" \
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" \
xmlns:v=\"urn:schemas-microsoft-com:vml\" \
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
mc:Ignorable=\"w14 wp14\">";
void style_header::docx_convert(oox::docx_conversion_context & Context)

View File

@ -754,7 +754,7 @@ namespace svg_path
}
}
if ((aCurrPoly.points.size() > 0 || !bIsClosed) && !aCurrPoly.command.empty())
if ((aCurrPoly.points.size() > 0 || !bIsClosed) && !aCurrPoly.command.empty() && aCurrPoly.command != L"a:cubicBezTo")
{
// end-process last poly

View File

@ -175,18 +175,6 @@ void table_table::docx_convert(oox::docx_conversion_context & Context)
Context.get_table_context().end_table();
_Wostream << L"</w:tbl>";
if (office_element * elm = Context.get_section_properties_in_table())
{
if (Context.get_table_context().in_table())
Context.section_properties_in_table(elm);
else
{
_Wostream << L"<w:p><w:pPr>";
elm->docx_convert(Context);
_Wostream << L"</w:pPr></w:p>";
}
}
}
void table_columns::docx_convert(oox::docx_conversion_context & Context)

View File

@ -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_)
@ -188,21 +195,27 @@ 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.is_paragraph_header() && !Context.get_section_context().dump_.empty())
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() << Context.get_section_context().dump_;
Context.get_section_context().dump_.clear();
if (Context.is_paragraph_header() )
{
Context.output_stream() << Context.get_section_context().dump_;
Context.get_section_context().dump_.clear();
Context.output_stream() << L"</w:pPr>";
Context.finish_paragraph();
Context.start_paragraph();
Context.output_stream() << L"<w:pPr>";
Context.output_stream() << L"</w:pPr>";
Context.finish_paragraph();
Context.start_paragraph();
Context.output_stream() << L"<w:pPr>";
}
else
{
Context.output_stream() << Context.get_section_context().dump_;
Context.get_section_context().dump_.clear();
}
}
else if ( !Context.get_table_context().in_table())
{
Context.output_stream() << Context.get_section_context().dump_;
Context.get_section_context().dump_.clear();
}
Context.output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
@ -231,7 +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())
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_;
@ -249,25 +265,25 @@ int process_paragraph_attr(const paragraph_attrs & Attr, oox::docx_conversion_co
std::wostream & paragraph::text_to_stream(std::wostream & _Wostream) const
{
// TODO!!!!
CP_SERIALIZE_TEXT(paragraph_content_);
CP_SERIALIZE_TEXT(content_);
_Wostream << L"\n";
return _Wostream;
}
void paragraph::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
paragraph_attrs_.add_attributes(Attributes);
attrs_.add_attributes(Attributes);
}
void paragraph::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name, document_context * Context)
{
CP_CREATE_ELEMENT_SIMPLE(paragraph_content_);
CP_CREATE_ELEMENT_SIMPLE(content_);
}
void paragraph::add_text(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text) ;
paragraph_content_.push_back( elm );
content_.push_back( elm );
}
void paragraph::afterCreate(document_context * Context)
@ -301,7 +317,7 @@ void paragraph::drop_cap_text_docx_convert(office_element_ptr first_text_element
str = store_str.substr(0,Context.get_drop_cap_context().Length);
int textStyle = process_paragraph_attr(paragraph_attrs_, Context);
int textStyle = process_paragraph_attr(attrs_, Context);
first_text_paragraph->docx_convert(Context);
int str_start = Context.get_drop_cap_context().Length;
@ -314,16 +330,16 @@ void paragraph::drop_cap_text_docx_convert(office_element_ptr first_text_element
}
void paragraph::drop_cap_docx_convert(oox::docx_conversion_context & Context)
{
if ( paragraph_content_.empty()) return;
if ( content_.empty()) return;
//в рассчет берутся только первые элементы !!! разные там break-и отменяют реэжим drop_cap!!- todooo сделать возможным множественным span
if ( paragraph_content_[0]->get_type() == typeTextText)
if ( content_[0]->get_type() == typeTextText)
{
drop_cap_text_docx_convert(paragraph_content_[0],Context);
drop_cap_text_docx_convert(content_[0],Context);
}
else if (paragraph_content_[0]->get_type() == typeTextSpan)
else if (content_[0]->get_type() == typeTextSpan)
{
span* first_span_in_paragraph = dynamic_cast<span*>(paragraph_content_[0].get());
span* first_span_in_paragraph = dynamic_cast<span*>(content_[0].get());
if (Context.get_drop_cap_context().FontSize < 1)
{
style_instance * styleInst = Context.root()->odf_context().styleContainer().style_by_name(first_span_in_paragraph->text_style_name_.style_name(), style_family::Text,Context.process_headers_footers_);
@ -343,49 +359,43 @@ void paragraph::drop_cap_docx_convert(oox::docx_conversion_context & Context)
}
}
//в рассчет берутся только первые элементы !!! разные там break-и отменяют реэжим drop_cap!!
if ((first_span_in_paragraph->paragraph_content_.size()>0) &&
(first_span_in_paragraph->paragraph_content_[0]->get_type() == typeTextText))
if ((first_span_in_paragraph->content_.size()>0) &&
(first_span_in_paragraph->content_[0]->get_type() == typeTextText))
{
drop_cap_text_docx_convert(first_span_in_paragraph->paragraph_content_[0],Context);
drop_cap_text_docx_convert(first_span_in_paragraph->content_[0],Context);
}
}
}
void paragraph::docx_convert(oox::docx_conversion_context & Context)
{
bool drawing = false;
const std::wstring & styleName = attrs_.text_style_name_.style_name();
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;
if (Context.get_paragraph_state() && (Context.get_process_note() == oox::docx_conversion_context::noNote) && !drawing )
{//вложеннные элементы
if (paragraph_content_.empty())//??
{
Context.output_stream() << L"<w:p>";
Context.output_stream() << emptyParagraphContent;
Context.output_stream() << L"</w:p>";
bool is_empty = content_.empty();
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;
if (!Context.get_paragraph_keep())// например Appendix I_IPP.odt - tracked elements (
{
for (int i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);
}
if (!Context.get_delete_text_state())
Context.set_paragraph_state(false);// например Appendix I_IPP.odt - tracked elements (вложенные списки из 2 элементов)
return;
}
else
{
bIsNewParagraph = false;
if (!Context.get_paragraph_keep())
{
for (int i = 0; i < paragraph_content_.size(); i++)
{
paragraph_content_[i]->docx_convert(Context);
}
return;
}
}
}
bool is_empty = paragraph_content_.empty();
if (bIsNewParagraph)
Context.start_paragraph(is_header_);
@ -398,7 +408,7 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
// если да — устанавливаем контексту флаг на то что необходимо в конце текущего параграфа
// распечатать свойства секции
//проверить ... не она ли основная - может быть прописан дубляж - и тогда разрыв нарисуется ненужный
const std::wstring & next_styleName = next_par_->paragraph_attrs_.text_style_name_.style_name();
const std::wstring & next_styleName = next_par_->attrs_.text_style_name_.style_name();
const _CP_OPT(std::wstring) next_masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(next_styleName);
if ((next_masterPageName) && (Context.get_master_page_name() != *next_masterPageName))
@ -413,7 +423,6 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
is_empty = false;
}
const std::wstring & styleName = paragraph_attrs_.text_style_name_.style_name();
const _CP_OPT(std::wstring) masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(styleName);
if (masterPageName)
@ -425,12 +434,10 @@ 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;
}
process_paragraph_drop_cap_attr(paragraph_attrs_, Context);
process_paragraph_drop_cap_attr(attrs_, Context);
if (Context.get_drop_cap_context().state() == 2)//active
{
@ -444,16 +451,17 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
}
int textStyle = process_paragraph_attr(paragraph_attrs_, Context);
int textStyle = process_paragraph_attr(attrs_, Context);
Context.add_note_reference();
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
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();
}
@ -501,8 +509,8 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
void paragraph::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.start_paragraph(paragraph_attrs_.text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
Context.start_paragraph(attrs_.text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
elm->xlsx_convert(Context);
}
@ -510,12 +518,14 @@ void paragraph::xlsx_convert(oox::xlsx_conversion_context & Context)
}
void paragraph::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_text_context().start_paragraph(paragraph_attrs_.text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, paragraph_content_)
Context.get_text_context().start_paragraph(attrs_.text_style_name_.style_name());
BOOST_FOREACH(const office_element_ptr & elm, content_)
{
elm->pptx_convert(Context);
}
Context.get_text_context().end_paragraph();
Context.get_text_context().end_paragraph();
}
///////////////////////////////////////////
void soft_page_break::docx_convert(oox::docx_conversion_context & Context)
@ -546,7 +556,7 @@ void h::add_attributes( const xml::attributes_wc_ptr & Attributes )
paragraph_.add_attributes(Attributes);
paragraph_.is_header_ = true;
paragraph_.paragraph_attrs_.outline_level_ = text_outline_level_;
paragraph_.attrs_.outline_level_ = text_outline_level_;
}
void h::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
@ -1031,14 +1041,19 @@ void text_changed_region::add_attributes( const xml::attributes_wc_ptr & Attribu
void text_changed_region::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(element_);
CP_CREATE_ELEMENT(content_);
}
void text_changed_region::docx_convert(oox::docx_conversion_context & Context)
{
if (!element_ || !text_id_) return;
if (content_.empty() || !text_id_) return;
Context.get_text_tracked_context().start_change (*text_id_);
element_->docx_convert(Context);
for (int i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);
}
Context.get_text_tracked_context().end_change ();
}
@ -1066,12 +1081,30 @@ void text_unknown_base_change::docx_convert(oox::docx_conversion_context & Conte
if (content_.empty()) return;
//тут удаленный текст. не по стандарту сделать бы и форматы - стилями чтоли ....
Context.get_text_tracked_context().start_changes_content();
for (int i = 0; i < content_.size(); i++)
for (int i = 0; i < content_.size(); i++)
{
Context.get_text_tracked_context().start_changes_content();
{
content_[i]->docx_convert(Context);
//h *h_ = dynamic_cast<h*>(content_[i].get());
//p *p_ = dynamic_cast<p*>(content_[i].get());
//paragraph *para = NULL;
//if (h_) para = &h_->paragraph_;
//if (p_) para = &p_->paragraph_;
//if (para)
//{
// for (int j = 0; j < para->content_.size(); j++)
// {
// para->content_[j]->docx_convert(Context);
// }
//}
}
Context.get_text_tracked_context().end_changes_content();
Context.get_text_tracked_context().end_changes_content();
}
}
//---------------------------------------------------------------------------------------------------
const wchar_t * text_insertion::ns = L"text";

View File

@ -56,12 +56,12 @@ public:
std::wostream & text_to_stream(std::wostream & _Wostream) const;
void add_attributes( const xml::attributes_wc_ptr & Attributes );
void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name, document_context * Context);
void add_text(const std::wstring & Text);
void add_attributes ( const xml::attributes_wc_ptr & Attributes );
void add_child_element ( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name, document_context * Context);
void add_text (const std::wstring & Text);
paragraph * get_next() { return next_par_; }
void set_next(paragraph * next) {next_par_ = next;}
paragraph * get_next() { return next_par_; }
void set_next(paragraph * next) {next_par_ = next;}
void set_next_section(bool Val)
{
@ -75,17 +75,17 @@ public:
void afterCreate(document_context * ctx);
void docx_convert(oox::docx_conversion_context & Context) ;
void xlsx_convert(oox::xlsx_conversion_context & Context) ;
void pptx_convert(oox::pptx_conversion_context & Context) ;
void docx_convert (oox::docx_conversion_context & Context) ;
void xlsx_convert (oox::xlsx_conversion_context & Context) ;
void pptx_convert (oox::pptx_conversion_context & Context) ;
void drop_cap_docx_convert(oox::docx_conversion_context & Context);
office_element_ptr_array content_;
private:
void drop_cap_text_docx_convert(office_element_ptr first_text_paragraph,oox::docx_conversion_context & Context);
paragraph_attrs paragraph_attrs_;
office_element_ptr_array paragraph_content_;
paragraph_attrs attrs_;
paragraph *next_par_;
@ -117,6 +117,7 @@ public:
virtual void afterCreate();
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
paragraph paragraph_;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
@ -130,8 +131,6 @@ private:
_CP_OPT(bool) text_is_list_header_;
_CP_OPT(std::wstring) text_number_;
paragraph paragraph_;
friend class par_docx_convert_class;
};
@ -545,8 +544,8 @@ 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);
_CP_OPT(std::wstring) text_id_; //== xml:id
office_element_ptr element_;
_CP_OPT(std::wstring) text_id_; //== xml:id
office_element_ptr_array content_;
};
CP_REGISTER_OFFICE_ELEMENT2(text_changed_region);

View File

@ -369,6 +369,14 @@
<File
RelativePath="..\..\..\ASCOfficeDocxFile2\DocWrapper\DocxSerializer.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/bigobj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>

View File

@ -4206,7 +4206,7 @@ HRESULT CDrawingConverter::SaveObject(LONG lStart, LONG lLength, const CString&
if (-1 == nIndexF)
return S_FALSE;
int nIndexTail = (std::min)(strMainProps.Find(_T("<wp14:sizeRelH")), strMainProps.Find(_T("<wp14:sizeRelV")));
int nIndexTail = strMainProps.Find(_T("<wp14:sizeRel"));
if(-1 != nIndexTail)
{
strMainPropsTail = strMainProps.Right(strMainProps.GetLength() - nIndexTail);

View File

@ -116,42 +116,44 @@ namespace NSGuidesVML
ptValue = 2
};
static LONG GetValue(CString strParam, ParamType& ptType, bool& bRes,
static long GetValue(CString strParam, ParamType& ptType, bool& bRes,
long lShapeWidth = ShapeSizeVML, long lShapeHeight = ShapeSizeVML)
{
ptType = ptValue;
bRes = true;
ptType = ptValue;
bRes = true;
long val = 0;
if ('#' == strParam[0])
{
ptType = ptAdjust;
return (LONG)XmlUtils::GetInteger(strParam.Mid(1));
val = XmlUtils::GetInteger(strParam.Mid(1));
}
else if ('@' == strParam[0])
{
ptType = ptFormula;
return (LONG)XmlUtils::GetInteger(strParam.Mid(1));
val = XmlUtils::GetInteger(strParam.Mid(1));
}
else if (!NSStringUtils::IsNumber(strParam))
{
if (_T("width") == strParam)
{
return lShapeWidth;
val = lShapeWidth;
}
else if (_T("height") == strParam)
{
return lShapeHeight;
val = lShapeHeight;
}
else if (_T("pixelWidth") == strParam)
{
return lShapeWidth;
val = lShapeWidth;
}
else if (_T("pixelHeight") == strParam)
{
return lShapeHeight;
val = lShapeHeight;
}
else if (_T("pixelLineWidth") == strParam || _T("lineDrawn") == strParam)
{
return 1;
val = 1;
}
else
{
@ -162,8 +164,9 @@ namespace NSGuidesVML
else
{
ptType = ptValue;
return (LONG)XmlUtils::GetInteger(strParam);
val = XmlUtils::GetInteger(strParam);
}
return val;
}
static FormulaType GetFormula(CString strName, bool& bRes)

View File

@ -2669,6 +2669,11 @@ namespace NSGuidesVML
{
if (0 != m_arSlicesPath.size())
{
if ( lValue >= 0x7fffff00 || lValue <= -0x7fffff00)
{
lValue = 0; //process(2).ppt - todooo разобраться что за хрень это ваще приплыла
}
m_arSlicesPath[m_arSlicesPath.size() - 1].AddParam(lValue, eParamType);
}
}

View File

@ -324,14 +324,14 @@ namespace NSBinPptxRW
m_lFlag = 0;
m_lGroupIndex = 0;
m_lObjectId = 0;
m_lObjectIdVML = 0;
m_lObjectIdVML = 0;
m_lObjectIdOle = 0;
m_bIsUseOffice2007 = false;
m_strStyleMain = _T("");
m_strStyleMain = _T("");
m_strAttributesMain = _T("");
m_strNodes = _T("");
m_strOleXlsx = _T("");
m_strNodes = _T("");
m_strOleXlsx = _T("");
m_pOOXToVMLRenderer = NULL;
m_bIsTop = false;

View File

@ -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
@ -226,7 +235,7 @@ endef
.PHONY : all bin lib clean
all: lib bin
all: lib bin
bin: $(X2T) $(ALLFONTSGEN)

View File

@ -7,7 +7,7 @@
QT -= core
QT -= gui
VERSION = 2.0.2.412
VERSION = 2.0.2.417
DEFINES += INTVER=$$VERSION
TARGET = x2t

View File

@ -33,4 +33,4 @@ core_linux_32 {
}
core_mac {
DESTDIR = $$DESTDIR/mac_64
}
}