Compare commits

...

72 Commits

Author SHA1 Message Date
51c8ab5499 add common method (GetFormatByExtension) 2016-12-09 18:28:33 +03:00
4176176e2b Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop
* 'develop' of https://github.com/ONLYOFFICE/core:
  OdfFormat - embedded office text (against text  box)
  .
  OdfFormatReader - presentation - support convert ole objects (and other embedded)
2016-12-09 18:11:24 +03:00
34d03c743e mobile-coautoring 2016-12-09 18:11:19 +03:00
4cf55208b1 OdfFormat - embedded office text (against text box) 2016-12-09 11:42:02 +03:00
fe1d48635b . 2016-12-08 19:47:49 +03:00
db20232095 OdfFormatReader - presentation - support convert ole objects (and other embedded) 2016-12-08 19:31:26 +03:00
56ecea3ffc Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop
* 'develop' of https://github.com/ONLYOFFICE/core:
  OdfFormatReader - spreadsheets - support convert ole objects (and other embedded)
  CONVERT_CORRUPTED
2016-12-08 18:06:13 +03:00
59599289af utils 2016-12-08 18:06:07 +03:00
d95c93abb2 OdfFormatReader - spreadsheets - support convert ole objects (and other embedded) 2016-12-08 14:51:12 +03:00
a9076bebd2 CONVERT_CORRUPTED 2016-12-07 20:04:11 +03:00
5157908b47 coach events 2016-12-07 17:20:51 +03:00
13b7306b99 . 2016-12-06 20:07:10 +03:00
b98a545d8c OdfFormatReader - ole embedded .... 2016-12-06 20:05:17 +03:00
ceb2c7863b Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop 2016-12-06 15:03:45 +03:00
26cedc30fa OdfFormatReader - embedded objects (ods in odt example) 2016-12-06 14:58:58 +03:00
c0f29521c4 Merge tag 'v4.2.1' into develop
v4.2.1
2016-12-06 14:52:30 +03:00
13d57361e4 Merge branch 'hotfix/v4.2.1' 2016-12-06 14:52:20 +03:00
1e04770e31 Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop
* 'develop' of https://github.com/ONLYOFFICE/core:
  .
  DocFormatReader - fix users file
  Revert "DocFormatReader - users file fix"
  DocFormatReader - users file fix OdfFormatReader - fix alphabetic text index
  DocFormatReaer - users file fix OdfFormatReader - fix alphabetic text index
  Removed version number
2016-12-05 17:38:07 +03:00
6666ba0236 insert images in collaboration mode 2016-12-05 17:37:59 +03:00
e6c334199f DocFormatReader - fix users file 2016-12-05 15:51:49 +03:00
6d75b03cc0 . 2016-12-05 15:48:23 +03:00
303b62c2a1 DocFormatReader - fix users file 2016-12-05 15:48:04 +03:00
5109acb888 Revert "DocFormatReader - users file fix"
This reverts commit cbc4a5d334.
2016-12-05 15:46:36 +03:00
cbc4a5d334 DocFormatReader - users file fix
OdfFormatReader - fix alphabetic text index
2016-12-05 15:46:05 +03:00
a639fc9eaf Revert "Merge branch 'develop' into hotfix/v4.2.1"
This reverts commit 9cc54393a0, reversing
changes made to 29b4a10435.
2016-12-05 15:37:35 +03:00
9cc54393a0 Merge branch 'develop' into hotfix/v4.2.1 2016-12-05 15:31:00 +03:00
16386f4b5c DocFormatReaer - users file fix
OdfFormatReader - fix alphabetic text index
2016-12-05 15:17:40 +03:00
149c0ae72a Merge tag 'v4.2.0' into develop
v4.2.0 v4.2.0
2016-12-05 11:39:08 +03:00
29b4a10435 Merge branch 'release/v4.2.0' 2016-12-05 11:39:06 +03:00
1cf9401e0a Removed version number 2016-12-02 18:43:51 +03:00
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
b75495c4ba write tableStyle without tableStyleElement 2016-11-30 12:21:01 +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
49939a7f19 build error (macOS, clang) 2016-11-25 18:00:33 +03:00
e690aa0c53 . 2016-11-25 16:01:03 +03:00
bb4483fd7d Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop
* 'develop' of https://github.com/ONLYOFFICE/core:
  OdfFormatReader - fix errors ...
2016-11-25 12:08:47 +03:00
b93c7a2620 mobile-coautoring 2016-11-25 12:08:42 +03:00
f37394db00 OdfFormatReader - fix errors content 2016-11-24 18:29:51 +03:00
42c94d5cd0 OdfFormatReader - fix errors ... 2016-11-24 18:23:41 +03:00
41b3c6fb16 mobile-coautoring 2016-11-24 16:54:01 +03:00
ddb708eb62 x2t ... 2016-11-23 18:37:37 +03:00
429c0a5a37 stroke bug 2016-11-23 18:30:59 +03:00
4c12ba9c1a OdfFormatReader - fix bugs... 2016-11-23 17:45:21 +03:00
eae048a8a3 OdfFormatReader - fix bugs conditionalFormatting, number styles, ... 2016-11-22 20:15:30 +03:00
a52c18608d Merge branch 'develop' of https://github.com/ONLYOFFICE/core into develop
* 'develop' of https://github.com/ONLYOFFICE/core:
  for bug 33490
  RtfFormatReader - two and more levels in fields (contents, ...)
  fix bug 33488
2016-11-22 19:00:57 +03:00
7824ce640c up 2016-11-22 19:00:52 +03:00
83bae8fabd for bug 33490 2016-11-22 17:00:55 +03:00
623d89d197 RtfFormatReader - two and more levels in fields (contents, ...) 2016-11-22 14:28:04 +03:00
fb9d2cbf49 fix bug 33488 2016-11-22 14:16:48 +03:00
0d7c8ebc07 for bug 32797 2016-11-21 17:23:23 +03:00
929252f681 RtfFormatReader -fix read spec char in field 2016-11-21 17:17:44 +03:00
2207cee065 x2t version up 2016-11-21 16:10:22 +03:00
467cb760f3 OdfFormatReader - fix backgroud presentation 2016-11-21 16:08:55 +03:00
23718718c4 fix bug #33449 2016-11-21 11:35:56 +03:00
3c73f692d0 x2t linux 64 build 2.0.2.409 2016-11-17 18:21:15 +03:00
32d90264d3 RtfFormat - review. 2016-11-17 17:47:39 +03:00
155 changed files with 3984 additions and 2818 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

@ -87,19 +87,19 @@ namespace DocFileFormat
case sprmOldTDefTable:
case sprmTDefTable:
{ //table definition
{
//table definition
SprmTDefTable tDef( iter->Arguments, iter->argumentsSize );
//Workaround for retrieving the indent of the table:
//In some files there is a indent but no sprmTWidthIndent is set.
//For this cases we can calculate the indent of the table by getting the
//first boundary of the TDef and adding the padding of the cells
tblIndent = FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize );
//add the gabHalf
tblIndent += gabHalf;
//If there follows a real sprmTWidthIndent, this value will be overwritten
tblIndent = (std::max)((int)tblIndent,0);
//tblIndent = (std::max)((int)tblIndent,0); //cerere.doc
}
break;

View File

@ -4404,6 +4404,17 @@ public:
if(m_oMath_rPr.IsNoEmpty())
m_oMath_rPr.Write(&GetRunStringWriter());
}
else if ( c_oSerRunType::arPr == type )
{
PPTX::Logic::RunProperties rPr;
m_oBufferedStream.Skip(1);//skip type
rPr.fromPPTY(&m_oBufferedStream);
rPr.m_name = L"a:rPr";
//todo use one writer
NSBinPptxRW::CXmlWriter oWriter;
rPr.toXmlWriter(&oWriter);
GetRunStringWriter().WriteString(oWriter.GetXmlString());
}
else if ( c_oSerRunType::del == type )
{
TrackRevision oRPrChange;

View File

@ -503,7 +503,8 @@ extern int g_nCurFormatVersion;
footnoteRef = 24,
endnoteRef = 25,
footnoteReference = 26,
endnoteReference = 27
endnoteReference = 27,
arPr = 28
};}
namespace c_oSerImageType{enum c_oSerImageType
{

View File

@ -3966,6 +3966,12 @@ namespace BinDocxRW
brPrs.Write_rPr(pCtrlPr.m_oRPr.get());
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oARPr.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::arPr);
m_oBcw.m_oStream.WriteRecord2(0, pCtrlPr.m_oARPr);
m_oBcw.WriteItemEnd(nCurPos2);
}
if ( pCtrlPr.m_oDel.IsInit() )
{
int nCurPos2 = m_oBcw.WriteItemStart(c_oSerRunType::del);

View File

@ -345,6 +345,18 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\..\Common\3dParty\pole\pole.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="0"
/>
</FileConfiguration>
</File>
</Filter>
</Files>
<Globals>

View File

@ -50,7 +50,7 @@ public:
std::wstring convert(std::wstring const & expr);
// $Лист1.$A$1 -> Лист1!$A$1
std::wstring convert_named_ref(std::wstring const & expr, bool withTableName = true);
std::wstring convert_named_ref(std::wstring const & expr, bool withTableName = true, std::wstring separator = L" ");
//a-la convert without check formula
std::wstring convert_named_expr(std::wstring const & expr, bool withTableName = true);

View File

@ -69,16 +69,16 @@ namespace formulasconvert {
if (splitted.size()==3)
{
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[2];
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[2];
return true;
}
if (splitted.size()==4)
{
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[3];
table = splitted[0];
ref_first = splitted[1];
ref_last = splitted[3];
return true;
}
return false;
@ -239,7 +239,7 @@ namespace formulasconvert {
bool odf2oox_converter::Impl::check_formula(std::wstring& expr)
{
boost::match_results<std::wstring::const_iterator> res;
if (boost::regex_search(expr, res, boost::wregex(L"(?:[\\w]+:)?=(.+)"), boost::match_default))
if (boost::regex_search(expr, res, boost::wregex(L"^(?:[\\w]+:)?=(.+)"), boost::match_default))
{
expr = res[1].str();
while (expr.find(L"=") == 0)
@ -300,7 +300,6 @@ namespace formulasconvert {
if (what[1].matched)
{
std::wstring inner = what[1].str();
boost::algorithm::replace_all(inner, L".", L"ТОСHKA");
boost::algorithm::replace_all(inner, L" ", L"PROBEL");
return inner;
}
@ -314,6 +313,7 @@ namespace formulasconvert {
if (what[1].matched)
{
std::wstring inner = what[1].str();
boost::algorithm::replace_all(inner, L".", L"ТОСHKA");
boost::algorithm::replace_all(inner, L"(", L"SCOBCAIN");
boost::algorithm::replace_all(inner, L")", L"SCOBCAOUT");
@ -327,6 +327,8 @@ namespace formulasconvert {
else if (what[2].matched)
{
std::wstring inner = what[2].str();
boost::algorithm::replace_all(inner, L".", L"ТОСHKA");
boost::algorithm::replace_all(inner, L"(", L"SCOBCAIN");
boost::algorithm::replace_all(inner, L")", L"SCOBCAOUT");
@ -407,47 +409,54 @@ namespace formulasconvert {
if (is_forbidden(expr))
return L"NULLFORMULA()";
boost::wregex complexRef(L"('(?!\\s\\'){0,1}.*?')");
std::wstring workstr = expr;
//boost::wregex complexRef(L"('(?!\\s\\'){0,1}.*?')");// Better_Donut.ods- cell(c27)
//std::wstring workstr = boost::regex_replace(
// expr,
// complexRef,
// &replace_point_space,
// boost::match_default | boost::format_all);
std::wstring workstr = boost::regex_replace(
expr,
complexRef,
&replace_point_space,
boost::match_default | boost::format_all);
check_formula(workstr);
bool isFormula = check_formula(workstr);
workstr = boost::regex_replace(
boost::regex_replace(
workstr,
boost::wregex(L"('.*?')|(\".*?\")"),
&convert_scobci, boost::match_default | boost::format_all);
//boost::algorithm::replace_all(workstr, L"'", L"APOSTROF");
replace_cells_range (workstr, true);
replace_semicolons (workstr);
replace_vertical (workstr);
int res_find=0;
if ((res_find = workstr.find(L"CONCATINATE")) > 0)
if (isFormula)
{
//могут быть частично заданы диапазоны
//todooo
boost::algorithm::replace_all(workstr, L"FDIST(", L"_xlfn.F.DIST(");
// ROUNDUP( - тут в oox 2 параметра - разрядность нужно - ,0) - EV Requirements v2.2.3.ods
int res_find=0;
if ((res_find = workstr.find(L"CONCATINATE")) > 0)
{
//могут быть частично заданы диапазоны
//todooo
}
//todooo INDEX((A1:C6~A8:C11),2,2,2) - ???? - INDEX_emb.ods
}
//-----------------------------------------------------------
boost::algorithm::replace_all(workstr, L"PROBEL" , L" ");
boost::algorithm::replace_all(workstr, L"APOSTROF" , L"'");
boost::algorithm::replace_all(workstr, L"TOCHKA" , L".");
boost::algorithm::replace_all(workstr, L"ТОСHKA" , L".");
boost::algorithm::replace_all(workstr, L"SCOBCAIN", L"(");
boost::algorithm::replace_all(workstr, L"SCOBCAOUT", L")");
boost::algorithm::replace_all(workstr, L"SCOBCAIN" , L"(");
boost::algorithm::replace_all(workstr, L"SCOBCAOUT" , L")");
boost::algorithm::replace_all(workstr, L"KVADRATIN", L"[");
boost::algorithm::replace_all(workstr, L"KVADRATIN" , L"[");
boost::algorithm::replace_all(workstr, L"KVADRATOUT", L"]");
boost::algorithm::replace_all(workstr, L"PROBEL", L" ");
boost::algorithm::replace_all(workstr, L"KAVYCHKA", L"\"");
boost::algorithm::replace_all(workstr, L"PROBEL" , L" ");
boost::algorithm::replace_all(workstr, L"KAVYCHKA" , L"\"");
return workstr;
}
@ -535,7 +544,7 @@ namespace formulasconvert {
{
return impl_->convert_chart_distance(expr);
}
std::wstring odf2oox_converter::convert_named_ref(const std::wstring& expr, bool withTableName)
std::wstring odf2oox_converter::convert_named_ref(const std::wstring& expr, bool withTableName, std::wstring separator)
{
boost::wregex complexRef(L"('(?!\\s\\'){0,1}.*?')");// поиск того что в апострофах и замена там
@ -550,6 +559,11 @@ namespace formulasconvert {
impl_->replace_named_ref(workstr, withTableName);
if (separator != L" ")
{
boost::algorithm::replace_all(workstr, L" " , separator);
}
boost::algorithm::replace_all(workstr, L"PROBEL" , L" ");
boost::algorithm::replace_all(workstr, L"APOSTROF" , L"'");
boost::algorithm::replace_all(workstr, L"TOCHKA" , L".");

View File

@ -213,7 +213,6 @@ SOURCES += \
../src/docx/hyperlinks.cpp \
../src/docx/measuredigits.cpp \
../src/docx/mediaitems.cpp \
../src/docx/mediaitems_utils.cpp \
../src/docx/namespaces.cpp \
../src/docx/oox_chart_axis.cpp \
../src/docx/oox_chart_context.cpp \
@ -462,7 +461,6 @@ HEADERS += \
../src/docx/hyperlinks.h \
../src/docx/measuredigits.h \
../src/docx/mediaitems.h \
../src/docx/mediaitems_utils.h \
../src/docx/namespaces.h \
../src/docx/oox_chart_axis.h \
../src/docx/oox_chart_context.h \

View File

@ -76,7 +76,7 @@ public:
{}
std::wostream & xml_to_stream(std::wostream & _Wostream) const;
const std::wstring & part_name() const { return part_name_; }
const std::wstring & part_name() const { return part_name_; }
const std::wstring & content_type() const { return content_type_; }
public:

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,29 @@ 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_ (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 +835,20 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str
//in_styles = true -> styles.xml
//почему то конструкция <pPr><rPr/></pPr><rPr/> "не работает" в части в rPr в ms2010 )
{
bool in_drawing = false;
if (get_drawing_context().get_current_shape() || get_drawing_context().get_current_frame())
{
in_drawing = true;
}
std::wstringstream & paragraph_style = get_styles_context().paragraph_nodes();
std::wstringstream & run_style = get_styles_context().text_style();
CP_XML_WRITER(strm)
{
//Tutor_Charlotte_Tutor_the_Entire_World_.odt
if (get_section_context().dump_.empty() == false && (!ParentId.empty() || get_section_context().get().is_dump_ || in_header_)
&& !get_table_context().in_table())
&& !get_table_context().in_table() && !in_drawing)
{//две подряд секции или если стиль определен и в заголовки нельзя пихать !!!
CP_XML_NODE(L"w:pPr")
{
@ -853,7 +863,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 +1112,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 +1120,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 +1139,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 +1271,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 +1323,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 +1410,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 +1440,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

@ -187,12 +187,10 @@ void serialize_wrap(std::wostream & strm, _docx_drawing const & val)
}
}
void docx_serialize_text(std::wostream & strm, _docx_drawing & val)
void _docx_drawing::serialize_text(std::wostream & strm)
{
const std::vector<odf_reader::_property> & properties = val.additional;
_CP_OPT(std::wstring) strTextContent;
odf_reader::GetProperty(properties,L"text-content",strTextContent);
odf_reader::GetProperty(additional, L"text-content", strTextContent);
CP_XML_WRITER(strm)
{
@ -209,7 +207,7 @@ void docx_serialize_text(std::wostream & strm, _docx_drawing & val)
}
}
oox_serialize_bodyPr(strm, val, L"wps");
serialize_bodyPr(strm, L"wps");
}
//--------------------------------------------------------------------
@ -240,11 +238,11 @@ void docx_serialize_image_child(std::wostream & strm, _docx_drawing & val)
CP_XML_NODE(L"pic:spPr")
{
oox_serialize_xfrm(CP_XML_STREAM(), val);
val.serialize_xfrm(CP_XML_STREAM());
CP_XML_NODE(L"a:prstGeom")
{
CP_XML_ATTR(L"prst",L"rect");
CP_XML_ATTR(L"prst", L"rect");
CP_XML_NODE(L"a:avLst");
}
@ -280,13 +278,12 @@ void docx_serialize_shape_child(std::wostream & strm, _docx_drawing & val)
}
CP_XML_NODE(L"wps:spPr")
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
oox_serialize_shape(CP_XML_STREAM(),val);
val.serialize_xfrm (CP_XML_STREAM());
val.serialize_shape (CP_XML_STREAM());
oox_serialize_ln(CP_XML_STREAM(), val.additional);
}
docx_serialize_text(CP_XML_STREAM(),val);
val.serialize_text(CP_XML_STREAM());
}
}
}
@ -306,13 +303,14 @@ void docx_serialize_group_child(std::wostream & strm, _docx_drawing & val)
CP_XML_NODE(L"wpg:grpSpPr")
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
val.serialize_xfrm(CP_XML_STREAM());
}
CP_XML_STREAM() << val.content_group_;
}
}
}
void docx_serialize_chart_child(std::wostream & strm, _docx_drawing & val)
{
CP_XML_WRITER(strm)
@ -321,7 +319,7 @@ void docx_serialize_chart_child(std::wostream & strm, _docx_drawing & val)
{
CP_XML_ATTR(L"xmlns:c", L"http://schemas.openxmlformats.org/drawingml/2006/chart");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"r:id", val.chartId);
CP_XML_ATTR(L"r:id", val.objectId);
}
}
}
@ -332,9 +330,9 @@ void docx_serialize_common(std::wostream & strm, _docx_drawing & val)
{
CP_XML_NODE(L"wp:docPr")
{
CP_XML_ATTR(L"name",val.name);
CP_XML_ATTR(L"id", val.id + 1);
oox_serialize_hlink(CP_XML_STREAM(),val.hlinks);
CP_XML_ATTR(L"name", val.name);
CP_XML_ATTR(L"id", val.id + 1);
oox_serialize_hlink(CP_XML_STREAM(), val.hlinks);
}
CP_XML_NODE(L"wp:cNvGraphicFramePr")
@ -355,6 +353,11 @@ void docx_serialize_common(std::wostream & strm, _docx_drawing & val)
CP_XML_ATTR(L"uri",L"http://schemas.microsoft.com/office/word/2010/wordprocessingShape");
docx_serialize_shape_child(CP_XML_STREAM(), val);
}
else if (val.type == typeGroupShape)
{
CP_XML_ATTR(L"uri", L"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup");
docx_serialize_group_child(CP_XML_STREAM(), val);
}
else if (val.type == typeImage)
{
CP_XML_ATTR(L"uri",L"http://schemas.openxmlformats.org/drawingml/2006/picture");
@ -365,11 +368,6 @@ void docx_serialize_common(std::wostream & strm, _docx_drawing & val)
CP_XML_ATTR(L"uri", L"http://schemas.openxmlformats.org/drawingml/2006/chart");
docx_serialize_chart_child(CP_XML_STREAM(), val);
}
else if (val.type == typeGroupShape)
{
CP_XML_ATTR(L"uri", L"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup");
docx_serialize_group_child(CP_XML_STREAM(), val);
}
}
}
}
@ -435,12 +433,11 @@ 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";
if (val.styleHorizontalRel) relativeFrom =val.styleHorizontalRel->get_type_str();
CP_XML_ATTR(L"relativeFrom", relativeFrom);
if (val.styleHorizontalPos &&
@ -453,16 +450,15 @@ 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"margin";
if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str();
std::wstring relativeFrom = L"paragraph";
if (val.styleVerticalRel)relativeFrom = val.styleVerticalRel->get_type_str();
CP_XML_ATTR(L"relativeFrom",relativeFrom);
CP_XML_ATTR(L"relativeFrom", relativeFrom);
if (val.styleVerticalPos &&
val.styleVerticalPos->get_type() != odf_types::vertical_pos::FromTop &&
@ -481,17 +477,49 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
}
}
}
CP_XML_NODE(L"wp:extent")
{
CP_XML_ATTR(L"cx",val.cx);
CP_XML_ATTR(L"cy",val.cy);
CP_XML_ATTR(L"cx", val.cx);
CP_XML_ATTR(L"cy", val.cy);
}
serialize_wrap(CP_XML_STREAM(), 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"paragraph";
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);
}
}
}
}
}
}
@ -547,16 +575,65 @@ void docx_serialize_alt_content(std::wostream & strm, _docx_drawing & val)
}
}
}
void docx_serialize(std::wostream & strm, _docx_drawing & val, bool insideOtherDrawing)
void docx_serialize_object(std::wostream & strm, _docx_drawing & val)
{
if (val.inGroup)
return docx_serialize_child(strm, val);
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"w:object")
{
CP_XML_NODE(L"v:shape")
{
CP_XML_ATTR(L"id", L"ole_" + val.objectId);
CP_XML_ATTR(L"o:ole", "");
std::wstring style_str; // = L"width:730.6pt; height:261.8pt";
style_str += L"width:" + std::to_wstring(val.cx / 12700.) + L"pt;";
style_str += L"height:" + std::to_wstring(val.cy / 12700.) + L"pt;";
CP_XML_ATTR(L"style", style_str);
if (val.fill.bitmap)
{
CP_XML_NODE(L"v:imagedata")
{
CP_XML_ATTR(L"o:title", val.name);
CP_XML_ATTR(L"r:id", val.fill.bitmap->rId);
}
}
}
CP_XML_NODE(L"o:OLEObject")
{
CP_XML_ATTR(L"Type", L"Embed");
CP_XML_ATTR(L"ProgID", val.objectProgId);
CP_XML_ATTR(L"ShapeID", L"ole_" + val.objectId);
CP_XML_ATTR(L"DrawAspect", L"Content" );
CP_XML_ATTR(L"ObjectID", 0x583A3000 + val.id );
CP_XML_ATTR(L"r:id", val.objectId);
}
}
}
}
void _docx_drawing::serialize(std::wostream & strm/*, bool insideOtherDrawing*/)
{
if (type == typeUnknown) return;
if (inGroup)
return docx_serialize_child(strm, *this);
//if (insideOtherDrawing)
docx_serialize_wps(strm, val);
//else
// docx_serialize_alt_content(strm, val);
if (type == typeMsObject ||
type == typeOleObject)
{
docx_serialize_object(strm, *this);
}
else
{
//if (insideOtherDrawing)
docx_serialize_wps(strm, *this);
//else
// docx_serialize_alt_content(strm, val);
}
}

View File

@ -44,22 +44,24 @@
namespace cpdoccore {
namespace oox {
struct _docx_drawing : _oox_drawing
class _docx_drawing : public _oox_drawing
{
_docx_drawing():_oox_drawing(), parallel(0), isInline(false), number_wrapped_paragraphs(0), posOffsetV(0), posOffsetH(0)
public:
_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,16 +69,16 @@ 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;
// std::wstring distT;
// std::wstring distL;
// std::wstring distR;
int margin_rect[4]; //0-left, 1 -top, 2- right, 3 - bottom
std::wstring content_group_;
friend void docx_serialize(std::wostream & _Wostream, _docx_drawing & val, bool insideOtherDrawing);
void serialize_text (std::wostream & strm);
void serialize (std::wostream & strm/*, bool insideOtherDrawing*/);
};
}
}

View File

@ -96,8 +96,13 @@ void word_files::write(const std::wstring & RootPath)
{
media_->write( path );
}
if (embeddings_)
{
embeddings_->write( path );
}
if (headers_footers_)
if (headers_footers_)
{
headers_footers_->write( path );
}
@ -136,7 +141,15 @@ void word_files::update_rels(docx_conversion_context & Context)
void word_files::set_media(mediaitems & _Mediaitems, CApplicationFonts *pAppFonts)
{
media_ = element_ptr( new media(_Mediaitems, pAppFonts) );
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
{
media_ = element_ptr( new media(_Mediaitems, pAppFonts) );
}
if (_Mediaitems.count_object > 0)
{
embeddings_ = element_ptr( new embeddings(_Mediaitems) );
embeddings_->set_main_document( get_main_document() );
}
}
void word_files::set_styles(element_ptr Element)
@ -197,6 +210,7 @@ void docx_charts_files::add_chart(chart_content_ptr chart)
{
charts_.push_back(chart);
}
void docx_charts_files::write(const std::wstring & RootPath)
{
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"charts";

View File

@ -148,6 +148,7 @@ private:
element_ptr fontTable_;
element_ptr numbering_;
element_ptr media_;
element_ptr embeddings_;
element_ptr headers_footers_;
element_ptr notes_;
element_ptr settings_;

View File

@ -52,6 +52,8 @@ struct drawing_object_description
oox::RelsType type_;
std::wstring name_;
std::wstring descriptor_;
_CP_OPT(_rect) svg_rect_;
std::wstring anchor_;
@ -66,7 +68,6 @@ struct drawing_object_description
_oox_fill fill_;
bool use_image_replace_;
bool in_group_;
int shape_type_; //default - frame

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

@ -39,15 +39,27 @@
#include <cpdoccore/xml/utils.h>
#include "mediaitems_utils.h"
#include "../../Common/DocxFormat/Source/Base/Base.h"
#include "../../Common/DocxFormat/Source/SystemUtility/File.h"
#include "../../Common/DocxFormat/Source/SystemUtility/FileSystem/Directory.h"
#include "../../DesktopEditor/raster/ImageFileFormatChecker.h"
namespace cpdoccore {
namespace oox {
bool is_internal(const std::wstring & uri, const std::wstring & packetRoot)
{
if (uri.empty())return false;
std::wstring mediaPath = boost::regex_search(uri.begin(), uri.end(), boost::wregex(L"^/[A-Za-z]:"))
? std::wstring(uri.begin() + 1, uri.end())
: uri;
std::wstring resultPath = packetRoot + FILE_SEPARATOR_STR + mediaPath;
return FileSystem::Directory::IsExist(resultPath) || FileSystem::Directory::IsExist(mediaPath);
}
mediaitems::item::item( std::wstring const & _href,
RelsType _type,
@ -55,12 +67,12 @@ mediaitems::item::item( std::wstring const & _href,
bool _mediaInternal,
std::wstring const & _Id
)
: href(_href),
type(_type),
outputName(_outputName),
mediaInternal(_mediaInternal),
Id(_Id),
valid(true) //вообще говоря даже если файл покоцанный то мы все равно обязаны перенести "объект"
: href(_href),
type(_type),
outputName(_outputName),
mediaInternal(_mediaInternal),
Id(_Id),
valid(true) //вообще говоря даже если файл покоцанный то мы все равно обязаны перенести "объект"
{
count_add = 1;
count_used = 0;
@ -82,24 +94,36 @@ std::wstring static get_default_file_name(RelsType type)
return L"chart";
case typeMedia:
return L"media";
case typeMsObject:
return L"msObject";
case typeOleObject:
return L"oleObject";
default:
return L"";
}
}
std::wstring mediaitems::create_file_name(const std::wstring & uri, RelsType type, size_t Num)
std::wstring mediaitems::create_file_name(const std::wstring & uri, RelsType type, bool & isInternal, size_t Num)
{
if (uri.empty()) return L"";
std::wstring sExt;
std::wstring f_name = odf_packet_ + FILE_SEPARATOR_STR + uri;
sExt = detectImageFileExtension(f_name); //4EA0AA6E-479D-4002-A6AA-6D6C88EC6D65.odt - image - "opentbs_added_1.phpxvkeg" = png
if (type == typeImage)
{
sExt = detectImageFileExtension(f_name); //4EA0AA6E-479D-4002-A6AA-6D6C88EC6D65.odt - image - "opentbs_added_1.phpxvkeg" = png
}
else
{
}
if (sExt.empty())
{
int n = uri.find(L"ObjectReplacements");
if (n >= 0)
{
if (!isInternal) return L"";
f_name = odf_packet_ + uri.substr(1, uri.length() - 1);
sExt = detectImageFileExtension(f_name);
}
@ -112,8 +136,11 @@ std::wstring mediaitems::create_file_name(const std::wstring & uri, RelsType typ
sExt = uri.substr(n);
}
}
if (type == typeOleObject && sExt.empty())
sExt = L".bin";
return get_default_file_name(type) + boost::lexical_cast<std::wstring>(Num) + sExt;
return get_default_file_name(type) + std::to_wstring(Num) + sExt;
}
std::wstring mediaitems::detectImageFileExtension(std::wstring &fileName)
@ -139,7 +166,7 @@ std::wstring mediaitems::detectImageFileExtension(std::wstring &fileName)
std::wstring mediaitems::add_or_find(const std::wstring & href, RelsType type, bool & isInternal, std::wstring & ref)
{
const bool isMediaInternal = utils::media::is_internal(href, odf_packet_);
bool isMediaInternal = is_internal(href, odf_packet_);
std::wstring sub_path = L"media/";
@ -148,38 +175,49 @@ std::wstring mediaitems::add_or_find(const std::wstring & href, RelsType type, b
{
sub_path = L"charts/";
}
if ( type == typeMsObject || type == typeOleObject)
{
sub_path = L"embeddings/";
}
int number=0;
if ( type == typeChart) number= count_charts+1;
else if ( type == typeImage) number= count_image+1;
else if ( type == typeShape) number= count_shape+1;
else if ( type == typeMedia) number= count_media+1;
if ( type == typeChart) number = count_charts + 1;
else if ( type == typeImage) number = count_image + 1;
else if ( type == typeShape) number = count_shape + 1;
else if ( type == typeMedia) number = count_media + 1;
else if ( type == typeMsObject ||
type == typeOleObject) number = count_object + 1;
else
number= items_.size()+1;
number = items_.size() + 1;
inputFileName = create_file_name(href, type, number);
inputFileName = create_file_name(href, type, isMediaInternal, number);
std::wstring inputPath = isMediaInternal ? odf_packet_ + FILE_SEPARATOR_STR + href : href;
std::wstring outputPath = isMediaInternal ? ( sub_path + inputFileName) : href;
std::wstring inputPath = isMediaInternal ? odf_packet_ + FILE_SEPARATOR_STR + href : href;
std::wstring outputPath = isMediaInternal ? ( sub_path + inputFileName) : href;
if ( type == typeChart)outputPath= outputPath + L".xml";
if ( type == typeChart) outputPath = outputPath + L".xml";
std::wstring id;
BOOST_FOREACH(item & elm, items_)
for (int i = 0 ; i < items_.size(); i++)
{
if (elm.href == inputPath)
if (items_[i].href == inputPath)
{
id = elm.Id;
outputPath = elm.outputName;
elm.count_add++;
id = items_[i].Id;
outputPath = items_[i].outputName;
items_[i].count_add++;
break;
}
}
if (id.length() < 1)
ref = outputPath;
isInternal = isMediaInternal;
if (id.empty())
{
if ( type == typeChart)
{
id = std::wstring(L"chId") + boost::lexical_cast<std::wstring>(count_charts+1);
id = std::wstring(L"chId") + std::to_wstring(count_charts + 1);
count_charts++;
}
else if ( type == typeImage)
@ -190,12 +228,19 @@ std::wstring mediaitems::add_or_find(const std::wstring & href, RelsType type, b
outputPath = outputPath.substr(0, n_svm) + L".png";
}
//------------------------------------------------
id = std::wstring(L"picId") + boost::lexical_cast<std::wstring>(count_image+1);
if (inputFileName.empty()) return L"";
id = std::wstring(L"picId") + std::to_wstring(count_image + 1);
count_image++;
}
else if ( type == typeMsObject || type == typeOleObject)
{
id = std::wstring(L"objId") + std::to_wstring(count_object + 1);
count_object++;
}
else
{
id = std::wstring(L"rId") + boost::lexical_cast<std::wstring>(count_shape+1);
id = std::wstring(L"rId") + std::to_wstring(count_shape + 1);
count_shape++;
}
@ -204,22 +249,23 @@ std::wstring mediaitems::add_or_find(const std::wstring & href, RelsType type, b
ref = outputPath;
isInternal = isMediaInternal;
return id;
return id;
}
void mediaitems::dump_rels(rels & Rels)
{
size_t i = 0;
BOOST_FOREACH(item & elm, items_)
for (int i = 0; i < items_.size(); i++)
{
if (elm.count_used > elm.count_add)continue; // уже использовали этот релс выше(колонтитул ....)
Rels.add( relationship(
elm.Id,
utils::media::get_rel_type(elm.type),
elm.valid ? elm.outputName : L"NULL",
elm.mediaInternal ? L"" : L"External" )
if (items_[i].count_used > items_[i].count_add) continue; // уже использовали этот релс выше(колонтитул ....)
Rels.add( relationship(
items_[i].Id,
get_rel_type (items_[i].type),
items_[i].valid ? items_[i].outputName : L"NULL",
items_[i].mediaInternal ? L"" : L"External" )
);
elm.count_used++;
items_[i].count_used++;
}
}

View File

@ -39,7 +39,6 @@
namespace cpdoccore {
namespace oox {
class mediaitems
{
public:
@ -50,7 +49,7 @@ public:
count_image = 0;
count_tables = 0;
count_media = 0;
count_object = 0;
}
struct item
@ -77,6 +76,7 @@ public:
size_t count_media;
size_t count_shape;
size_t count_tables;
size_t count_object;
std::wstring add_or_find(const std::wstring & href, RelsType type, bool & isInternal);//возможны ссылки на один и тот же объект
std::wstring add_or_find(const std::wstring & href, RelsType type, bool & isInternal, std::wstring & ref);
@ -84,8 +84,22 @@ public:
void dump_rels(rels & Rels);
items_array & items() { return items_; }
static std::wstring get_rel_type(RelsType type)
{
switch (type)
{
case typeImage: return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
case typeChart: return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
case typeMsObject: return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
case typeOleObject: return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
case typeHyperlink: return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink";
default:
return L"";
}
}
private:
std::wstring create_file_name (const std::wstring & uri, RelsType type, size_t Num);
std::wstring create_file_name (const std::wstring & uri, RelsType type, bool & isInternal, size_t Num);
std::wstring detectImageFileExtension (std::wstring &fileName);
items_array items_;

View File

@ -1,91 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2016
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "mediaitems_utils.h"
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
#include "../../Common/DocxFormat/Source/Base/Base.h"
#include "../../Common/DocxFormat/Source/SystemUtility/FileSystem/Directory.h"
namespace cpdoccore {
namespace oox {
namespace utils {
namespace media {
bool is_internal(const std::wstring & uri, const std::wstring & packetRoot)
{
if (uri.empty())return false;
std::wstring mediaPath = boost::regex_search(uri.begin(), uri.end(), boost::wregex(L"^/[A-Za-z]:"))
? std::wstring(uri.begin() + 1, uri.end())
: uri;
std::wstring resultPath = packetRoot + FILE_SEPARATOR_STR + mediaPath;
return FileSystem::Directory::IsExist(resultPath);
}
std::wstring get_rel_type(RelsType type)
{
switch (type)
{
case typeImage:
return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
case typeChart:
return L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
default:
return L"";
}
}
std::wstring replace_extension(const std::wstring & ext)
{
// TODO
if (ext == L"jpg")
return L"jpeg";
else
return ext;
}
}
}
}
}

View File

@ -1,52 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2016
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef CPDOCCORE_MEDIAITEMS_UTILS_H_
#define CPDOCCORE_MEDIAITEMS_UTILS_H_
#include <string>
#include "mediaitems.h"
namespace cpdoccore {
namespace oox {
namespace utils {
namespace media {
bool is_internal(const std::wstring & uri, const std::wstring & packetRoot);
std::wstring get_rel_type(RelsType type);
}
}
}
}
#endif

View File

@ -31,13 +31,12 @@
*/
#include <boost/foreach.hpp>
#include <vector>
#include <cpdoccore/xml/simple_xml_writer.h>
#include "mediaitems_utils.h"
#include "oox_rels.h"
#include "oox_rels.h"
#include "oox_chart_context.h"
#include "mediaitems.h"
namespace cpdoccore {
namespace oox {
@ -87,7 +86,7 @@ void oox_chart_context::dump_rels(rels & Rels)
{
Rels.add(relationship(
r.rid,
utils::media::get_rel_type(r.type),
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
r.is_internal ? std::wstring(L"../") + r.ref : r.ref,
(r.is_internal ? L"" : L"External")
)

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

@ -37,6 +37,19 @@
namespace cpdoccore {
static const std::wstring _ooxShapeType[]=
{
L"rect", //frame
L"rect", //text box
L"rect", //shape
L"ellipse",
L"ellipse",
L"line",
L"path",
L"custGeom",//uses sub-sub type,
L"polygon",
};
void svg_path::oox_serialize(std::wostream & strm, std::vector<svg_path::_polyline> & path)
{
CP_XML_WRITER(strm)
@ -55,7 +68,7 @@ void svg_path::oox_serialize(std::wostream & strm, svg_path::_polyline const & v
{
BOOST_FOREACH(svg_path::_point const & p, val.points)
{
oox_serialize(CP_XML_STREAM() ,p);
oox_serialize(CP_XML_STREAM(), p);
}
}
}
@ -235,9 +248,9 @@ void oox_serialize_aLst(std::wostream & strm, const std::vector<odf_reader::_pro
}
}
}
void oox_serialize_bodyPr(std::wostream & strm, _oox_drawing & val, const std::wstring & namespace_)
void _oox_drawing::serialize_bodyPr(std::wostream & strm, const std::wstring & namespace_)
{
const std::vector<odf_reader::_property> & prop = val.additional;
const std::vector<odf_reader::_property> & prop = additional;
_CP_OPT(bool) bWordArt;
odf_reader::GetProperty(prop,L"wordArt", bWordArt);
@ -257,11 +270,11 @@ void oox_serialize_bodyPr(std::wostream & strm, _oox_drawing & val, const std::w
if (dPaddingTop) CP_XML_ATTR(L"tIns", (int)(*dPaddingTop));
if (dPaddingBottom) CP_XML_ATTR(L"bIns", (int)(*dPaddingBottom));
if (val.inGroup == false)
if (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;
@ -319,7 +332,7 @@ void oox_serialize_bodyPr(std::wostream & strm, _oox_drawing & val, const std::w
}
}
void oox_serialize_shape(std::wostream & strm, _oox_drawing & val)
void _oox_drawing::serialize_shape(std::wostream & strm)
{
_CP_OPT(std::wstring) strVal;
_CP_OPT(double) dVal;
@ -327,60 +340,61 @@ void oox_serialize_shape(std::wostream & strm, _oox_drawing & val)
std::wstring shapeType;
_CP_OPT(bool) bWordArt;
odf_reader::GetProperty(val.additional,L"wordArt", bWordArt);
odf_reader::GetProperty(additional,L"wordArt", bWordArt);
if (val.sub_type == 7)//custom
if (sub_type == 7)//custom
{
_CP_OPT(int) iVal;
odf_reader::GetProperty(val.additional, L"odf-custom-draw-index",iVal);
odf_reader::GetProperty(additional, L"odf-custom-draw-index",iVal);
if (iVal)
shapeType = _OO_OOX_custom_shapes[*iVal].oox;
else
val.sub_type = 6; //path
sub_type = 6; //path
if (shapeType == L"textBox")
{
val.sub_type = 1;
sub_type = 1;
shapeType = L"rect";
}
}
else if (val.sub_type < 9 && val.sub_type >= 0)
else if (sub_type < 9 && sub_type >= 0)
{
shapeType = _ooxShapeType[val.sub_type];
shapeType = _ooxShapeType[sub_type];
}
if (bWordArt) val.sub_type = 1;
if (bWordArt) sub_type = 1;
CP_XML_WRITER(strm)
{
if (val.sub_type == 6 || val.sub_type == 8)
if (sub_type == 6 || sub_type == 8)
{
CP_XML_NODE(L"a:custGeom")
{
oox_serialize_aLst(CP_XML_STREAM(), val.additional);
oox_serialize_aLst(CP_XML_STREAM(), additional);
CP_XML_NODE(L"a:ahLst");
CP_XML_NODE(L"a:gdLst");
CP_XML_NODE(L"a:rect")
{
CP_XML_ATTR(L"b",L"b");
CP_XML_ATTR(L"l",0);
CP_XML_ATTR(L"r",L"r");
CP_XML_ATTR(L"t",0);
CP_XML_ATTR(L"b", L"b");
CP_XML_ATTR(L"l", 0);
CP_XML_ATTR(L"r", L"r");
CP_XML_ATTR(L"t", 0);
}
//<a:rect b="b" l="0" r="r" t="0"/>
if (odf_reader::GetProperty(val.additional, L"custom_path", strVal))
if (odf_reader::GetProperty(additional, L"custom_path", strVal))
{
_CP_OPT(int) w, h;
odf_reader::GetProperty(val.additional, L"custom_path_w", w);
odf_reader::GetProperty(val.additional, L"custom_path_h", h);
odf_reader::GetProperty(additional, L"custom_path_w", w);
odf_reader::GetProperty(additional, L"custom_path_h", h);
CP_XML_NODE(L"a:pathLst")
{
CP_XML_NODE(L"a:path")
{
CP_XML_ATTR(L"w", w ? *w : val.cx);
CP_XML_ATTR(L"h", h ? *h : val.cy);
CP_XML_ATTR(L"w", w ? *w : cx);
CP_XML_ATTR(L"h", h ? *h : cy);
CP_XML_STREAM() << strVal.get();
}
@ -393,12 +407,12 @@ void oox_serialize_shape(std::wostream & strm, _oox_drawing & val)
if (shapeType.length() < 1)
{
shapeType = L"rect";
val.sub_type = 2;
sub_type = 2;
}
CP_XML_NODE(L"a:prstGeom")//автофигура
{
CP_XML_ATTR(L"prst", shapeType);
if (!bWordArt) oox_serialize_aLst(CP_XML_STREAM(), val.additional);
if (!bWordArt) oox_serialize_aLst(CP_XML_STREAM(), additional);
}
}
if (bWordArt)
@ -407,25 +421,25 @@ void oox_serialize_shape(std::wostream & strm, _oox_drawing & val)
oox_serialize_fill(strm, no_fill);
}
else
oox_serialize_fill(strm, val.fill);
oox_serialize_fill(strm, fill);
}
}
void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wstring name_space)
void _oox_drawing::serialize_xfrm(std::wostream & strm, const std::wstring & name_space, bool always_position)
{
CP_XML_WRITER(strm)
{
std::wstring xfrm = name_space + L":xfrm";
_CP_OPT(double) dRotate;
odf_reader::GetProperty(val.additional,L"svg:rotate",dRotate);
odf_reader::GetProperty(additional, L"svg:rotate", dRotate);
_CP_OPT(double) dSkewX;
odf_reader::GetProperty(val.additional,L"svg:skewX",dSkewX);
odf_reader::GetProperty(additional, L"svg:skewX", dSkewX);
_CP_OPT(double) dSkewY;
odf_reader::GetProperty(val.additional,L"svg:skewY",dSkewY);
odf_reader::GetProperty(additional, L"svg:skewY", dSkewY);
_CP_OPT(double) dRotateAngle;
@ -443,36 +457,44 @@ 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);
}
_CP_OPT(bool)bVal;
if (odf_reader::GetProperty(val.additional,L"flipH",bVal))
if (odf_reader::GetProperty(additional,L"flipH", bVal))
CP_XML_ATTR(L"flipH", bVal.get());
if (odf_reader::GetProperty(val.additional,L"flipV",bVal))
if (odf_reader::GetProperty(additional,L"flipV", bVal))
CP_XML_ATTR(L"flipV", bVal.get());
CP_XML_NODE(L"a:off")
{
CP_XML_ATTR(L"x", val.x);
CP_XML_ATTR(L"y", val.y);
if (inGroup || always_position)
{
CP_XML_ATTR(L"x", x);
CP_XML_ATTR(L"y", y);
}
else
{
CP_XML_ATTR(L"x", 0);
CP_XML_ATTR(L"y", 0);
}
}
if (val.cx >0 || val.cy >0)
if (cx > 0 || cy > 0)
{
CP_XML_NODE(L"a:ext")
{
CP_XML_ATTR(L"cx", val.cx);
CP_XML_ATTR(L"cy", val.cy);
CP_XML_ATTR(L"cx", cx);
CP_XML_ATTR(L"cy", cy);
}
}else
{
_CP_LOG << L"[error!!!] not set size object\n";
}
if (val.type == typeGroupShape)
if (type == typeGroupShape)
{
CP_XML_NODE(L"a:chOff")
{
@ -481,8 +503,8 @@ void oox_serialize_xfrm(std::wostream & strm, _oox_drawing & val, const std::wst
}
CP_XML_NODE(L"a:chExt")
{
CP_XML_ATTR(L"cx", val.cx);
CP_XML_ATTR(L"cy", val.cy);
CP_XML_ATTR(L"cx", cx);
CP_XML_ATTR(L"cy", cy);
}
}
}
@ -494,7 +516,7 @@ void oox_serialize_hlink(std::wostream & strm, std::vector<_hlink_desc> const &
{
BOOST_FOREACH(const _hlink_desc & h, val)
{
if (h.object == true)
if (h.in_object == true)
{
CP_XML_NODE(L"a:hlinkClick")
{

View File

@ -42,22 +42,6 @@
#include "../../../Common/DocxFormat/Source/Base/Types_32.h"
static const int _odf_to_oox_ShapeType[]=
{ 4,4,4,34,};
static const std::wstring _ooxShapeType[]=
{
L"rect", //frame
L"rect", //text box
L"rect", //shape
L"ellipse",
L"ellipse",
L"line",
L"path",
L"custGeom",//uses sub-sub type,
L"polygon",
};
namespace cpdoccore {
namespace oox {
@ -65,38 +49,47 @@ namespace oox {
{
std::wstring hId;
std::wstring hRef;
bool object;
bool in_object;
};
struct _oox_drawing
class _oox_drawing
{
public:
_oox_drawing() : type(typeUnknown), id(0), x(0), y(0), cx(0), cy(0), sub_type(0), inGroup(false), name(L"object")
{
}
RelsType type;
RelsType type;
bool inGroup;
size_t id;
bool inGroup;
size_t id;
std::wstring name;
std::wstring name;
int sub_type; //odf
_INT32 x, y;
_INT32 cx, cy;
_INT32 x, y;
_INT32 cx, cy;
_oox_fill fill;
_oox_fill fill;
int sub_type; //odf
std::wstring chartId;
std::wstring objectId;
std::wstring objectProgId;
std::vector<_hlink_desc> hlinks;
std::vector<_hlink_desc> hlinks;
std::vector<odf_reader::_property> additional;
std::vector<odf_reader::_property> additional;
virtual void serialize (std::wostream & strm) = 0;
void serialize_shape (std::wostream & strm);
void serialize_xfrm (std::wostream & strm, const std::wstring & namespace_ = L"a", bool always_position = false);
void serialize_bodyPr (std::wostream & strm, const std::wstring & namespace_ = L"a");
};
void oox_serialize_xfrm (std::wostream & strm, _oox_drawing & val, const std::wstring namespace_ = L"a");
void oox_serialize_shape (std::wostream & strm, _oox_drawing & val);
void oox_serialize_ln (std::wostream & strm, const std::vector<odf_reader::_property> & val, bool always_draw = false);
void oox_serialize_hlink (std::wostream & strm, const std::vector<_hlink_desc> & val);
void oox_serialize_bodyPr (std::wostream & strm, _oox_drawing & val, const std::wstring & namespace_ = L"a");
typedef _CP_PTR(_oox_drawing) oox_drawing_ptr;
void oox_serialize_ln (std::wostream & strm, const std::vector<odf_reader::_property> & val, bool always_draw = false);
void oox_serialize_aLst (std::wostream & strm, const std::vector<odf_reader::_property> & val);
void oox_serialize_hlink (std::wostream & strm, const std::vector<_hlink_desc> & val);
}
}

View File

@ -108,7 +108,8 @@ void oox_serialize_solid_fill(std::wostream & strm, const _oox_fill & val)
}
void oox_serialize_bitmap_fill(std::wostream & strm, const _oox_fill & val)
{
if (!val.bitmap)return;
if (!val.bitmap) return;
CP_XML_WRITER(strm)
{
CP_XML_NODE(std::wstring(val.bitmap->name_space + L":blipFill"))
@ -116,17 +117,17 @@ void oox_serialize_bitmap_fill(std::wostream & strm, const _oox_fill & val)
//if (val.bitmap->rotate) CP_XML_ATTR(L"a:rotWithShape",*(val.bitmap->rotate));
//else CP_XML_ATTR(L"a:rotWithShape",1);
if (val.bitmap->dpi) CP_XML_ATTR(L"a:dpi",*val.bitmap->dpi);
if (val.bitmap->dpi) CP_XML_ATTR(L"a:dpi", *val.bitmap->dpi);
CP_XML_NODE(L"a:blip")
{
if (val.bitmap->isInternal)
{
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"r:embed",val.bitmap->rId );
CP_XML_ATTR(L"r:embed", val.bitmap->rId );
}
else
CP_XML_ATTR(L"r:link",val.bitmap->rId );
CP_XML_ATTR(L"r:link", val.bitmap->rId );
if (val.opacity)
{
@ -151,8 +152,8 @@ void oox_serialize_bitmap_fill(std::wostream & strm, const _oox_fill & val)
CP_XML_NODE(L"a:tile")
{
//tx="0" ty="0" sx="100000" sy="100000"
CP_XML_ATTR(L"flip","none");
CP_XML_ATTR(L"algn",L"ctr");
CP_XML_ATTR(L"flip", "none");
CP_XML_ATTR(L"algn", L"ctr");
}
}
else if (val.bitmap->bStretch)
@ -173,7 +174,11 @@ void oox_serialize_bitmap_fill(std::wostream & strm, const _oox_fill & val)
}
void oox_serialize_gradient_fill(std::wostream & strm, const _oox_fill & val)
{
if (!val.gradient)return;
if (!val.gradient)
{
return;
}
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"a:gradFill")
@ -186,8 +191,8 @@ void oox_serialize_gradient_fill(std::wostream & strm, const _oox_fill & val)
{
CP_XML_NODE(L"a:gs")
{
CP_XML_ATTR(L"pos",(int)(col.pos *1000));//%
oox_serialize_srgb(CP_XML_STREAM(),col.color_ref,col.opacity);
CP_XML_ATTR(L"pos", (int)(col.pos * 1000));//%
oox_serialize_srgb(CP_XML_STREAM(), col.color_ref, col.opacity);
}
}
}
@ -234,13 +239,13 @@ void oox_serialize_hatch_fill(std::wostream & strm, const _oox_fill & val)
CP_XML_ATTR(L"prst",val.hatch->preset);
CP_XML_NODE(L"a:fgClr")//опять для ms важно что этот цвет перед back
{
oox_serialize_srgb(CP_XML_STREAM(),val.hatch->color_ref,val.opacity);
oox_serialize_srgb(CP_XML_STREAM(), val.hatch->color_ref, val.opacity);
}
if (val.hatch->color_back_ref)
{
CP_XML_NODE(L"a:bgClr")
{
oox_serialize_srgb(CP_XML_STREAM(),*val.hatch->color_back_ref,val.opacity);
oox_serialize_srgb(CP_XML_STREAM(), *val.hatch->color_back_ref ,val.opacity);
}
}

View File

@ -44,17 +44,18 @@ namespace oox {
class oox_solid_fill;
typedef _CP_PTR(oox_solid_fill) oox_solid_fill_ptr;
class oox_solid_fill
{
public:
std::wstring color;
static oox_solid_fill_ptr create();
};
///////////////////////////////////
class oox_bitmap_fill;
typedef _CP_PTR(oox_bitmap_fill) oox_bitmap_fill_ptr;
class oox_bitmap_fill
{
public:
@ -78,6 +79,7 @@ namespace oox {
/////////////////////////////////////////////////////////
class oox_hatch_fill;
typedef _CP_PTR(oox_hatch_fill) oox_hatch_fill_ptr;
class oox_hatch_fill
{
public:
@ -92,25 +94,26 @@ namespace oox {
////////////////////////////////////////////////////////////
class oox_gradient_fill;
typedef _CP_PTR(oox_gradient_fill) oox_gradient_fill_ptr;
class oox_gradient_fill
{
public:
struct _color_position
{
double pos;
std::wstring color_ref;
double pos;
std::wstring color_ref;
_CP_OPT(double) opacity;
};
static oox_gradient_fill_ptr create();
oox_gradient_fill() : style(0), angle(0)
oox_gradient_fill() : style(0), angle(90)//from top to bottom
{
memset(rect,0,sizeof(double)*4);
memset(rect, 0, sizeof(double) * 4);
}
int style;
double rect[4];
double angle;
int style;
double rect[4];
double angle;
std::vector<_color_position> colors;
@ -119,14 +122,14 @@ namespace oox {
struct _oox_fill
{
_oox_fill() : type(-1){}
oox_gradient_fill_ptr gradient;
oox_hatch_fill_ptr hatch;
oox_bitmap_fill_ptr bitmap;
oox_solid_fill_ptr solid;
_CP_OPT(double) opacity;
int type;
int type;
void clear()
{

View File

@ -61,18 +61,23 @@ 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 if (L"docx" == extension) return L"application/vnd.openxmlformats-officedocument.wordprocessingml.document";
else if (L"doc" == extension) return L"application/msword";
else return L"application/octet-stream";
return L"";
}
@ -109,14 +114,48 @@ content_type_content * content_types_file::content()
bool content_types_file::add_or_find_default(const std::wstring & extension)
{
for (int i = 0 ; i < content_type_content_.get_default().size(); i++)
std::vector<default_content_type> & defaults = content_type_content_.get_default();
for (int i = 0 ; i < defaults.size(); i++)
{
if (content_type_content_.get_default()[i].extension() == extension)
if (defaults[i].extension() == extension)
return true;
}
content_type_content_.add_default(extension, get_mime_type(extension));
return true;
}
bool content_types_file::add_or_find_override(const std::wstring & fileName)
{
std::vector<override_content_type> & override_ = content_type_content_.get_override();
for (int i = 0 ; i < override_.size(); i++)
{
if (override_[i].part_name() == fileName)
return true;
}
std::wstring content_type;
int pos = fileName.rfind(L".");
std::wstring extension = pos >= 0 ? fileName.substr(pos + 1) : L"";
if (extension == L"xlsx")
{
content_type = L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
content_type_content_.add_override(fileName, content_type);
}
if (extension == L"bin")
{
//content_type = L"application/vnd.openxmlformats-officedocument.oleObject";
add_or_find_default(extension);
}
return true;
}
void content_types_file::set_media(mediaitems & _Mediaitems)
{
BOOST_FOREACH( mediaitems::item & item, _Mediaitems.items() )
@ -280,12 +319,13 @@ void media::write(const std::wstring & RootPath)
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"media";
FileSystem::Directory::CreateDirectory(path.c_str());
BOOST_FOREACH( mediaitems::item & item, mediaitems_.items() )
mediaitems::items_array & items = mediaitems_.items();
for (int i = 0; i < items.size(); i++ )
{
if (item.mediaInternal && item.valid && item.type == typeImage )
if (items[i].mediaInternal && items[i].valid && (items[i].type == typeImage || items[i].type == typeMedia))
{
std::wstring & file_name = item.href;
std::wstring file_name_out = RootPath + FILE_SEPARATOR_STR + item.outputName;
std::wstring & file_name = items[i].href;
std::wstring file_name_out = RootPath + FILE_SEPARATOR_STR + items[i].outputName;
CImageFileFormatChecker svmFileChecker;
if (svmFileChecker.isSvmFile(file_name))
@ -293,14 +333,12 @@ void media::write(const std::wstring & RootPath)
ConvertSvmToImage(file_name, file_name_out, appFonts_);
}
else
NSFile::CFileBinary::Copy(item.href, file_name_out);
NSFile::CFileBinary::Copy(items[i].href, file_name_out);
}
}
}
///////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------------------------------------
charts::charts(mediaitems & _ChartsItems) : chartsitems_(_ChartsItems)
{
}
@ -309,6 +347,35 @@ void charts::write(const std::wstring & RootPath)
{
}
//--------------------------------------------------------------------------------------------------------------
embeddings::embeddings(mediaitems & _EmbeddingsItems) : embeddingsitems_(_EmbeddingsItems)
{
}
void embeddings::write(const std::wstring & RootPath)
{
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"embeddings";
FileSystem::Directory::CreateDirectory(path.c_str());
content_types_file & content_types = get_main_document()->get_content_types_file();
mediaitems::items_array & items = embeddingsitems_.items();
for (int i = 0; i < items.size(); i++ )
{
if ( items[i].mediaInternal && items[i].valid &&
(items[i].type == typeMsObject || items[i].type == typeOleObject))
{
int pos = items[i].outputName.rfind(L".");
std::wstring extension = pos >= 0 ? items[i].outputName.substr(pos + 1) : L"";
content_types.add_or_find_default(extension);
std::wstring file_name_out = RootPath + FILE_SEPARATOR_STR + items[i].outputName;
NSFile::CFileBinary::Copy(items[i].href, file_name_out);
}
}
}
}
}
}

View File

@ -81,6 +81,7 @@ public:
content_types_file ();
void write (const std::wstring & RootPath);
bool add_or_find_default (const std::wstring & extension);
bool add_or_find_override(const std::wstring & fileName);
void set_media (mediaitems & _Mediaitems);
content_type_content * content ();
@ -224,7 +225,18 @@ private:
mediaitems & chartsitems_;
};
class embeddings : public element
{
public:
embeddings(mediaitems & _EmbeddingsItems);
public:
virtual void write(const std::wstring & RootPath);
private:
mediaitems & embeddingsitems_;
};
} // namespace package
} // namespace oox
} // namespace cpdoccore

View File

@ -40,7 +40,20 @@
namespace cpdoccore {
namespace oox {
enum RelsType { typeUnknown = 0, typeImage, typeChart, typeShape, typeTable, typeHyperlink, typeComment, typeMedia, typeGroupShape};
enum RelsType
{
typeUnknown = 0,
typeImage,
typeChart,
typeShape,
typeTable,
typeHyperlink,
typeComment,
typeMedia,
typeGroupShape,
typeMsObject,
typeOleObject
};
struct _rel
{

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();
}
@ -514,7 +514,7 @@ void pptx_conversion_context::end_page()
}
get_slide_context().serialize_background(current_slide().Background());
get_slide_context().serialize_objects(current_slide().Data());
get_slide_context().serialize_objects (current_slide().Data());
get_slide_context().serialize_animations(current_slide().Timing());
get_slide_context().dump_rels(current_slide().Rels());//hyperlinks, mediaitems, ...
@ -543,9 +543,9 @@ std::pair<int,int> pptx_conversion_context::add_author_comments(std::wstring aut
void pptx_conversion_context::end_master()
{
get_slide_context().serialize_background(current_master().Background(),true);
get_slide_context().serialize_objects(current_master().Data());
get_slide_context().serialize_HeaderFooter(current_master().DataExtra());
get_slide_context().serialize_background (current_master().Background(),true);
get_slide_context().serialize_objects (current_master().Data());
get_slide_context().serialize_HeaderFooter (current_master().DataExtra());
get_slide_context().dump_rels(current_master().Rels());//hyperlinks, mediaitems, ...

View File

@ -61,7 +61,8 @@ void pptx_serialize_text(std::wostream & strm, _pptx_drawing & val)
{
CP_XML_NODE(L"p:txBody")
{
oox_serialize_bodyPr(CP_XML_STREAM(), val);
val.serialize_bodyPr(CP_XML_STREAM());
if (strTextContent)
{
CP_XML_STREAM() << strTextContent.get();
@ -86,10 +87,10 @@ void pptx_serialize_image(std::wostream & strm, _pptx_drawing & val)
{
CP_XML_NODE(L"p:cNvPr")
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
oox_serialize_hlink(CP_XML_STREAM(),val.hlinks);
oox_serialize_hlink(CP_XML_STREAM(), val.hlinks);
}
CP_XML_NODE(L"p:cNvPicPr")
@ -106,14 +107,14 @@ void pptx_serialize_image(std::wostream & strm, _pptx_drawing & val)
CP_XML_NODE(L"p:spPr")
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
val.serialize_xfrm(CP_XML_STREAM(), L"a", true);
CP_XML_NODE(L"a:prstGeom")
{
CP_XML_ATTR(L"prst", L"rect");
CP_XML_NODE(L"a:avLst");
}
oox_serialize_ln(CP_XML_STREAM(),val.additional);
oox_serialize_ln(CP_XML_STREAM(), val.additional);
}
//_CP_OPT(std::wstring) strTextContent;
//odf::GetProperty(properties,L"text-content",strTextContent);
@ -169,13 +170,13 @@ void pptx_serialize_shape(std::wostream & strm, _pptx_drawing & val)
if (!bNoRect)
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
val.serialize_xfrm(CP_XML_STREAM(), L"a", true);
val.serialize_shape(CP_XML_STREAM());
oox_serialize_shape(CP_XML_STREAM(),val);
oox_serialize_ln(CP_XML_STREAM(), val.additional);
}
}
pptx_serialize_text(CP_XML_STREAM(), val);
pptx_serialize_text(CP_XML_STREAM(), val);
}
} // CP_XML_WRITER
}
@ -197,7 +198,7 @@ void pptx_serialize_chart(std::wostream & strm, _pptx_drawing & val)
CP_XML_NODE(L"p:cNvGraphicFramePr");
CP_XML_NODE(L"p:nvPr");
}
oox_serialize_xfrm(CP_XML_STREAM(),val,L"p");
val.serialize_xfrm(CP_XML_STREAM(), L"p", true);
//oox_serialize_ln(CP_XML_STREAM(),val.additional);
@ -210,14 +211,13 @@ void pptx_serialize_chart(std::wostream & strm, _pptx_drawing & val)
{
CP_XML_ATTR(L"xmlns:c", L"http://schemas.openxmlformats.org/drawingml/2006/chart");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"r:id", val.chartId);
CP_XML_ATTR(L"r:id", val.objectId);
}
}
}
} // p:graphicFrame
} // CP_XML_WRITER
}
void pptx_serialize_table(std::wostream & strm, _pptx_drawing & val)
{
CP_XML_WRITER(strm)
@ -235,7 +235,7 @@ void pptx_serialize_table(std::wostream & strm, _pptx_drawing & val)
CP_XML_NODE(L"p:cNvGraphicFramePr");
CP_XML_NODE(L"p:nvPr");
}
oox_serialize_xfrm(CP_XML_STREAM(),val,L"p");
val.serialize_xfrm(CP_XML_STREAM(), L"p", true);
//oox_serialize_ln(CP_XML_STREAM(),val.additional);
@ -258,23 +258,73 @@ void pptx_serialize_table(std::wostream & strm, _pptx_drawing & val)
} // CP_XML_WRITER
}
void pptx_serialize(std::wostream & strm, _pptx_drawing & val)
void pptx_serialize_object(std::wostream & strm, _pptx_drawing & val)
{
if (val.type == typeShape)
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"p:graphicFrame")
{
CP_XML_NODE(L"p:nvGraphicFramePr")
{
CP_XML_NODE(L"p:cNvPr")
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
}
CP_XML_NODE(L"p:cNvGraphicFramePr");
CP_XML_NODE(L"p:nvPr");
}
val.serialize_xfrm(CP_XML_STREAM(), L"p", true);
//oox_serialize_ln(CP_XML_STREAM(),val.additional);
CP_XML_NODE(L"a:graphic")
{
CP_XML_NODE(L"a:graphicData")
{
CP_XML_ATTR(L"uri", L"http://schemas.openxmlformats.org/presentationml/2006/ole");
CP_XML_NODE(L"p:oleObj")
{
CP_XML_ATTR(L"r:id", val.objectId);
CP_XML_ATTR(L"progId", val.objectProgId);
CP_XML_ATTR(L"imgW", val.cx );
CP_XML_ATTR(L"imgH", val.cy );
CP_XML_NODE(L"p:embed");
val.id = 0;
pptx_serialize_image(CP_XML_STREAM(), val);
}
}
}
} // p:graphicFrame
} // CP_XML_WRITER
}
void _pptx_drawing::serialize(std::wostream & strm)
{
if (type == typeShape)
{
pptx_serialize_shape(strm,val);
pptx_serialize_shape(strm, *this);
}
else if (val.type == typeImage)
else if (type == typeImage)
{
pptx_serialize_image(strm,val);
pptx_serialize_image(strm, *this);
}
else if (val.type == typeChart)
else if (type == typeChart)
{
pptx_serialize_chart(strm,val);
pptx_serialize_chart(strm, *this);
}
else if (val.type == typeTable)
else if (type == typeTable)
{
pptx_serialize_table(strm,val);
pptx_serialize_table(strm, *this);
}
else if (type == typeMsObject ||
type == typeOleObject)
{
pptx_serialize_object(strm, *this);
}
}

View File

@ -43,13 +43,15 @@
namespace cpdoccore {
namespace oox {
struct _pptx_drawing : _oox_drawing
class _pptx_drawing : public _oox_drawing
{
_pptx_drawing(): place_holder_idx_(-1){}
std::wstring place_holder_type_;
int place_holder_idx_;
public:
_pptx_drawing(): _oox_drawing(), place_holder_idx_(-1) {}
std::wstring place_holder_type_;
int place_holder_idx_;
friend void pptx_serialize(std::wostream & _Wostream, _pptx_drawing & val);
void serialize (std::wostream & _Wostream);
};
}

View File

@ -34,7 +34,6 @@
#include <vector>
#include <cpdoccore/xml/simple_xml_writer.h>
#include "mediaitems_utils.h"
#include "oox_rels.h"
#include "pptx_drawings.h"
@ -57,18 +56,18 @@ public:
pptx_drawings_.push_back(d);
bool present = false;
BOOST_FOREACH(_rel const & r, pptx_drawing_rels_)
for (int i = 0; i < pptx_drawing_rels_.size(); i++)
{
if (r.rid == rid && r.ref == ref)
if (pptx_drawing_rels_[i].rid == rid && pptx_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
{
pptx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
BOOST_FOREACH(_hlink_desc h, d.hlinks)
for (int i = 0; i < d.hlinks.size(); i++)
{
pptx_drawing_rels_.push_back(_rel(false, h.hId, h.hRef, typeHyperlink));
pptx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink));
}
}
@ -80,21 +79,22 @@ public:
{
bool present = false;
BOOST_FOREACH(_rel const & r, pptx_drawing_rels_)
for (int i = 0; i < pptx_drawing_rels_.size(); i++)
{
if (r.rid == rid && r.ref == ref)
if (pptx_drawing_rels_[i].rid == rid && pptx_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
{
if (type == typeHyperlink) isInternal = false;
pptx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
}
void serialize(std::wostream & strm)
{
BOOST_FOREACH(_pptx_drawing & d, pptx_drawings_)
for (int i = 0; i < pptx_drawings_.size(); i++)
{
pptx_serialize(strm,d);
pptx_drawings_[i].serialize(strm);
}
}
@ -105,47 +105,28 @@ public:
void dump_rels(rels & Rels)
{
BOOST_FOREACH(_rel const & r, pptx_drawing_rels_)
for (int i = 0; i < pptx_drawing_rels_.size(); i++)
{
if (r.type == typeChart)//временно - нужно потом все загнать в релс
if (pptx_drawing_rels_[i].type == typeUnknown ||
pptx_drawing_rels_[i].type == typeTable ||
pptx_drawing_rels_[i].type == typeShape ||
pptx_drawing_rels_[i].type == typeGroupShape) continue;
if (pptx_drawing_rels_[i].type == typeComment)
{
Rels.add(relationship(
r.rid,
utils::media::get_rel_type(r.type),
(r.is_internal ? std::wstring(L"../") + r.ref : r.ref),
(r.is_internal ? L"" : L"External")
)
);
}
else if (r.type == typeImage)
{
Rels.add(relationship(
r.rid,
utils::media::get_rel_type(r.type),
r.is_internal ? std::wstring(L"../") + r.ref : r.ref,
(r.is_internal ? L"" : L"External")
)
);
}
else if (r.type == typeHyperlink)
{
Rels.add(relationship(
r.rid,
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
r.ref,
L"External")
);
}
else if (r.type == typeComment)
{
Rels.add(relationship(
r.rid,
Rels.add(relationship( pptx_drawing_rels_[i].rid,
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
r.ref)
);
pptx_drawing_rels_[i].ref) );
}
else
{
Rels.add(relationship( pptx_drawing_rels_[i].rid,
mediaitems::get_rel_type(pptx_drawing_rels_[i].type),
(pptx_drawing_rels_[i].is_internal ? std::wstring(L"../") + pptx_drawing_rels_[i].ref : pptx_drawing_rels_[i].ref),
(pptx_drawing_rels_[i].is_internal ? L"" : L"External")) );
}
}
}
}
private:

View File

@ -40,8 +40,7 @@
namespace cpdoccore {
namespace oox {
struct _pptx_drawing;
class _pptx_drawing;
class rels;
class pptx_drawings;

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

@ -33,10 +33,6 @@
#include "pptx_package.h"
#include "pptx_output_xml.h"
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/ref.hpp>
#include <cpdoccore/utf8cpp/utf8.h>
namespace cpdoccore {
@ -99,11 +95,13 @@ void slide_content::add_rel(relationship const & r)
rels_->get_rels().add(r);
}
void slide_content::add_rels(rels & r)
void slide_content::add_rels(rels & _r)
{
BOOST_FOREACH(relationship & item, r.relationships())
std::vector<relationship> & r = _r.relationships();
for (int i = 0; i < r.size(); i++)
{
rels_->get_rels().add(item);
rels_->get_rels().add(r[i]);
}
}
////////////
@ -124,33 +122,29 @@ void slides_files::write(const std::wstring & RootPath)
content_type_content * contentTypes = this->get_main_document()->get_content_types_file().content();
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.slide+xml";
size_t count = 0;
BOOST_FOREACH(const slide_content_ptr & item, slides_)
for (int i = 0; i < slides_.size(); i++)
{
if (item)
if (!slides_[i]) continue;
const std::wstring fileName = std::wstring(L"slide") + std::to_wstring( i + 1 ) + L".xml";
contentTypes->add_override(std::wstring(L"/ppt/slides/") + fileName, kWSConType);
if (rels_)
{
count++;
const std::wstring fileName = std::wstring(L"slide") + boost::lexical_cast<std::wstring>(count) + L".xml";
contentTypes->add_override(std::wstring(L"/ppt/slides/") + fileName, kWSConType);
if (rels_)
{
const std::wstring id = std::wstring(L"sId") + boost::lexical_cast<std::wstring>(count);
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide";
const std::wstring fileRef = std::wstring(L"slides/") + fileName;
rels_->add(id, kWSRel, fileRef);
}
item->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
rels_files relFiles;
relFiles.add_rel_file(item->get_rel_file());
relFiles.write(path);
package::simple_element(fileName, item->str()).write(path);
const std::wstring id = std::wstring(L"sId") + std::to_wstring( i + 1);
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide";
const std::wstring fileRef = std::wstring(L"slides/") + fileName;
rels_->add(id, kWSRel, fileRef);
}
slides_[i]->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
rels_files relFiles;
relFiles.add_rel_file(slides_[i]->get_rel_file());
relFiles.write(path);
package::simple_element(fileName, slides_[i]->str()).write(path);
}
}
@ -171,32 +165,28 @@ void slideMasters_files::write(const std::wstring & RootPath)
content_type_content * contentTypes = this->get_main_document()->get_content_types_file().content();
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml";
size_t count = 0;
BOOST_FOREACH(const slide_content_ptr & item, slides_)
for (int i = 0; i < slides_.size(); i++)
{
if (item)
if (!slides_[i]) continue;
const std::wstring fileName = std::wstring(L"slideMaster") + std::to_wstring( i + 1 ) + L".xml";
contentTypes->add_override(std::wstring(L"/ppt/slideMasters/") + fileName, kWSConType);
if (rels_)
{
count++;
const std::wstring fileName = std::wstring(L"slideMaster") + boost::lexical_cast<std::wstring>(count) + L".xml";
contentTypes->add_override(std::wstring(L"/ppt/slideMasters/") + fileName, kWSConType);
if (rels_)
{
const std::wstring id = std::wstring(L"smId") + boost::lexical_cast<std::wstring>(count);
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster";
const std::wstring fileRef = std::wstring(L"slideMasters/") + fileName;
rels_->add(id, kWSRel, fileRef);
}
item->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
rels_files relFiles;
relFiles.add_rel_file(item->get_rel_file());
relFiles.write(path);
package::simple_element(fileName, item->str()).write(path);
const std::wstring id = std::wstring(L"smId") + std::to_wstring( i + 1);
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster";
const std::wstring fileRef = std::wstring(L"slideMasters/") + fileName;
rels_->add(id, kWSRel, fileRef);
}
slides_[i]->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
rels_files relFiles;
relFiles.add_rel_file(slides_[i]->get_rel_file());
relFiles.write(path);
package::simple_element(fileName, slides_[i]->str()).write(path);
}
}
@ -214,27 +204,23 @@ void slideLayouts_files::write(const std::wstring & RootPath)
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"slideLayouts" ;
FileSystem::Directory::CreateDirectory(path.c_str());
size_t count = 0;
BOOST_FOREACH(const slide_content_ptr & item, slides_)
for (int i = 0; i < slides_.size(); i++)
{
if (item)
{
count++;
const std::wstring fileName = std::wstring(L"slideLayout") + boost::lexical_cast<std::wstring>(count) + L".xml";
const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml";
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
contentTypes->add_override(std::wstring(L"/ppt/slideLayouts/") + fileName, kWSConType);
if (!slides_[i]) continue;
item->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
rels_files relFiles;
relFiles.add_rel_file(item->get_rel_file());
relFiles.write(path);
const std::wstring fileName = std::wstring(L"slideLayout") + std::to_wstring( i + 1 ) + L".xml";
const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml";
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
contentTypes->add_override(std::wstring(L"/ppt/slideLayouts/") + fileName, kWSConType);
package::simple_element(fileName, item->str()).write(path);
}
slides_[i]->get_rel_file()->set_file_name(fileName + L".rels");//внитренние релсы
rels_files relFiles;
relFiles.add_rel_file(slides_[i]->get_rel_file());
relFiles.write(path);
package::simple_element(fileName, slides_[i]->str()).write(path);
}
}
@ -270,28 +256,24 @@ void ppt_charts_files::write(const std::wstring & RootPath)
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"charts";
FileSystem::Directory::CreateDirectory(path.c_str());
size_t count = 0;
BOOST_FOREACH(const chart_content_ptr & item, charts_)
for (int i = 0; i < charts_.size(); i++)
{
if (item)
{
count++;
const std::wstring fileName = std::wstring(L"chart") + boost::lexical_cast<std::wstring>(count) + L".xml";
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.drawingml.chart+xml";
contentTypes->add_override(std::wstring(L"/ppt/charts/") + fileName, kWSConType);
if (!charts_[i]) continue;
const std::wstring fileName = std::wstring(L"chart") + std::to_wstring( i + 1 ) + L".xml";
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.drawingml.chart+xml";
contentTypes->add_override(std::wstring(L"/ppt/charts/") + fileName, kWSConType);
package::simple_element(fileName, item->str()).write(path);
rels_files relFiles;
package::simple_element(fileName, charts_[i]->str()).write(path);
rels_files relFiles;
item->get_rel_file()->set_file_name(fileName + L".rels");
relFiles.add_rel_file(item->get_rel_file());
relFiles.write(path);
}
charts_[i]->get_rel_file()->set_file_name(fileName + L".rels");
relFiles.add_rel_file(charts_[i]->get_rel_file());
relFiles.write(path);
}
}
///////////////////////////////////
@ -304,24 +286,19 @@ void ppt_themes_files::write(const std::wstring & RootPath)
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"theme" ;
FileSystem::Directory::CreateDirectory(path.c_str());
size_t count = 0;
BOOST_FOREACH(const pptx_xml_theme_ptr & item, themes_)
for (int i = 0; i < themes_.size(); i++)
{
if (item)
{
count++;
if (!themes_[i]) continue;
const std::wstring fileName = std::wstring(L"theme") + boost::lexical_cast<std::wstring>(count) + L".xml";
const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.theme+xml";
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
contentTypes->add_override(std::wstring(L"/ppt/theme/") + fileName, kWSConType);
const std::wstring fileName = std::wstring(L"theme") + std::to_wstring( i + 1) + L".xml";
const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.theme+xml";
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
contentTypes->add_override(std::wstring(L"/ppt/theme/") + fileName, kWSConType);
std::wstringstream content;
item->write_to(content);
package::simple_element(fileName, content.str()).write(path);
}
std::wstringstream content;
themes_[i]->write_to(content);
package::simple_element(fileName, content.str()).write(path);
}
}
//////////////////////////////
@ -335,14 +312,14 @@ void ppt_comments_files::write(const std::wstring & RootPath)
std::wstring comm_path = RootPath + FILE_SEPARATOR_STR + L"comments";
FileSystem::Directory::CreateDirectory(comm_path.c_str());
BOOST_FOREACH(pptx_comment_elm const & e, comments_)
for (int i = 0; i < comments_.size(); i++)
{
content_type_content * contentTypes = get_main_document()->get_content_types_file().content();
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.presentationml.comments+xml";
contentTypes->add_override(std::wstring(L"/ppt/comments/") + e.filename, kWSConType);
contentTypes->add_override(std::wstring(L"/ppt/comments/") + comments_[i].filename, kWSConType);
package::simple_element(e.filename, e.content).write( comm_path);
package::simple_element(comments_[i].filename, comments_[i].content).write( comm_path);
}
}
////////////////////////////////////////////
@ -386,7 +363,12 @@ void ppt_files::write(const std::wstring & RootPath)
media_->set_main_document(get_main_document());
media_->write(path);
}
if (embeddings_)
{
embeddings_->set_main_document(get_main_document());
embeddings_->write(path);
}
{
charts_files_.set_main_document(get_main_document());
charts_files_.write(path);
}
@ -440,7 +422,14 @@ void ppt_files::add_slideMaster(slide_content_ptr slide)
void ppt_files::set_media(mediaitems & _Mediaitems, CApplicationFonts *pAppFonts)
{
media_ = element_ptr( new media(_Mediaitems, pAppFonts) );
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
{
media_ = element_ptr( new media(_Mediaitems, pAppFonts) );
}
if (_Mediaitems.count_object > 0)
{
embeddings_ = element_ptr( new embeddings(_Mediaitems) );
}
}
void ppt_files::set_authors_comments(pptx_xml_authors_comments_ptr & authors_comments)
{

View File

@ -238,6 +238,7 @@ private:
element_ptr comments_;
element_ptr media_;
element_ptr embeddings_;
};
// xlsx_document

View File

@ -36,8 +36,6 @@
#include <cpdoccore/xml/utils.h>
#include <cpdoccore/odf/odf_document.h>
#include "mediaitems_utils.h"
#include "pptx_drawing.h"
#include "pptx_drawings.h"
#include "pptx_slide_context.h"
@ -73,16 +71,12 @@ public:
clear();
}
drawing_object_description object_description_;
drawing_object_description object_description_;
std::vector<drawing_object_description> objects_;
std::vector<drawing_object_description> images_;
std::vector<drawing_object_description> charts_;
std::vector<drawing_object_description> shapes_;
std::vector<drawing_object_description> tables_;
_CP_OPT(_oox_fill) background_fill_;
_transition transition_;
_CP_OPT(_oox_fill) background_fill_;
_transition transition_;
bool use_image_replacement_;
bool header, footer, date_time, slideNum;
@ -111,10 +105,7 @@ public:
void clear()
{
images_.clear();
charts_.clear();
shapes_.clear();
tables_.clear();
objects_.clear();
background_fill_ = boost::none;
@ -142,14 +133,46 @@ public:
return pptx_drawings_;
}
std::wstring odfPacket_;
void process_drawings();
private:
void process_common_properties(drawing_object_description& obj,_pptx_drawing & drawing);
void process_shape (drawing_object_description& obj, _pptx_drawing & drawing);
void process_image (drawing_object_description& obj, _pptx_drawing & drawing);
void process_chart (drawing_object_description& obj, _pptx_drawing & drawing);
void process_table (drawing_object_description& obj, _pptx_drawing & drawing);
void process_object (drawing_object_description& obj, _pptx_drawing & drawing);
size_t rId_;
mediaitems mediaitems_;
pptx_drawings_ptr pptx_drawings_;
};
void pptx_slide_context::Impl::process_drawings()
{
for (int i = 0; i < objects_.size(); i++)
{
_pptx_drawing drawing =_pptx_drawing();
drawing.type = objects_[i].type_;
drawing.name = objects_[i].name_;
drawing.id = next_rId();
process_common_properties(objects_[i], drawing);
switch(objects_[i].type_)
{
case typeImage: process_image(objects_[i], drawing); break;
case typeChart: process_chart(objects_[i], drawing); break;
case typeShape: process_shape(objects_[i], drawing); break;
case typeTable: process_table(objects_[i], drawing); break;
case typeMsObject:
case typeOleObject: process_object(objects_[i], drawing); break;
}
}
}
pptx_slide_context::pptx_slide_context(pptx_conversion_context & Context)
: impl_(new pptx_slide_context::Impl(Context.root()->get_folder()))
@ -200,12 +223,11 @@ void pptx_slide_context::set_transitionSpeed(std::wstring val)
/////////////////////////////////////////////////////////////////////////////////////////////////
void pptx_slide_context::default_set()
{
impl_->object_description_.xlink_href_ = L"";
impl_->object_description_.name_ = L"";
impl_->object_description_.xlink_href_ = L"";
impl_->object_description_.name_ = L"";
impl_->object_description_.descriptor_ = L"";
impl_->object_description_.anchor_ = L"";
impl_->object_description_.additional_.clear();
impl_->object_description_.anchor_ =L"";
impl_->object_description_.clipping_string_= L"";
impl_->object_description_.svg_rect_ = boost::none;
@ -215,7 +237,12 @@ void pptx_slide_context::default_set()
impl_->object_description_.fill_.clear();
impl_->object_description_.use_image_replace_ = false;
impl_->use_image_replacement_ = false;
}
void pptx_slide_context::set_use_image_replacement()
{
impl_->use_image_replacement_ = true;
}
void pptx_slide_context::set_placeHolder_type(std::wstring typeHolder)
@ -341,54 +368,72 @@ void pptx_slide_context::start_shape(int type)
impl_->object_description_.shape_type_ = type; //2,3...
}
void pptx_slide_context::start_image(std::wstring const & path)
{
impl_->object_description_.type_ = typeImage;
impl_->object_description_.xlink_href_ = path;
}
void pptx_slide_context::start_table()
{
impl_->object_description_.type_ = typeTable;
impl_->object_description_.type_ = typeTable;
}
void pptx_slide_context::set_use_image_replacement()
void pptx_slide_context::set_text_box()
{
impl_->object_description_.use_image_replace_ = true;
impl_->object_description_.type_ = typeShape;
impl_->object_description_.shape_type_ = 2; //2,3...
}
void pptx_slide_context::start_object_ole()
void pptx_slide_context::set_ms_object(const std::wstring & path, const std::wstring & progId)
{
impl_->object_description_.type_ = typeMsObject;
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void pptx_slide_context::set_ole_object(const std::wstring & path, const std::wstring & progId)
{
impl_->object_description_.type_ = typeOleObject;
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void pptx_slide_context::start_chart(std::wstring const & path)
void pptx_slide_context::set_image(const std::wstring & path)
{
if (impl_->object_description_.type_ == typeUnknown)
{
impl_->object_description_.type_ = typeImage;
impl_->object_description_.xlink_href_ = path;
}
else if (impl_->use_image_replacement_)
{
impl_->object_description_.fill_.type = 2;
impl_->object_description_.fill_.bitmap = oox::oox_bitmap_fill::create();
impl_->object_description_.fill_.bitmap->xlink_href_ = path;
impl_->object_description_.fill_.bitmap->bStretch = true;
}
}
void pptx_slide_context::start_frame()
{
impl_->object_description_.type_ = typeUnknown;
}
void pptx_slide_context::set_chart(const std::wstring & path)
{
impl_->object_description_.type_ = typeChart;
impl_->object_description_.xlink_href_ = path;
}
void pptx_slide_context::end_object_ole()
void pptx_slide_context::end_frame()
{
}
void pptx_slide_context::end_shape()
{
impl_->shapes_.push_back(impl_->object_description_);
impl_->objects_.push_back(impl_->object_description_);
default_set();
}
void pptx_slide_context::end_image()
void pptx_slide_context::end_shape()
{
impl_->images_.push_back(impl_->object_description_);
default_set();
}
void pptx_slide_context::end_chart()
{
impl_->charts_.push_back(impl_->object_description_);
impl_->objects_.push_back(impl_->object_description_);
default_set();
}
void pptx_slide_context::end_table()
{
impl_->tables_.push_back(impl_->object_description_);
impl_->objects_.push_back(impl_->object_description_);
default_set();
}
@ -399,112 +444,115 @@ bool pptx_slide_context::empty() const
void pptx_slide_context::process_drawings()
{
process_shapes();
process_images();
process_tables();
process_charts();
return impl_->process_drawings();
}
void pptx_slide_context::process_images()
void pptx_slide_context::Impl::process_image(drawing_object_description& pic, _pptx_drawing & drawing)
{
int pos_replaicement=0, pos_preview=0;
int pos_replaicement = 0, pos_preview = 0;
BOOST_FOREACH(drawing_object_description & pic, impl_->images_)
{
pos_replaicement = pic.xlink_href_.find(L"ObjectReplacements");
pos_preview = pic.xlink_href_.find(L"TablePreview");
if ((pos_replaicement <0 && pos_preview <0) || pic.use_image_replace_)//оригинал, а не заменяемый объект (при наличии объекта)
{
_pptx_drawing drawing =_pptx_drawing();
drawing.type = pic.type_;
drawing.name = pic.name_;
drawing.id = impl_->next_rId();
process_common_properties(pic,drawing);
drawing.fill.bitmap = oox_bitmap_fill::create();
drawing.fill.type = 2;
_CP_OPT(std::wstring) sTextContent;
GetProperty(pic.additional_,L"text-content",sTextContent);
if (sTextContent)//в ms office на картинке нельзя сделать надпись - меняем тип на рект с заливкой картинкой
{
drawing.type = typeShape;
drawing.sub_type = 2;//rect
}
drawing.fill.bitmap = oox_bitmap_fill::create();
drawing.fill.type = 2;
_CP_OPT(std::wstring) sTextContent;
GetProperty(pic.additional_, L"text-content", sTextContent);
if (sTextContent)//в ms office на картинке нельзя сделать надпись - меняем тип на рект с заливкой картинкой
{
drawing.type = typeShape;
drawing.sub_type = 2;//rect
}
std::wstring fileName = impl_->odfPacket_ + FILE_SEPARATOR_STR + pic.xlink_href_;
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(pic.clipping_string_,fileName,drawing.fill.bitmap->cropRect, NULL);
drawing.fill.bitmap->bStretch = true;
std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + pic.xlink_href_;
drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(pic.clipping_string_,fileName,drawing.fill.bitmap->cropRect, NULL);
drawing.fill.bitmap->bStretch = true;
///////////////////////////////////////////////////////////////////////////////////////////////////
std::wstring ref;/// это ссылка на выходной внешний объект
bool isMediaInternal = false;
drawing.fill.bitmap->rId = impl_->get_mediaitems().add_or_find(pic.xlink_href_, typeImage, isMediaInternal, ref);
if (drawing.type == typeShape)
{
impl_->add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);//собственно это не объект, а доп рел и ref объекта
isMediaInternal = true;
std::wstring rId = impl_->get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
impl_->add_drawing(drawing, isMediaInternal, rId, ref, typeShape);//объект
std::wstring ref;/// это ссылка на выходной внешний объект
bool isMediaInternal = false;
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(pic.xlink_href_, typeImage, isMediaInternal, ref);
if (drawing.type == typeShape)
{
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);//собственно это не объект, а доп рел и ref объекта
isMediaInternal = true;
std::wstring rId = get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
add_drawing(drawing, isMediaInternal, rId, ref, typeShape);//объект
}else
{
impl_->add_drawing(drawing, isMediaInternal, drawing.fill.bitmap->rId , ref, drawing.type);//объект
}
}
}
}else if (!drawing.fill.bitmap->rId.empty())
{
add_drawing(drawing, isMediaInternal, drawing.fill.bitmap->rId , ref, drawing.type);//объект
}
}
void pptx_slide_context::process_charts()
void pptx_slide_context::Impl::process_chart(drawing_object_description & obj, _pptx_drawing & drawing)
{
BOOST_FOREACH(drawing_object_description & pic, impl_->charts_)
{
_pptx_drawing drawing=_pptx_drawing();
drawing.type = pic.type_;
drawing.name = pic.name_;
drawing.id = impl_->next_rId();
process_common_properties(pic,drawing);
////////////////////////////////////////////////////////////////
std::wstring ref;
bool isMediaInternal = true;
drawing.chartId = impl_->get_mediaitems().add_or_find(pic.xlink_href_, typeChart, isMediaInternal, ref);
impl_->add_drawing(drawing, isMediaInternal, drawing.chartId, ref, typeChart);
}
std::wstring ref;
bool isMediaInternal = true;
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
}
void pptx_slide_context::process_tables()
void pptx_slide_context::Impl::process_table(drawing_object_description & obj, _pptx_drawing & drawing)
{
BOOST_FOREACH(drawing_object_description & pic, impl_->tables_)
{
_pptx_drawing drawing=_pptx_drawing();
drawing.type = pic.type_;
drawing.name = pic.name_;
drawing.id = impl_->next_rId();
process_common_properties(pic,drawing);
////////////////////////////////////////////////////////////////
std::wstring ref;
bool isMediaInternal = true;
std::wstring rId = impl_->get_mediaitems().add_or_find(L"", typeTable, isMediaInternal, ref);
impl_->add_drawing(drawing, isMediaInternal, rId, ref, typeTable);
}
std::wstring ref;
bool isMediaInternal = true;
std::wstring rId = get_mediaitems().add_or_find(L"", obj.type_, isMediaInternal, ref);
add_drawing(drawing, isMediaInternal, rId, ref, drawing.type);
}
void pptx_slide_context::process_common_properties(drawing_object_description & pic,_pptx_drawing & drawing)
void pptx_slide_context::Impl::process_shape(drawing_object_description & obj, _pptx_drawing & drawing)
{
int PlaceHolderIndex = 1;
std::wstring ref;
bool isMediaInternal = true;
if (drawing.fill.bitmap)
{
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);
}
std::wstring rId = get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
////////////////////////////////////////////////////////////////
_CP_OPT(std::wstring) sPlaceHolderType;
GetProperty(obj.additional_, L"PlaceHolderType", sPlaceHolderType);
if (sPlaceHolderType)
{
drawing.place_holder_type_ = *sPlaceHolderType;
_CP_OPT(int) iPlaceHolderIdx;
GetProperty(obj.additional_, L"PlaceHolderIdx", iPlaceHolderIdx);
if (iPlaceHolderIdx) drawing.place_holder_idx_ = *iPlaceHolderIdx;
}
drawing.sub_type = obj.shape_type_;
add_drawing(drawing, isMediaInternal, rId, ref, typeShape);
}
void pptx_slide_context::Impl::process_object(drawing_object_description& obj, _pptx_drawing & drawing)
{
std::wstring ref;
bool isMediaInternal = true;
drawing.objectId = get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectProgId = obj.descriptor_;
add_drawing(drawing, isMediaInternal, drawing.objectId, ref, drawing.type);
if (drawing.fill.bitmap)
{
drawing.fill.bitmap->rId = get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);
}
}
void pptx_slide_context::Impl::process_common_properties(drawing_object_description & pic, _pptx_drawing & drawing)
{
if (pic.svg_rect_)
{
@ -529,47 +577,6 @@ void pptx_slide_context::process_common_properties(drawing_object_description &
drawing.fill = pic.fill_;
}
void pptx_slide_context::process_shapes()
{
int PlaceHolderIndex = 1;
BOOST_FOREACH(drawing_object_description & pic, impl_->shapes_)
{
_pptx_drawing drawing=_pptx_drawing();
drawing.type = pic.type_;
drawing.name = pic.name_;
drawing.id = impl_->next_rId();
process_common_properties(pic,drawing);
std::wstring ref;
bool isMediaInternal = true;
if (drawing.fill.bitmap)
{
drawing.fill.bitmap->rId = impl_->get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
impl_->add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);
}
std::wstring rId = impl_->get_mediaitems().add_or_find(L"", typeShape, isMediaInternal, ref);
////////////////////////////////////////////////////////////////
_CP_OPT(std::wstring) sPlaceHolderType;
GetProperty(pic.additional_,L"PlaceHolderType",sPlaceHolderType);
if (sPlaceHolderType)
{
drawing.place_holder_type_ = *sPlaceHolderType;
_CP_OPT(int) iPlaceHolderIdx;
GetProperty(pic.additional_,L"PlaceHolderIdx",iPlaceHolderIdx);
if (iPlaceHolderIdx) drawing.place_holder_idx_ = *iPlaceHolderIdx;
}
drawing.sub_type = pic.shape_type_;
impl_->add_drawing(drawing, isMediaInternal, rId, ref, typeShape);
}
}
void pptx_slide_context::dump_rels(rels & Rels)
{
@ -627,7 +634,6 @@ void pptx_slide_context::serialize_background(std::wostream & strm, bool always)
void pptx_slide_context::serialize_animations(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
if (impl_->transition_.Enabled)
@ -707,10 +713,10 @@ void pptx_slide_context::serialize_objects(std::wostream & strm)
{
CP_XML_NODE(L"a:xfrm")
{
CP_XML_NODE(L"a:off") {CP_XML_ATTR(L"x",0); CP_XML_ATTR(L"y",0);}
CP_XML_NODE(L"a:ext") {CP_XML_ATTR(L"cx",0); CP_XML_ATTR(L"cy",0);}
CP_XML_NODE(L"a:chOff") {CP_XML_ATTR(L"x",0); CP_XML_ATTR(L"y",0);}
CP_XML_NODE(L"a:chExt") {CP_XML_ATTR(L"cx",0); CP_XML_ATTR(L"cy",0);}
CP_XML_NODE(L"a:off") { CP_XML_ATTR(L"x", 0); CP_XML_ATTR(L"y", 0); }
CP_XML_NODE(L"a:ext") { CP_XML_ATTR(L"cx",0); CP_XML_ATTR(L"cy",0); }
CP_XML_NODE(L"a:chOff") { CP_XML_ATTR(L"x", 0); CP_XML_ATTR(L"y", 0); }
CP_XML_NODE(L"a:chExt") { CP_XML_ATTR(L"cx",0); CP_XML_ATTR(L"cy",0); }
}
}
}

View File

@ -50,38 +50,40 @@ public:
pptx_slide_context(pptx_conversion_context & Context);
void start_slide();
void end_slide(){}
void end_slide (){}
////////////////////////////////////////////////////////////////////////////////////////
void start_slide_animation();
void end_slide_animation(){}
void start_slide_animation ();
void end_slide_animation (){}
void set_transitionFilter(std::wstring & type,_CP_OPT(std::wstring) & dir, _CP_OPT(std::wstring) & dop, _CP_OPT(int) & time);
void set_transitionAction(bool val);
void set_transitionSpeed(std::wstring val);
void set_transitionFilter (std::wstring & type,_CP_OPT(std::wstring) & dir, _CP_OPT(std::wstring) & dop, _CP_OPT(int) & time);
void set_transitionAction (bool val);
void set_transitionSpeed (std::wstring val);
///////////////////////////////////////////////////////////////////////////////////////////
void set_rect(double width_pt, double height_pt, double x_pt, double y_pt);
void set_rect (double width_pt, double height_pt, double x_pt, double y_pt);
void set_translate(double x_pt, double y_pt);
void set_scale(double cx_pt, double cy_pt);
void set_rotate(double angle);
void set_translate (double x_pt, double y_pt);
void set_scale (double cx_pt, double cy_pt);
void set_rotate (double angle);
void set_name(std::wstring const & name);
void set_anchor(std::wstring anchor, double x_pt, double y_pt);
void set_property(odf_reader::_property p);
void set_name (std::wstring const & name);
void set_anchor (std::wstring anchor, double x_pt, double y_pt);
void set_property (odf_reader::_property p);
std::vector<odf_reader::_property> & get_properties();
void set_clipping(const std::wstring & str );
void set_fill(_oox_fill & fill);
void set_clipping (const std::wstring & str );
void set_fill (_oox_fill & fill);
void set_placeHolder_type(std::wstring typeHolder);
void set_placeHolder_idx(int idx);
void set_placeHolder_type (std::wstring typeHolder);
void set_placeHolder_idx (int idx);
std::wstring add_hyperlink(std::wstring const & ref, bool object);
void start_image(std::wstring const & path);
void end_image();
void start_chart(std::wstring const & path);
void end_chart();
void start_frame();
void set_image (const std::wstring & path);
void set_chart (const std::wstring & path);
void set_ms_object (const std::wstring & path, const std::wstring & progId);
void set_ole_object (const std::wstring & path, const std::wstring & progId);
void set_text_box ();
void end_frame();
void start_table();
void end_table();
@ -89,9 +91,6 @@ public:
void start_shape(int type);
void end_shape();
void start_object_ole();
void end_object_ole();
void set_use_image_replacement();
bool empty() const;
@ -109,7 +108,6 @@ public:
void add_background(_oox_fill & fill);
void add_rels( bool isInternal,
std::wstring const & rid,
std::wstring const & ref,
@ -121,13 +119,7 @@ public:
void set_page_number();
void set_date_time();
private:
void process_common_properties(drawing_object_description& pic,_pptx_drawing & drawing);
void default_set();
void process_shapes();
void process_images();
void process_charts();
void process_tables();
int hlinks_size_;

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 )
{
@ -399,9 +400,10 @@ void pptx_text_context::Impl::write_t(std::wostream & strm)
void pptx_text_context::Impl::write_rPr(std::wostream & strm)
{
if (paragraph_style_name_.length()<1 && span_style_name_.length()<1 && !(hyperlink_hId.length()>0) && base_style_name_.length()<1)return;
if (paragraph_style_name_.empty() && span_style_name_.empty() && !(!hyperlink_hId.empty()) && base_style_name_.empty())
return;
odf_reader::text_format_properties_content text_properties_paragraph_;
odf_reader::text_format_properties_content text_properties_paragraph_;
ApplyTextProperties (paragraph_style_name_, text_properties_paragraph_,odf_types::style_family::Paragraph);
odf_reader::text_format_properties_content text_properties_span_;
@ -415,6 +417,7 @@ void pptx_text_context::Impl::write_rPr(std::wostream & strm)
get_styles_context().start();
get_styles_context().hlinkClick() = hyperlink_hId;
text_properties_.pptx_convert(pptx_context_);
strm << get_styles_context().text_style().str();

View File

@ -34,10 +34,10 @@
#include "xlsx_utils.h"
#include <vector>
#include <boost/lexical_cast.hpp>
#include <cpdoccore/xml/simple_xml_writer.h>
#include "../formulasconvert/formulasconvert.h"
namespace cpdoccore {
namespace oox {
@ -82,6 +82,9 @@ namespace oox {
//expr
_CP_OPT(std::wstring) formula;
_CP_OPT(std::wstring) formula_type;
_CP_OPT(std::wstring) text;
_CP_OPT(std::wstring) formula2;
_CP_OPT(int) rank;
//color scale icon set data_bar
std::vector<_cfvo> cfvo;
//color scale data_bar(1 element)
@ -131,26 +134,33 @@ public:
{
CP_XML_ATTR(L"priority", priority++);
if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId);
if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent);
if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_);
if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue);
//CP_XML_ATTR(L"text" , L"");
//CP_XML_ATTR(L"rank" , 0);
if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId);
if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent);
if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_);
if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue);
if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text);
if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank);
//CP_XML_ATTR(L"bottom" , 0);
//CP_XML_ATTR(L"equalAverage" , 0);
//CP_XML_ATTR(L"aboveAverage" , 0);
if (c.rules[j].type == 1)
{
CP_XML_ATTR(L"type", *c.rules[j].formula_type);
if (c.rules[j].formula)
if ((c.rules[j].formula) && (!c.rules[j].formula->empty()))
{
CP_XML_NODE(L"formula")
{
CP_XML_CONTENT(*c.rules[j].formula);
}
}
if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty()))
{
CP_XML_NODE(L"formula")
{
CP_XML_CONTENT(*c.rules[j].formula2);
}
}
}
else if (c.rules[j].type == 2)
{
@ -233,7 +243,7 @@ void xlsx_conditionalFormatting_context::add(std::wstring ref)
formulasconvert::odf2oox_converter converter;
impl_->conditionalFormattings_.push_back(conditionalFormatting());
impl_->conditionalFormattings_.back().ref = converter.convert_named_ref(ref, false);
impl_->conditionalFormattings_.back().ref = converter.convert_named_ref(ref, false, L";");
}
void xlsx_conditionalFormatting_context::add_rule(int type)
@ -244,18 +254,54 @@ void xlsx_conditionalFormatting_context::add_rule(int type)
}
void xlsx_conditionalFormatting_context::set_formula(std::wstring f)
{
formulasconvert::odf2oox_converter converter;
int pos = -1;
std::wstring val;
if ( 0 <= (pos = f.find(L"formula-is(")))
{
impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression";
val = f.substr(11, f.size() - 12);
if (0 == (pos = val.find(L"\""))) //Raport_7A.ods или выкинуть ограждающие кавычки с формулы?
{
impl_->conditionalFormattings_.back().rules.back().text = val;
val.clear();
}
impl_->conditionalFormattings_.back().rules.back().formula = converter.convert(val);
}
else if (0 <= (pos = f.find(L"is-between(")))
{
impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression";
impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val);
}
else if (0 <= (pos = f.find(L"is-time(")))
{
impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression";
impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val);
}
else if (0 <= (pos = f.find(L"duplicate")))
{
impl_->conditionalFormattings_.back().rules.back().formula_type = L"duplicateValues";
}
else if (0 <= (pos = f.find(L"top")))
{
impl_->conditionalFormattings_.back().rules.back().formula_type = L"top10";
if (0 < (pos = f.find(L"percent")))
{
impl_->conditionalFormattings_.back().rules.back().percent = true;
}
if (0 <= (pos = f.find(L"(")))
{
val = f.substr(pos + 1, f.length() - pos - 2);
impl_->conditionalFormattings_.back().rules.back().rank = boost::lexical_cast<int>(val);
}
}
else if (0 <= (pos = f.find(L"contains-text")))
{
impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsText";
impl_->conditionalFormattings_.back().rules.back().text = f.substr(15, f.length() - 17);
}
else
{
@ -263,54 +309,66 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f)
if (0 <= (pos = f.find(L"!empty")))
{
val = converter.convert_named_expr( f );
}
else if (0 <= (pos = f.find(L"empty")))
{
val = converter.convert_named_expr( f );
}
else if (0 <= (pos = f.find(L"bottom")))
{
}
else if (0 <= (pos = f.find(L"top")))
{
val = converter.convert_named_expr( f );
}
else if (0 <= (pos = f.find(L"!=")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"notEqual";
val = f.substr(2);
val = converter.convert_named_expr( f.substr(2) );
}
else if (0 <= (pos = f.find(L"<=")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"lessThanOrEqual";
val = f.substr(2);
val = converter.convert_named_expr( f.substr(2) );
}
else if (0 <= (pos = f.find(L">=")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"greaterThanOrEqual";
val = f.substr(2);
val = converter.convert_named_expr( f.substr(2) );
}
else if (0 <= (pos = f.find(L"=")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"equal";
val = f.substr(1);
val = converter.convert_named_expr( f.substr(1) );
}
else if (0 <= (pos = f.find(L"<")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"lessThan";
val = f.substr(1);
val = converter.convert_named_expr( f.substr(1) );
}
else if (0 <= (pos = f.find(L">")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"greaterThan";
val = f.substr(1);
val = converter.convert_named_expr( f.substr(1) );
}
else if (0 <= (pos = f.find(L"between")))
{
impl_->conditionalFormattings_.back().rules.back().operator_ = L"between";
val = f.substr(8, f.length() - 9);
if (0 <= (pos = val.find(L",")))
{
impl_->conditionalFormattings_.back().rules.back().formula2 = converter.convert_named_expr( val.substr(pos + 1) );
val = val.substr(0, pos);
}
val = converter.convert_named_expr( val );
}
else
{
val = f;
val = converter.convert( f );
}
}
formulasconvert::odf2oox_converter converter;
impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val);
if (!val.empty())
impl_->conditionalFormattings_.back().rules.back().formula = val;
}
}
void xlsx_conditionalFormatting_context::set_dataBar(_CP_OPT(int) min, _CP_OPT(int) max)
{

View File

@ -48,7 +48,7 @@ std::wostream & operator << (std::wostream & strm, xlsx_drawing_position::type_t
}
}
void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val )
void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val)
{
_CP_OPT(std::wstring) strTextContent;
odf_reader::GetProperty ( val.additional ,L"text-content", strTextContent);
@ -60,7 +60,8 @@ void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val )
{
CP_XML_NODE(L"xdr:txBody")
{
oox_serialize_bodyPr(CP_XML_STREAM(), val);
val.serialize_bodyPr(CP_XML_STREAM());
CP_XML_NODE(L"a:lstStyle");
if (strTextContent)
{
@ -70,30 +71,30 @@ void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val )
}
}
void xlsx_serialize(std::wostream & strm, const xlsx_drawing_position & val)
void xlsx_drawing_position::serialize(std::wostream & strm, std::wstring ns)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(std::wstring(L"xdr:") + (val.type == xlsx_drawing_position::from ? L"from" : L"to") )
CP_XML_NODE( ns + (type == xlsx_drawing_position::from ? L"from" : L"to") )
{
CP_XML_NODE(L"xdr:col")
{
CP_XML_CONTENT(val.position.col);
CP_XML_CONTENT(position.col);
}
CP_XML_NODE(L"xdr:colOff")
{
CP_XML_CONTENT(static_cast<size_t>(val.position.colOff));
CP_XML_CONTENT(static_cast<size_t>(position.colOff));
}
CP_XML_NODE(L"xdr:row")
{
CP_XML_CONTENT(val.position.row);
CP_XML_CONTENT(position.row);
}
CP_XML_NODE(L"xdr:rowOff")
{
CP_XML_CONTENT(static_cast<size_t>(val.position.rowOff));
CP_XML_CONTENT(static_cast<size_t>(position.rowOff));
}
}
}
@ -129,7 +130,7 @@ void xlsx_serialize_image(std::wostream & strm, _xlsx_drawing & val)
CP_XML_NODE(L"xdr:spPr")
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
val.serialize_xfrm(CP_XML_STREAM());
CP_XML_NODE(L"a:prstGeom")
{
@ -166,9 +167,9 @@ void xlsx_serialize_shape(std::wostream & strm, _xlsx_drawing & val)
} // xdr:nv_Pr
CP_XML_NODE(L"xdr:spPr")
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
val.serialize_xfrm(CP_XML_STREAM());
oox_serialize_shape(CP_XML_STREAM(),val);
val.serialize_shape(CP_XML_STREAM());
bool draw_always = false;
if (val.sub_type == 5 || val.sub_type == 6)//line собственно ) - если ее нет - в свойствах будет
@ -181,6 +182,34 @@ void xlsx_serialize_shape(std::wostream & strm, _xlsx_drawing & val)
}
} // CP_XML_WRITER
}
void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
{//отображательная часть
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:sp")
{
CP_XML_NODE(L"xdr:nvSpPr")
{
CP_XML_NODE(L"xdr:cNvPr")
{
CP_XML_ATTR(L"id", val.id); //числовое значение val.rId
CP_XML_ATTR(L"name", val.name);
}
CP_XML_NODE(L"xdr:cNvSpPr");
}
CP_XML_NODE(L"xdr:spPr")
{
val.serialize_xfrm(CP_XML_STREAM());
CP_XML_NODE(L"a:prstGeom")
{
CP_XML_ATTR(L"prst", L"rect");
}
}
}
}
}
void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_WRITER(strm)
@ -191,14 +220,14 @@ void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_NODE(L"xdr:cNvPr")
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
}
CP_XML_NODE(L"xdr:cNvGrpSpPr");
}
CP_XML_NODE(L"xdr:grpSpPr")
{
oox_serialize_xfrm(CP_XML_STREAM(),val);
val.serialize_xfrm(CP_XML_STREAM());
}
CP_XML_STREAM() << val.content_group_;
@ -207,7 +236,7 @@ void xlsx_serialize_group(std::wostream & strm, _xlsx_drawing & val)
}
void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
{
{//отображательная часть
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:graphicFrame")
@ -216,14 +245,13 @@ void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_NODE(L"xdr:cNvPr")
{
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
CP_XML_ATTR(L"id", val.id);
CP_XML_ATTR(L"name", val.name);
}
CP_XML_NODE(L"xdr:cNvGraphicFramePr");
}
oox_serialize_xfrm(CP_XML_STREAM(),val,L"xdr");
val.serialize_xfrm(CP_XML_STREAM(), L"xdr");
//oox_serialize_ln(CP_XML_STREAM(),val.additional);
CP_XML_NODE(L"a:graphic")
@ -235,14 +263,14 @@ void xlsx_serialize_chart(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_ATTR(L"xmlns:c", L"http://schemas.openxmlformats.org/drawingml/2006/chart");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"r:id", val.chartId);
CP_XML_ATTR(L"r:id", val.objectId);
}
}
}
} // xdr:graphicFrame
} // CP_XML_WRITER
}
}
}
void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
void xlsx_serialize(std::wostream & strm, _xlsx_drawing & val)
{
if (val.type == typeShape)
{
@ -260,24 +288,30 @@ void xlsx_serialize_object(std::wostream & strm, _xlsx_drawing & val)
{
xlsx_serialize_group(strm, val);
}
else if (val.type == typeOleObject ||
val.type == typeMsObject )
{
xlsx_serialize_object(strm, val);
}
}
void xlsx_serialize(std::wostream & strm, _xlsx_drawing & val)
void _xlsx_drawing::serialize(std::wostream & strm)
{
if (val.inGroup) return xlsx_serialize_object(strm, val);
if (inGroup)
return xlsx_serialize(strm, *this);
CP_XML_WRITER(strm)
{
if (val.type_anchor == 1)
if (type_anchor == 1)
{
CP_XML_NODE(L"xdr:twoCellAnchor")
{
CP_XML_ATTR(L"editAs", L"oneCell");//"absolute");oneCell
xlsx_serialize (CP_XML_STREAM(), val.from_);
xlsx_serialize (CP_XML_STREAM(), val.to_);
from_.serialize (CP_XML_STREAM());
to_.serialize (CP_XML_STREAM());
xlsx_serialize_object (CP_XML_STREAM(),val);
xlsx_serialize (CP_XML_STREAM(), *this);
CP_XML_NODE(L"xdr:clientData");
}
}
@ -287,18 +321,15 @@ void xlsx_serialize(std::wostream & strm, _xlsx_drawing & val)
{
CP_XML_NODE(L"xdr:pos")
{
CP_XML_ATTR(L"x", val.x);
CP_XML_ATTR(L"y", val.y);
CP_XML_ATTR(L"x", x);
CP_XML_ATTR(L"y", y);
}
CP_XML_NODE(L"xdr:ext")
{
CP_XML_ATTR(L"cx", val.cx);
CP_XML_ATTR(L"cy", val.cy);
CP_XML_ATTR(L"cx", cx);
CP_XML_ATTR(L"cy", cy);
}
xlsx_serialize_object (CP_XML_STREAM(),val);
xlsx_serialize(CP_XML_STREAM(), *this);
CP_XML_NODE(L"xdr:clientData");
}
}
@ -307,5 +338,38 @@ void xlsx_serialize(std::wostream & strm, _xlsx_drawing & val)
}
void _xlsx_drawing::serialize_object (std::wostream & strm)
{
if (type != typeOleObject && type != typeMsObject) return;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"oleObject")
{
CP_XML_ATTR(L"r:id", objectId);
CP_XML_ATTR(L"shapeId", id);
CP_XML_ATTR(L"progId", objectProgId);
CP_XML_NODE(L"objectPr")
{
CP_XML_ATTR(L"defaultSize", 0);
if (fill.bitmap)
{
CP_XML_ATTR(L"r:id", fill.bitmap->rId);
}
CP_XML_NODE(L"anchor")
{
CP_XML_ATTR(L"moveWithCells", 1);
from_.serialize (CP_XML_STREAM(), L"");
to_.serialize (CP_XML_STREAM(), L"");
}
}
}
}
}
}
}

View File

@ -46,16 +46,16 @@ namespace oox {
struct xlsx_drawing_position
{
enum type_t {from, to};
type_t type;
xlsx_table_position position;
enum type_t {from, to} type;
xlsx_table_position position;
friend void xlsx_serialize(std::wostream & _Wostream, xlsx_drawing_position const & val);
void serialize(std::wostream & _Wostream, std::wstring ns = L"xdr:");
};
struct _xlsx_drawing : _oox_drawing
class _xlsx_drawing : public _oox_drawing
{
public:
_xlsx_drawing() : _oox_drawing(), type_anchor(1) {}
int type_anchor;
@ -65,8 +65,8 @@ struct _xlsx_drawing : _oox_drawing
std::wstring content_group_;
friend void xlsx_serialize(std::wostream & _Wostream, _xlsx_drawing & val);
void serialize (std::wostream & strm);
void serialize_object (std::wostream & strm);
};
}
}

View File

@ -34,8 +34,6 @@
#include <iostream>
#include <cpdoccore/xml/utils.h>
#include "mediaitems_utils.h"
#include "xlsx_drawing.h"
#include "xlsx_drawings.h"
#include "xlsx_utils.h"
@ -111,7 +109,8 @@ class xlsx_drawing_context::Impl
public:
Impl(xlsx_drawing_context_handle & handle) : xlsx_drawings_(xlsx_drawings::create(false)), handle_(handle)
{
current_level_ = &objects_;
current_level_ = &objects_;
use_image_replacement_ = false;
}
xlsx_drawing_context_handle& handle_;
@ -121,13 +120,14 @@ public:
std::vector<drawing_object_description*> groups_;
std::vector<drawing_object_description> * current_level_;
bool use_image_replacement_;
//-----------------------------------------------------------------------------------
mediaitems & get_mediaitems() { return handle_.impl_->get_mediaitems(); }
void serialize(std::wostream & strm)
{
xlsx_serialize(strm, *xlsx_drawings_);
xlsx_drawings_->serialize(strm);
}
bool empty() const
@ -167,12 +167,12 @@ void xlsx_drawing_context::clear()
impl_->object_description_.anchor_y_ = 0;
impl_->object_description_.clipping_string_ = L"";
impl_->object_description_.svg_rect_ = boost::none;
impl_->object_description_.use_image_replace_ = false;
impl_->object_description_.additional_.clear();
impl_->object_description_.hlinks_.clear();
impl_->object_description_.additional_.clear();
impl_->use_image_replacement_ = false;
}
xlsx_drawing_context::~xlsx_drawing_context()
@ -272,37 +272,62 @@ void xlsx_drawing_context::end_shape()
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::start_object_ole()
void xlsx_drawing_context::set_use_image_replacement()
{
impl_->use_image_replacement_ = true;
}
void xlsx_drawing_context::set_text_box()
{
impl_->object_description_.type_ = typeShape;
impl_->object_description_.shape_type_ = 2; //2,3...
}
void xlsx_drawing_context::end_object_ole()
void xlsx_drawing_context::set_ole_object(const std::wstring & path, const std::wstring & progId)
{
}
void xlsx_drawing_context::start_image(std::wstring const & path)
{
impl_->object_description_.type_ = typeImage;
impl_->object_description_.type_ = typeOleObject;
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void xlsx_drawing_context::end_image()
void xlsx_drawing_context::set_ms_object(const std::wstring & path, const std::wstring & progId)
{
impl_->object_description_.type_ = typeMsObject;
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void xlsx_drawing_context::set_image(const std::wstring & path)
{
if (impl_->object_description_.type_ == typeUnknown)
{
impl_->object_description_.type_ = typeImage;
impl_->object_description_.xlink_href_ = path;
}
else if (impl_->use_image_replacement_)
{
impl_->object_description_.fill_.type = 2;
impl_->object_description_.fill_.bitmap = oox::oox_bitmap_fill::create();
impl_->object_description_.fill_.bitmap->xlink_href_ = path;
}
}
void xlsx_drawing_context::start_frame()
{
impl_->object_description_.type_ = typeUnknown;
}
void xlsx_drawing_context::end_frame()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::start_chart(std::wstring const & path)
void xlsx_drawing_context::set_chart(const std::wstring & path)
{
impl_->object_description_.type_ = typeChart;
impl_->object_description_.xlink_href_ = path;
}
void xlsx_drawing_context::end_chart()
{
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::set_rect(double width_pt, double height_pt, double x_pt, double y_pt)
{
impl_->object_description_.svg_rect_ = _rect(width_pt, height_pt, x_pt, y_pt);
}
void xlsx_drawing_context::set_translate(double x_pt, double y_pt)
{
if (impl_->object_description_.svg_rect_)
@ -313,6 +338,7 @@ void xlsx_drawing_context::set_translate(double x_pt, double y_pt)
r.y += y_pt;
}
}
void xlsx_drawing_context::set_rotate(double angle)
{
set_property(odf_reader::_property(L"svg:rotate", angle));
@ -369,6 +395,7 @@ void xlsx_drawing_context::set_fill(_oox_fill & fill)
{
impl_->object_description_.fill_= fill;
}
std::wstring xlsx_drawing_context::add_hyperlink(std::wstring const & href,bool object)
{
++hlinks_size_;
@ -384,11 +411,6 @@ std::wstring xlsx_drawing_context::add_hyperlink(std::wstring const & href,bool
return hId;
}
void xlsx_drawing_context::set_use_image_replacement()
{
impl_->object_description_.use_image_replace_ = true;
}
bool xlsx_drawing_context::empty() const
{
return impl_->empty();
@ -471,6 +493,9 @@ void xlsx_drawing_context::process_position_properties(drawing_object_descriptio
x = obj.anchor_x_ - cx;
y = obj.anchor_y_ - cy;
if (x < 0) x = 0;
if (y < 0) y = 0; // calcul dun MS.ods
to = pos_anchor;
from = table_metrics.calc(x, y);
@ -532,13 +557,26 @@ void xlsx_drawing_context::process_chart(drawing_object_description & obj,_xlsx_
std::wstring ref;
bool isMediaInternal = true;
drawing.chartId = impl_->get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, drawing.chartId, ref, obj.type_);
drawing.objectId = impl_->get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_);
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.chartId, ref, obj.type_); // не объект
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_); // не объект
}
void xlsx_drawing_context::process_object(drawing_object_description & obj,_xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_)
{
std::wstring ref;
bool isMediaInternal = true;
drawing.objectId = impl_->get_mediaitems().add_or_find(obj.xlink_href_, obj.type_, isMediaInternal, ref);
drawing.objectProgId = obj.descriptor_;
xlsx_drawings_->add(drawing, isMediaInternal, drawing.objectId, ref, obj.type_, true);
if (drawing.inGroup)
impl_->get_drawings()->add(isMediaInternal, drawing.objectId, ref, obj.type_); // не объект
}
void xlsx_drawing_context::process_shape(drawing_object_description & obj,_xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_)
{
std::wstring ref;
@ -556,7 +594,7 @@ void xlsx_drawing_context::process_group(drawing_object_description & obj, xlsx_
std::wstringstream strm;
xlsx_serialize(strm, *xlsx_drawings_child);
xlsx_drawings_child->serialize(strm);
drawing.content_group_ = strm.str();
@ -578,9 +616,6 @@ void xlsx_drawing_context::process_objects(std::vector<drawing_object_descriptio
{
drawing_object_description & obj = objects[i];
int pos_replaicement = obj.xlink_href_.find(L"ObjectReplacements");
if (pos_replaicement >= 0 && !obj.use_image_replace_)continue; //объект
_xlsx_drawing drawing =_xlsx_drawing();
drawing.type = obj.type_;
@ -597,7 +632,11 @@ void xlsx_drawing_context::process_objects(std::vector<drawing_object_descriptio
bool isMediaInternal = true;
drawing.fill.bitmap->rId = impl_->get_mediaitems().add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref);
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage);//собственно это не объект, а доп рел и ref объекта
bool in_sheet = (obj.type_== typeOleObject || obj.type_== typeMsObject) ? true : false;
impl_->get_drawings()->add(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage, in_sheet);//собственно это не объект, а доп рел и ref объекта
//object dumps in sheet rels !!
}
process_common_properties(obj, drawing, table_metrics);
@ -608,6 +647,9 @@ void xlsx_drawing_context::process_objects(std::vector<drawing_object_descriptio
case typeImage: process_image ( obj, drawing, xlsx_drawings_); break;
case typeShape: process_shape ( obj, drawing, xlsx_drawings_); break;
case typeGroupShape: process_group ( obj, table_metrics, drawing, xlsx_drawings_); break;
case typeMsObject:
case typeOleObject:
process_object ( obj, drawing, xlsx_drawings_); break;
}
}
}

View File

@ -80,35 +80,34 @@ public:
void set_odf_packet_path(std::wstring path){odf_packet_path_ = path;}//для анализа картинок
void start_drawing(std::wstring const & name);
void end_drawing();
void start_drawing (std::wstring const & name);
void end_drawing ();
void start_group(std::wstring const & name);
void end_group();
void start_image(std::wstring const & path);
void end_image();
void start_chart(std::wstring const & path);
void end_chart();
void end_group ();
void start_shape(int type);
//...пока тока общие свойства ... частные для каждого объекта пооозже
void end_shape();
void start_object_ole();
void end_object_ole();
void start_frame();
void set_image (const std::wstring & path);
void set_chart (const std::wstring & path);
void set_ole_object (const std::wstring & path, const std::wstring & progId);
void set_ms_object (const std::wstring & path, const std::wstring & progId);
void set_text_box ();
void end_frame();
void set_rect(double width_pt, double height_pt, double x_pt, double y_pt);
void set_translate(double x_pt, double y_pt);
void set_scale(double cx_pt, double cy_pt);
void set_rotate(double angle);
void set_translate (double x_pt, double y_pt);
void set_scale (double cx_pt, double cy_pt);
void set_rotate (double angle);
void set_anchor(std::wstring anchor, double x_pt, double y_pt, bool group = false);
void set_property(odf_reader::_property p);
void set_clipping(const std::wstring & str );
void set_fill(_oox_fill & fill);
void set_anchor (std::wstring anchor, double x_pt, double y_pt, bool group = false);
void set_property (odf_reader::_property p);
void set_clipping (const std::wstring & str );
void set_fill (_oox_fill & fill);
std::vector<odf_reader::_property> & get_properties();
@ -136,6 +135,7 @@ private:
void process_image (drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_);
void process_chart (drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_);
void process_shape (drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_);
void process_object (drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_drawings_ptr xlsx_drawings_);
void process_common_properties (drawing_object_description & obj, _xlsx_drawing & drawing, xlsx_table_metrics & table_metrics);

View File

@ -36,7 +36,6 @@
#include <vector>
#include <cpdoccore/xml/simple_xml_writer.h>
#include "mediaitems_utils.h"
#include "oox_rels.h"
namespace cpdoccore {
@ -45,40 +44,44 @@ namespace oox {
class xlsx_drawings::Impl
{
public:
void add(_xlsx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type)
void add(_xlsx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel )//объект
{
xlsx_drawings_.push_back(d);
bool present = false;
for (int i = 0 ; i < xlsx_drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].rid == rid && xlsx_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
{
xlsx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
for (int i = 0 ; i < d.hlinks.size(); i++)
add (isInternal, rid, ref, type, sheet_rel);
for (int i = 0 ; i < d.hlinks.size(); i++)
{
xlsx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink));
}
}
void add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type)
void add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel) //не объект
{
bool present = false;
for (int i = 0 ; i < xlsx_drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].rid == rid && xlsx_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
if (type == typeHyperlink) isInternal = false;
if (sheet_rel)
{
xlsx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
for (int i = 0 ; i < xlsx_sheet_rels_.size(); i++)
{
if (xlsx_sheet_rels_[i].rid == rid && xlsx_sheet_rels_[i].ref == ref)
present = true;
}
if (!present)
xlsx_sheet_rels_.push_back (_rel(isInternal, rid, ref, type));
}
else
{
for (int i = 0 ; i < xlsx_drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].rid == rid && xlsx_drawing_rels_[i].ref == ref)
present = true;
}
if (!present)
xlsx_drawing_rels_.push_back(_rel(isInternal, rid, ref, type));
}
}
void serialize(std::wostream & strm)
{
@ -86,7 +89,7 @@ public:
{
for (int i = 0 ; i < xlsx_drawings_.size(); i++)
{
xlsx_serialize(strm, xlsx_drawings_[i]);
xlsx_drawings_[i].serialize(strm);
}
}
else
@ -101,60 +104,62 @@ public:
for (int i = 0 ; i < xlsx_drawings_.size(); i++)
{
xlsx_serialize(CP_XML_STREAM(), xlsx_drawings_[i]);
xlsx_drawings_[i].serialize(CP_XML_STREAM());
}
}
}
}
}
void serialize_objects(std::wostream & strm)
{
for (int i = 0 ; i < xlsx_drawings_.size(); i++)
{
if (xlsx_drawings_[i].type != typeOleObject && xlsx_drawings_[i].type != typeMsObject) continue;
xlsx_drawings_[i].serialize_object(strm);
}
}
bool empty() const
{
return (xlsx_drawings_.empty());
}
void dump_rels(rels & Rels)
void dump_rels_drawing(rels & Rels)
{
for (int i = 0 ; i < xlsx_drawing_rels_.size(); i++)
{
if (xlsx_drawing_rels_[i].type == typeChart)
if (xlsx_drawing_rels_[i].type == typeImage ||
xlsx_drawing_rels_[i].type == typeMedia ||
xlsx_drawing_rels_[i].type == typeChart ||
xlsx_drawing_rels_[i].type == typeHyperlink )
{
Rels.add(relationship(
xlsx_drawing_rels_[i].rid,
utils::media::get_rel_type(xlsx_drawing_rels_[i].type),
Rels.add(relationship( xlsx_drawing_rels_[i].rid,
mediaitems::get_rel_type(xlsx_drawing_rels_[i].type),
(xlsx_drawing_rels_[i].is_internal ? std::wstring(L"../") + xlsx_drawing_rels_[i].ref : xlsx_drawing_rels_[i].ref),
(xlsx_drawing_rels_[i].is_internal ? L"" : L"External")
)
);
}
else if (xlsx_drawing_rels_[i].type == typeImage)
{
Rels.add(relationship(
xlsx_drawing_rels_[i].rid,
utils::media::get_rel_type(xlsx_drawing_rels_[i].type),
xlsx_drawing_rels_[i].is_internal ? std::wstring(L"../") + xlsx_drawing_rels_[i].ref : xlsx_drawing_rels_[i].ref,
(xlsx_drawing_rels_[i].is_internal ? L"" : L"External")
)
);
}
else if (xlsx_drawing_rels_[i].type == typeHyperlink)
{
Rels.add(relationship(
xlsx_drawing_rels_[i].rid,
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
xlsx_drawing_rels_[i].ref,
L"External")
);
(xlsx_drawing_rels_[i].is_internal ? L"" : L"External")) );
}
}
}
void dump_rels_sheet(rels & Rels)
{
for (int i = 0 ; i < xlsx_sheet_rels_.size(); i++)
{
Rels.add(relationship( xlsx_sheet_rels_[i].rid,
mediaitems::get_rel_type(xlsx_sheet_rels_[i].type),
(xlsx_sheet_rels_[i].is_internal ? std::wstring(L"../") + xlsx_sheet_rels_[i].ref : xlsx_sheet_rels_[i].ref),
(xlsx_sheet_rels_[i].is_internal ? L"" : L"External")) );
}
}
bool inGroup;
private:
std::vector<_xlsx_drawing> xlsx_drawings_;
std::vector<_rel> xlsx_drawing_rels_;
std::vector<_rel> xlsx_sheet_rels_;
};
xlsx_drawings::xlsx_drawings(bool inGroup_) : impl_( new xlsx_drawings::Impl() )
@ -167,19 +172,24 @@ xlsx_drawings::~xlsx_drawings()
}
void xlsx_drawings::add(_xlsx_drawing const & d, bool isInternal, std::wstring const & rid,
std::wstring const & ref, RelsType type)
std::wstring const & ref, RelsType type, bool sheet_rel)
{
impl_->add(d, isInternal, rid, ref, type);
impl_->add(d, isInternal, rid, ref, type, sheet_rel);
}
void xlsx_drawings::add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type)
void xlsx_drawings::add( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel)
{
impl_->add(isInternal, rid, ref, type);
impl_->add(isInternal, rid, ref, type, sheet_rel);
}
void xlsx_serialize(std::wostream & _Wostream, xlsx_drawings const & val)
void xlsx_drawings::serialize(std::wostream & strm)
{
val.impl_->serialize(_Wostream);
impl_->serialize(strm);
}
void xlsx_drawings::serialize_objects(std::wostream & strm)
{
impl_->serialize_objects(strm);
}
bool xlsx_drawings::empty() const
@ -187,9 +197,14 @@ bool xlsx_drawings::empty() const
return impl_->empty();
}
void xlsx_drawings::dump_rels(rels & Rels)
void xlsx_drawings::dump_rels_drawing(rels & Rels)
{
return impl_->dump_rels(Rels);
return impl_->dump_rels_drawing(Rels);
}
void xlsx_drawings::dump_rels_sheet(rels & Rels)
{
return impl_->dump_rels_sheet(Rels);
}
xlsx_drawings_ptr xlsx_drawings::create(bool inGroup)

View File

@ -55,7 +55,7 @@ struct drawing_elm
xlsx_drawings_ptr drawings;
};
struct _xlsx_drawing;
class _xlsx_drawing;
class xlsx_drawings
{
@ -64,14 +64,15 @@ public:
~xlsx_drawings ();
static xlsx_drawings_ptr create(bool inGroup);
public:
void add (_xlsx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type);
void add (bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type );
void add ( _xlsx_drawing const & d, bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel = false );
void add ( bool isInternal, std::wstring const & rid, std::wstring const & ref, RelsType type, bool sheet_rel = false );
bool empty () const;
void dump_rels (rels & Rels);
bool empty () const;
void dump_rels_sheet (rels & Rels);
void dump_rels_drawing (rels & Rels);
friend void xlsx_serialize(std::wostream & _Wostream, xlsx_drawings const & val);
void serialize (std::wostream & _Wostream);
void serialize_objects (std::wostream & _Wostream);
private:
class Impl;
_CP_SCOPED_PTR(Impl) impl_;

View File

@ -30,6 +30,7 @@
*
*/
#include <vector>
#include <cpdoccore/xml/utils.h>
#include "xlsx_numFmts.h"
@ -77,7 +78,7 @@ void xlsx_num_fmts::serialize(std::wostream & _Wostream) const
_Wostream << L"<numFmts count=\"" << impl_->formats_.size() << L"\">";
for (size_t i = 0; i < impl_->formats_.size(); ++i)
{
_Wostream << L"<numFmt formatCode=\"" << impl_->formats_[i] <<
_Wostream << L"<numFmt formatCode=\"" << xml::utils::replace_text_to_xml(impl_->formats_[i]) <<
L"\" numFmtId=\"" << impl_->transform_id(i) << "\" />";
}

View File

@ -54,8 +54,10 @@ public:
std::wstringstream sort_;
std::wstringstream autofilter_;
std::wstringstream conditionalFormatting_;
std::wstringstream ole_objects_;
rels hyperlinks_rels_;
rels ole_objects_rels_;
std::wstring drawingName_;
std::wstring drawingId_;
@ -128,20 +130,31 @@ std::wostream & xlsx_xml_worksheet::hyperlinks()
{
return impl_->hyperlinks_;
}
std::wostream & xlsx_xml_worksheet::ole_objects()
{
return impl_->ole_objects_;
}
//---------------------------------------------------------------------------------------
rels & xlsx_xml_worksheet::hyperlinks_rels()
{
return impl_->hyperlinks_rels_;
}
rels & xlsx_xml_worksheet::ole_objects_rels()
{
return impl_->ole_objects_rels_;
}
void xlsx_xml_worksheet::write_to(std::wostream & strm)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"worksheet")
{
CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
CP_XML_ATTR(L"mc:Ignorable", L"x14ac");
CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"xmlns:xdr", L"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing");
CP_XML_ATTR(L"xmlns:x14", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
CP_XML_ATTR(L"mc:Ignorable",L"x14ac");
CP_XML_ATTR(L"xmlns:x14ac", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
CP_XML_STREAM() << impl_->sheetFormat_.str();
@ -179,7 +192,13 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
CP_XML_ATTR(L"r:id",impl_->vml_drawingId_);
}
}
if (!impl_->ole_objects_.str().empty())
{
CP_XML_NODE(L"oleObjects")
{
CP_XML_STREAM() << impl_->ole_objects_.str();
}
}
//CP_XML_NODE(L"headerFooter){}
//CP_XML_NODE(L"rowBreaks){}
@ -217,43 +236,5 @@ std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_link()
return std::pair<std::wstring, std::wstring>(impl_->vml_drawingName_, impl_->vml_drawingId_);
}
//class xlsx_xml_workbook::Impl: noncopyable
//{
//public:
// std::wstringstream sheets_;
//};
//
//xlsx_xml_workbook::xlsx_xml_workbook() : impl_(new xlsx_xml_workbook::Impl)
//{
//}
//
//xlsx_xml_workbook::~xlsx_xml_workbook()
//{
//}
//
//std::wostream & xlsx_xml_workbook::sheets()
//{
// return impl_->sheets_;
//}
//
//void xlsx_xml_workbook::write_to(std::wostream & strm)
//{
// CP_XML_WRITER(strm)
// {
// CP_XML_NODE(L"workbook")
// {
// CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
// CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
//
// CP_XML_NODE(L"sheets")
// {
// CP_XML_STREAM() << impl_->sheets_.str();
// }
// }
// }
//}
//
}
}

View File

@ -62,8 +62,10 @@ public:
std::wostream & autofilter();
std::wostream & conditionalFormatting();
std::wostream & sort();
std::wostream & ole_objects();
rels & hyperlinks_rels();
rels & ole_objects_rels();
void write_to(std::wostream & strm);

View File

@ -181,30 +181,30 @@ void xl_files::write(const std::wstring & RootPath)
sharedStrings_->write(path);
rels_files_.add( relationship( L"shId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", L"sharedStrings.xml" ) );
}
if (styles_)
{
styles_->write(path);
rels_files_.add( relationship( L"stId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", L"styles.xml" ) );
}
if (workbook_)
{
workbook_->write(path);
}
if (theme_)
{
theme_->write(path);
}
if (media_)
{
media_->set_main_document(get_main_document());
media_->write(path);
}
if (embeddings_)
{
embeddings_->set_main_document(get_main_document());
embeddings_->write(path);
}
{
charts_files_.set_main_document(get_main_document());
charts_files_.write(path);
}
@ -243,7 +243,15 @@ void xl_files::add_sheet(sheet_content_ptr sheet)
void xl_files::set_media(mediaitems & _Mediaitems, CApplicationFonts *pAppFonts)
{
media_ = element_ptr( new media(_Mediaitems, pAppFonts) );
if (_Mediaitems.count_image + _Mediaitems.count_media > 0)
{
media_ = element_ptr( new media(_Mediaitems, pAppFonts) );
}
if (_Mediaitems.count_object > 0)
{
embeddings_ = element_ptr( new embeddings(_Mediaitems) );
}
}
void xl_files::set_comments(element_ptr Element)
{
@ -313,7 +321,7 @@ void xl_drawings::write(const std::wstring & RootPath)
rels_files relFiles;
rels_file_ptr r = rels_file::create(e.filename + L".rels");
e.drawings->dump_rels(r->get_rels());
e.drawings->dump_rels_drawing(r->get_rels());
relFiles.add_rel_file(r);
relFiles.write(path);

View File

@ -169,18 +169,20 @@ public:
void add_charts(chart_content_ptr chart);
private:
rels_files rels_files_;
sheets_files sheets_files_;
rels_files rels_files_;
sheets_files sheets_files_;
xl_charts_files charts_files_;
element_ptr theme_;
element_ptr workbook_;
element_ptr theme_;
element_ptr workbook_;
element_ptr styles_;
element_ptr sharedStrings_;
element_ptr media_;
element_ptr drawings_;
element_ptr vml_drawings_;
element_ptr comments_;
element_ptr styles_;
element_ptr sharedStrings_;
element_ptr media_;
element_ptr embeddings_;
element_ptr drawings_;
element_ptr vml_drawings_;
element_ptr comments_;
};
@ -191,7 +193,7 @@ public:
xlsx_document();
public:
virtual void write(const std::wstring & RootPath);
virtual void write(const std::wstring & RootPath);
virtual content_types_file & get_content_types_file() { return content_type_file_; }
xl_files & get_xl_files() { return xl_files_; }

View File

@ -188,7 +188,12 @@ size_t xlsx_style_manager::Impl::xfId(const odf_reader::text_format_properties_c
void xlsx_style_manager::Impl::serialize(std::wostream & _Wostream)
{
_Wostream << L"<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">";
_Wostream << L"<styleSheet";
_Wostream << L" xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"";
_Wostream << L" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"";
_Wostream << L" mc:Ignorable=\"x14ac\"";
_Wostream << L" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\"";
_Wostream << L">";
numFmts_.serialize (_Wostream);
fonts_.serialize (_Wostream);
@ -201,8 +206,6 @@ void xlsx_style_manager::Impl::serialize(std::wostream & _Wostream)
cellStyles_.serialize(_Wostream);
dxfs_.serialize(_Wostream);
_Wostream << L"</styleSheet>";
}
@ -253,7 +256,7 @@ size_t xlsx_style_manager::xfId(const odf_reader::text_format_properties_content
const std::wstring &num_format, bool default_set)
{
bool is_visible;
return impl_->xfId(textProp, parProp, cellProp, xlxsCellFormat, num_format,default_set, is_visible);
return impl_->xfId(textProp, parProp, cellProp, xlxsCellFormat, num_format, default_set, is_visible);
}
size_t xlsx_style_manager::xfId(const odf_reader::text_format_properties_content * textProp,

View File

@ -40,15 +40,15 @@ namespace oox
struct region
{
region(size_t sCell, double sPos, size_t c, double l) : start_cell(sCell),
region(int sCell, double sPos, int c, double l) : start_cell(sCell),
start_pos(sPos),
count(c),
length(l)
{}
size_t start_cell;
int start_cell;
double start_pos;
size_t count;
int count;
double length;
};
@ -59,17 +59,19 @@ public:
{}
public:
void add(size_t count, double length_pt)
void add(int count, double length_pt)
{
region_.push_back(region(next_cell_, next_pos_, count, length_pt));
next_cell_ += count;
next_pos_ += count * length_pt;
}
double search(size_t cell)
double search(int cell)
{
double length_pt =0;
BOOST_FOREACH(region const & r, region_)
for (int i = 0; i < region_.size(); i++)
{
region & r = region_[i];
if (cell <= r.start_cell + r.count)
{
length_pt += (cell-r.start_cell)*r.length;
@ -87,34 +89,57 @@ public:
{
offset =0;
}
length_pt+= offset * region_.back().length;
length_pt += offset * region_.back().length;
}
}
return length_pt;
}
std::pair<size_t, double> search(size_t offset, double pos)
std::pair<int, double> search(int offset, double pos)
{
double skip_length =0;
BOOST_FOREACH(region const & r, region_)
if (pos < 0)//cs102.ods
{
int c_skip = 0, i = 0;
for (i = 0; i < region_.size(); i++)
{
if (region_[i].count + c_skip > offset)
break;
c_skip += region_[i].count;
}
for (; i >= 0 && pos < 0; i--)
{
pos += region_[i].length * region_[i].count;
offset--;
}
if (offset < 0) offset = 0;
if (pos < 0) pos = 0;
}
for (int i = 0; i < region_.size(); i++)
{
region & r = region_[i];
if (r.start_cell + r.count <= offset)
{
skip_length = r.start_pos +r.count*r.length;
skip_length = r.start_pos + r.count*r.length;
continue;
}
if (pos+skip_length >= r.start_pos && pos+skip_length < (r.start_pos + r.count * r.length))
if (pos + skip_length >= r.start_pos && pos + skip_length < (r.start_pos + r.count * r.length))
{
skip_length += (offset-r.start_cell) * r.length;
const double diff = pos+skip_length - r.start_pos;
const size_t cell = diff / r.length ;
skip_length += (offset - r.start_cell) * r.length;
const double diff = pos + skip_length - r.start_pos;
int cell = diff / r.length ;
double offset_cell = diff - cell * r.length;
if (offset_cell < 0)
{
offset_cell =0;
}
return std::pair<size_t, double>(r.start_cell + cell , offset_cell);
return std::pair<int, double>(r.start_cell + cell, offset_cell);
}
}
@ -122,38 +147,47 @@ public:
{
if (region_.back().start_cell + region_.back().count < offset)
{
skip_length+= (offset-region_.back().start_cell-region_.back().count/*-1*/) * region_.back().length;
skip_length += (offset - region_.back().start_cell - region_.back().count /*- 1*/) * region_.back().length;
}
region const & last_r = region_[region_.size() - 1];
const size_t last_cell = last_r.start_cell + last_r.count;
const double last_pos = last_r.start_pos + last_r.count * last_r.length;
double diff = pos+skip_length-last_r.start_pos-(last_r.count * last_r.length);
const size_t cell = diff / last_r.length;
double offset_cell = diff - cell * last_r.length;
region const & last_r = region_[region_.size() - 1];
const int last_cell = last_r.start_cell + last_r.count;
const double last_pos = last_r.start_pos + last_r.count * last_r.length;
double diff = pos + skip_length - last_r.start_pos - (last_r.count * last_r.length);
if (diff < 0)
diff = 0;
const int cell = diff / last_r.length;
double offset_cell = diff - cell * last_r.length;
if (offset_cell < 0)
{
offset_cell =0;
offset_cell = 0;
}
return std::pair<size_t, double>(last_cell + cell , offset_cell);
return std::pair<int, double>(last_cell + cell , offset_cell);
}
else
return std::pair<size_t, double>(offset, pos);
return std::pair<int, double>(offset, pos);
}
std::pair<size_t, double> search(double pos)
std::pair<int, double> search(double pos)
{
BOOST_FOREACH(region const & r, region_)
for (int i = 0; i < region_.size(); i++)
{
region & r = region_[i];
if (pos >= r.start_pos && pos < (r.start_pos + r.count * r.length))
{
const double diff = pos - r.start_pos;
const size_t cell = diff / r.length;
double offset = diff - cell * r.length;
const double diff = pos - r.start_pos;
const int cell = diff / r.length;
double offset = diff - cell * r.length;
if (offset < 0)
{
offset =0;
}
return std::pair<size_t, double>(r.start_cell + cell, offset);
return std::pair<int, double>(r.start_cell + cell, offset);
}
}
@ -162,20 +196,21 @@ public:
region const & last_r = region_[region_.size() - 1];
const size_t last_cell = last_r.start_cell + last_r.count;
const double last_pos = last_r.start_pos + last_r.count * last_r.length;
const double diff = pos - last_pos;
const size_t cell = diff / last_r.length;
double offset = diff - cell * last_r.length;
const double diff = pos - last_pos;
const int cell = diff / last_r.length;
double offset = diff - cell * last_r.length;
if (offset < 0)
{
offset =0;
}
return std::pair<size_t, double>(last_cell + cell, offset);
return std::pair<int, double>(last_cell + cell, offset);
}
else
return std::pair<size_t, double>(0, pos);
return std::pair<int, double>(0, pos);
}
private:
size_t next_cell_;
int next_cell_;
double next_pos_;
std::vector<region> region_;
};
@ -185,48 +220,48 @@ class xlsx_table_metrics::Impl
public:
xlsx_table_position calc(double x_pt, double y_pt)
{
const std::pair<size_t, double> c = cols_.search(x_pt);
const std::pair<size_t, double> r = rows_.search(y_pt);
const std::pair<int, double> c = cols_.search (x_pt);
const std::pair<int, double> r = rows_.search (y_pt);
xlsx_table_position res = {c.first, c.second, r.first, r.second};
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
return res;
}
xlsx_table_position calc(size_t offset_col,size_t offset_row,double x_pt, double y_pt)
xlsx_table_position calc(int offset_col, int offset_row, double x_pt, double y_pt)
{
std::pair<size_t, double> c ;
std::pair<size_t, double> r ;
std::pair<int, double> c ;
std::pair<int, double> r ;
c = cols_.search(offset_col,x_pt);
c = cols_.search(offset_col, x_pt);
r = rows_.search(offset_row,y_pt);
r = rows_.search(offset_row, y_pt);
xlsx_table_position res = {c.first, c.second, r.first, r.second};
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
return res;
}
xlsx_table_position calc(size_t last_col,size_t last_row)
xlsx_table_position calc(int last_col,int last_row)
{
std::pair<size_t, double> c = cols_.search(last_col,0);
std::pair<size_t, double> r = rows_.search(last_row,0);
std::pair<int, double> c = cols_.search (last_col, 0);
std::pair<int, double> r = rows_.search (last_row, 0);
xlsx_table_position res = {c.first, c.second, r.first, r.second};
xlsx_table_position res = {(size_t)c.first, c.second, (size_t)r.first, r.second};
return res;
}
void update_pt(size_t offset_col,size_t offset_row,double &x_pt, double &y_pt)
void update_pt(int offset_col,int offset_row,double &x_pt, double &y_pt)
{
x_pt += cols_.search(offset_col);
y_pt += rows_.search(offset_row);
x_pt += cols_.search (offset_col);
y_pt += rows_.search (offset_row);
}
void add_cols(size_t count, double widht_pt)
void add_cols(int count, double widht_pt)
{
return cols_.add(count, widht_pt);
}
void add_rows(size_t count, double height_pt)
void add_rows(int count, double height_pt)
{
return rows_.add(count, height_pt);
}
@ -247,30 +282,30 @@ xlsx_table_metrics::~xlsx_table_metrics()
xlsx_table_position xlsx_table_metrics::calc(double x_pt, double y_pt)
{
return impl_->calc(x_pt, y_pt);
return impl_->calc (x_pt, y_pt);
}
xlsx_table_position xlsx_table_metrics::calc(size_t offset_col,size_t offset_row,double x_pt, double y_pt)
xlsx_table_position xlsx_table_metrics::calc(int offset_col,int offset_row,double x_pt, double y_pt)
{
return impl_->calc(offset_col,offset_row,x_pt, y_pt);
return impl_->calc(offset_col, offset_row, x_pt, y_pt);
}
xlsx_table_position xlsx_table_metrics::calc(size_t last_col,size_t last_row)
xlsx_table_position xlsx_table_metrics::calc(int last_col,int last_row)
{
return impl_->calc(last_col,last_row);
return impl_->calc (last_col, last_row);
}
void xlsx_table_metrics::update_pt(size_t offset_col,size_t offset_row,double &x_pt, double &y_pt)
void xlsx_table_metrics::update_pt(int offset_col,int offset_row,double &x_pt, double &y_pt)
{
return impl_->update_pt(offset_col,offset_row,x_pt, y_pt);
return impl_->update_pt (offset_col, offset_row, x_pt, y_pt);
}
void xlsx_table_metrics::add_cols(size_t count, double width_pt)
void xlsx_table_metrics::add_cols(int count, double width_pt)
{
return impl_->add_cols(count, width_pt);
return impl_->add_cols (count, width_pt);
}
void xlsx_table_metrics::add_rows(size_t count, double height_pt)
void xlsx_table_metrics::add_rows(int count, double height_pt)
{
return impl_->add_rows(count, height_pt);
return impl_->add_rows (count, height_pt);
}
}

View File

@ -44,18 +44,18 @@ namespace oox
class xlsx_table_metrics
{
public:
xlsx_table_metrics();
~xlsx_table_metrics();
xlsx_table_metrics ();
~xlsx_table_metrics ();
public:
xlsx_table_position calc(double x_pt, double y_pt);
xlsx_table_position calc(size_t offset_col,size_t offset_row,double x_pt, double y_pt);
xlsx_table_position calc(size_t last_col,size_t last_row);
xlsx_table_position calc (double x_pt, double y_pt);
xlsx_table_position calc (int offset_col, int offset_row, double x_pt, double y_pt);
xlsx_table_position calc (int last_col, int last_row);
void update_pt(size_t offset_col,size_t offset_row,double &x_pt, double &y_pt);
void update_pt (int offset_col, int offset_row, double &x_pt, double &y_pt);
void add_cols(size_t count, double widht_pt);
void add_rows(size_t count, double height_pt);
void add_cols (int count, double widht_pt);
void add_rows (int count, double height_pt);
private:
class Impl;

View File

@ -191,8 +191,8 @@ std::wstring xlsx_table_state::default_row_cell_style() const
std::wstring xlsx_table_state::default_column_cell_style() const
{
if (current_table_column_ < column_default_cell_style_name_.size())
return column_default_cell_style_name_.at(current_table_column_);
if (current_table_column_ + 1 < column_default_cell_style_name_.size())
return column_default_cell_style_name_.at(current_table_column_ + 1);
else
{
//непонятная хрень!! - неправильно сформирован ods???
@ -403,7 +403,10 @@ void xlsx_table_state::serialize_merge_cells(std::wostream & _Wostream)
{
return xlsx_merge_cells_.xlsx_serialize(_Wostream);
}
void xlsx_table_state::serialize_ole_objects(std::wostream & _Wostream)
{
return xlsx_drawing_context_.get_drawings()->serialize_objects(_Wostream);
}
void xlsx_table_state::serialize_hyperlinks(std::wostream & _Wostream)
{
return xlsx_hyperlinks_.xlsx_serialize(_Wostream);
@ -416,6 +419,10 @@ void xlsx_table_state::dump_rels_hyperlinks(rels & Rels)
{
return xlsx_hyperlinks_.dump_rels(Rels);
}
void xlsx_table_state::dump_rels_ole_objects(rels & Rels)
{
return get_drawing_context().get_drawings()->dump_rels_sheet(Rels);
}
void xlsx_table_state::start_hyperlink()
{

View File

@ -127,7 +127,10 @@ public:
void serialize_table_format (std::wostream & _Wostream);
void serialize_merge_cells (std::wostream & _Wostream);
void serialize_hyperlinks (std::wostream & _Wostream);
void dump_rels_hyperlinks (rels & Rels);
void serialize_ole_objects (std::wostream & _Wostream);
void dump_rels_hyperlinks (rels & Rels);
void dump_rels_ole_objects (rels & Rels);
std::wstring get_table_name() const { return tableName_; }
int get_table_id() const { return tableId_; }

View File

@ -320,10 +320,18 @@ void xlsx_table_context::serialize_hyperlinks(std::wostream & _Wostream)
{
return state()->serialize_hyperlinks(_Wostream);
}
void xlsx_table_context::serialize_ole_objects(std::wostream & _Wostream)
{
return state()->serialize_ole_objects(_Wostream);
}
void xlsx_table_context::dump_rels_hyperlinks(rels & Rels)
{
return state()->dump_rels_hyperlinks(Rels);
}
void xlsx_table_context::dump_rels_ole_objects(rels & Rels)
{
return state()->dump_rels_ole_objects(Rels);
}
xlsx_table_metrics & xlsx_table_context::get_table_metrics()
{

View File

@ -88,6 +88,8 @@ public:
void serialize_merge_cells (std::wostream & _Wostream);
void serialize_table_format (std::wostream & _Wostream);
void serialize_conditionalFormatting(std::wostream & _Wostream);
void serialize_hyperlinks (std::wostream & _Wostream);
void serialize_ole_objects (std::wostream & _Wostream);
xlsx_table_metrics & get_table_metrics();
@ -103,10 +105,9 @@ public:
void start_hyperlink();
std::wstring end_hyperlink(std::wstring const & ref, std::wstring const & href, std::wstring const & display);
void dump_rels_hyperlinks(rels & Rels);
void serialize_hyperlinks(std::wostream & _Wostream);
void dump_rels_hyperlinks (rels & Rels);
void dump_rels_ole_objects (rels & Rels);
void start_database_range(std::wstring table_name, std::wstring ref);
void set_database_orientation (bool val);
void set_database_header (bool val);

View File

@ -119,6 +119,7 @@ private:
std::wstringstream paragraph_; //перманенто скидываемые параграфы
std::wstringstream run_; //перманенто скидываемые куски с быть может разными свойствами
std::wstring store_cell_string_;
xlsx_shared_strings xlsx_shared_strings_;
std::wstring paragraph_style_name_;//был вектор ... не нужен, так как в один момент времени может быть тока один стиль параграфа,текста,объекта при приходе нового - дампится
@ -427,12 +428,12 @@ std::wstring xlsx_text_context::Impl::dump_paragraph(/*bool last*/)
std::wstring xlsx_text_context::Impl::dump_run()
{
const std::wstring content = xml::utils::replace_text_to_xml(text_.str());
if (content.length()<1)
if (content.empty())
return L"";
std::wstring prefix_draw;
if (in_draw) prefix_draw=L"a:";
if (in_draw) prefix_draw = L"a:";
CP_XML_WRITER(run_)
{
@ -445,6 +446,7 @@ std::wstring xlsx_text_context::Impl::dump_run()
CP_XML_NODE(prefix_draw + L"t")
{
if (!in_draw)CP_XML_ATTR(L"xml:space", L"preserve");
CP_XML_STREAM() << content;
}
}
@ -452,19 +454,21 @@ std::wstring xlsx_text_context::Impl::dump_run()
}
}
hyperlink_hId =L"";
return content;
}
void xlsx_text_context::Impl::start_cell_content()
{
paragraphs_cout_ = 0;
local_styles_ptr_ =NULL;
paragraphs_cout_ = 0;
local_styles_ptr_ = NULL;
run_.str(std::wstring());
paragraph_.str(std::wstring());
text_.str(std::wstring());
store_cell_string_.clear();
hyperlink_hId.clear();
paragraph_style_name_ = L"";
span_style_name_ = L"";
@ -488,6 +492,13 @@ void xlsx_text_context::Impl::start_comment_content()
}
void xlsx_text_context::Impl::start_drawing_content()
{
if (in_cell_content)
{
dump_run();
store_cell_string_ = run_.str();
}
paragraphs_cout_ = 0;
run_.str(std::wstring());
@ -539,9 +550,12 @@ int xlsx_text_context::Impl::end_cell_content()
{
dump_run();
const int sharedStrId = run_.str().empty() ? (-1) : static_cast<int>(xlsx_shared_strings_.add(run_.str()));
//???? нужно ли здесь очищать все ????? - проверить стили на кучках - и проверить как меняются стили внутри одной ячейки - то есть здешнее переопределение внешнего стиля
in_cell_content = false;
std::wstring cell_string = store_cell_string_ + run_.str();
store_cell_string_.clear();
in_cell_content = false;
const int sharedStrId = cell_string.empty() ? (-1) : xlsx_shared_strings_.add(cell_string);
return sharedStrId;
}

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) ),
@ -113,7 +113,7 @@ void xlsx_conversion_context::start_document()
std::vector<const odf_reader::style_instance *> instances;
instances.push_back(odfContext.styleContainer().style_default_by_type(odf_types::style_family::TableCell));
instances.push_back(odfContext.styleContainer().style_by_name(L"Default",odf_types::style_family::TableCell,false));
instances.push_back(odfContext.styleContainer().style_by_name(L"Default", odf_types::style_family::TableCell, false));
odf_reader::text_format_properties_content textFormatProperties = calc_text_properties_content(instances);
odf_reader::paragraph_format_properties parFormatProperties = calc_paragraph_properties_content(instances);
@ -124,7 +124,7 @@ void xlsx_conversion_context::start_document()
cellFormat.set_cell_type(XlsxCellType::s);
cellFormat.set_num_format(oox::odf_string_to_build_in(0));
default_style_ = get_style_manager().xfId(&textFormatProperties, &parFormatProperties, &cellFormatProperties, &cellFormat, L"",true);
default_style_ = get_style_manager().xfId(&textFormatProperties, &parFormatProperties, &cellFormatProperties, &cellFormat, L"", true);
}
@ -132,12 +132,11 @@ void xlsx_conversion_context::end_document()
{
std::wstringstream workbook_content;
unsigned int count = 0;
// добавляем таблицы
BOOST_FOREACH(const xlsx_xml_worksheet_ptr& sheet, sheets_)
for (int i = 0; i < sheets_.size(); i++)
{
count++;
const std::wstring id = std::wstring(L"sId") + boost::lexical_cast<std::wstring>(count);
xlsx_xml_worksheet_ptr& sheet = sheets_[i];
const std::wstring id = std::wstring(L"sId") + std::to_wstring(i+1);
package::sheet_content_ptr content = package::sheet_content::create();
////////////////////////////////////////////////////////////////////////////////////////////
@ -152,6 +151,7 @@ void xlsx_conversion_context::end_document()
}
//////////////////////////////////////////////////////////////////////////////////////////////////
content->add_rels(sheet->hyperlinks_rels());
content->add_rels(sheet->ole_objects_rels());
/////////////////////////////////////////////////////////////////////////////////////////////////
const std::pair<std::wstring, std::wstring> p2 = sheet->get_comments_link();
if (!p2.first.empty())
@ -179,24 +179,22 @@ void xlsx_conversion_context::end_document()
{
CP_XML_NODE(L"sheet")
{
CP_XML_ATTR(L"name", sheet->name());
CP_XML_ATTR(L"sheetId", count);
CP_XML_ATTR(L"state", L"visible");
CP_XML_ATTR(L"r:id", id);
CP_XML_ATTR(L"name", sheet->name()); // office 2010 ! ограничение на длину имени !!!
CP_XML_ATTR(L"sheetId", i + 1);
CP_XML_ATTR(L"state", L"visible");
CP_XML_ATTR(L"r:id", id);
}
}
}
//добавляем диаграммы
count = 0;
BOOST_FOREACH(const oox_chart_context_ptr& chart, charts_)
for (int i = 0; i < charts_.size(); i++)
{
count++;
package::chart_content_ptr content = package::chart_content::create();
chart->serialize(content->content());
chart->dump_rels(content->get_rel_file()->get_rels());
charts_[i]->serialize(content->content());
charts_[i]->dump_rels(content->get_rel_file()->get_rels());
output_document_->get_xl_files().add_charts(content);
}
@ -322,12 +320,16 @@ void xlsx_conversion_context::end_table()
get_table_context().serialize_autofilter (current_sheet().autofilter());
get_table_context().serialize_sort (current_sheet().sort());
get_table_context().serialize_merge_cells (current_sheet().mergeCells());
get_table_context().serialize_hyperlinks (current_sheet().hyperlinks());
get_drawing_context().set_odf_packet_path (root()->get_folder());
get_drawing_context().process_objects (get_table_metrics());
get_table_context().serialize_hyperlinks (current_sheet().hyperlinks());
get_table_context().serialize_ole_objects (current_sheet().ole_objects());
get_table_context().dump_rels_hyperlinks (current_sheet().hyperlinks_rels());
get_table_context().dump_rels_ole_objects (current_sheet().ole_objects_rels());
get_drawing_context().set_odf_packet_path(root()->get_folder());
get_drawing_context().process_objects(get_table_metrics());
if (!get_drawing_context().empty())
{

View File

@ -80,8 +80,8 @@ void calcext_date_is_attr::add_attributes( const xml::attributes_wc_ptr & Attrib
}
// calcext_conditional_formats
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_conditional_formats::ns = L"calcext";
const wchar_t * calcext_conditional_formats::name = L"conditional-formats";
const wchar_t * calcext_conditional_formats::ns = L"calcext";
const wchar_t * calcext_conditional_formats::name = L"conditional-formats";
void calcext_conditional_formats::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
@ -100,8 +100,8 @@ void calcext_conditional_formats::xlsx_convert(oox::xlsx_conversion_context & Co
// calcext_conditional_format
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_conditional_format::ns = L"calcext";
const wchar_t * calcext_conditional_format::name = L"conditional-format";
const wchar_t * calcext_conditional_format::ns = L"calcext";
const wchar_t * calcext_conditional_format::name = L"conditional-format";
void calcext_conditional_format::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
@ -126,8 +126,8 @@ void calcext_conditional_format::xlsx_convert(oox::xlsx_conversion_context & Con
// calcext_data_bar
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_data_bar::ns = L"calcext";
const wchar_t * calcext_data_bar::name = L"data-bar";
const wchar_t * calcext_data_bar::ns = L"calcext";
const wchar_t * calcext_data_bar::name = L"data-bar";
void calcext_data_bar::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
@ -158,8 +158,8 @@ void calcext_data_bar::xlsx_convert(oox::xlsx_conversion_context & Context)
}
// calcext_color_scale
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_color_scale::ns = L"calcext";
const wchar_t * calcext_color_scale::name = L"color-scale";
const wchar_t * calcext_color_scale::ns = L"calcext";
const wchar_t * calcext_color_scale::name = L"color-scale";
void calcext_color_scale::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
@ -179,8 +179,8 @@ void calcext_color_scale::xlsx_convert(oox::xlsx_conversion_context & Context)
}
// calcext_icon_set
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_icon_set::ns = L"calcext";
const wchar_t * calcext_icon_set::name = L"icon-set";
const wchar_t * calcext_icon_set::ns = L"calcext";
const wchar_t * calcext_icon_set::name = L"icon-set";
void calcext_icon_set::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
@ -206,8 +206,8 @@ void calcext_icon_set::xlsx_convert(oox::xlsx_conversion_context & Context)
// calcext_formatting_entry
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_formatting_entry::ns = L"calcext";
const wchar_t * calcext_formatting_entry::name = L"formatting-entry";
const wchar_t * calcext_formatting_entry::ns = L"calcext";
const wchar_t * calcext_formatting_entry::name = L"formatting-entry";
void calcext_formatting_entry::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
@ -226,11 +226,14 @@ void calcext_formatting_entry::xlsx_convert(oox::xlsx_conversion_context & Conte
// calcext_color_scale_entry
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_color_scale_entry::ns = L"calcext";
const wchar_t * calcext_color_scale_entry::name = L"color_scale_entry";
const wchar_t * calcext_color_scale_entry::ns = L"calcext";
const wchar_t * calcext_color_scale_entry::name = L"color-scale-entry";
void calcext_color_scale_entry::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"calcext:value", calcext_value_);
CP_APPLY_ATTR(L"calcext:type", calcext_type_);
CP_APPLY_ATTR(L"calcext:color", calcext_color_);
}
void calcext_color_scale_entry::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
@ -248,7 +251,7 @@ void calcext_color_scale_entry::xlsx_convert(oox::xlsx_conversion_context & Cont
}
// calcext_condition
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_condition::ns = L"calcext";
const wchar_t * calcext_condition::ns = L"calcext";
const wchar_t * calcext_condition::name = L"condition";
void calcext_condition::add_attributes( const xml::attributes_wc_ptr & Attributes )
@ -286,8 +289,8 @@ void calcext_condition::xlsx_convert(oox::xlsx_conversion_context & Context)
}
// calcext_condition
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * calcext_date_is::ns = L"calcext";
const wchar_t * calcext_date_is::name = L"date-is";
const wchar_t * calcext_date_is::ns = L"calcext";
const wchar_t * calcext_date_is::name = L"date-is";
void calcext_date_is::add_attributes( const xml::attributes_wc_ptr & Attributes )
{

View File

@ -175,7 +175,7 @@ void object_odf_context::xlsx_convert(oox::xlsx_conversion_context & Context)
}
else if (object_type_ == 2 && office_text_)
{
office_text_->xlsx_convert(Context);
//embedded
}
else if (object_type_ == 3 && office_math_)
{
@ -183,6 +183,10 @@ void object_odf_context::xlsx_convert(oox::xlsx_conversion_context & Context)
Context.get_math_context().start();
office_math_->oox_convert(Context.get_math_context());
}
else if(object_type_ == 4 && office_spreadsheet_)
{
//embedded
}
}
void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
{
@ -199,7 +203,7 @@ void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
}
else if (object_type_ == 2 && office_text_)
{
office_text_->docx_convert(Context);
//embedded
}
else if (object_type_ == 3 && office_math_)
{
@ -225,6 +229,10 @@ void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
Context.set_run_state (runState);
Context.set_paragraph_state (pState);
}
else if(object_type_ == 4 && office_spreadsheet_)
{
//embedded
}
}
void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context)
{
@ -240,7 +248,7 @@ void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context)
}
else if (object_type_ == 2 && office_text_)
{
office_text_->pptx_convert(Context);
//embedded
}
else if (object_type_ == 3 && office_math_)
{
@ -248,6 +256,10 @@ void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_math_context().start();
office_math_->oox_convert(Context.get_math_context());
}
else if(object_type_ == 4 && office_spreadsheet_)
{
//embedded
}
}
void object_odf_context::calc_cache_series(std::wstring adress, std::vector<std::wstring> & cash)
{
@ -544,7 +556,7 @@ bool process_build_object::visit_rows(unsigned int repeated)
//////////////////////////////////////////////////
void process_build_object::on_not_impl(std::string const & message)
{
_CP_LOG << L"[process_draw_chart visitor] : not impliment for \"" << utf8_to_utf16(message) << L"\"" << std::endl;
_CP_LOG << L"[process_object visitor] : not impliment for \"" << utf8_to_utf16(message) << L"\"" << std::endl;
}
//////////////////////////////////////////////////
@ -570,14 +582,18 @@ void process_build_object::visit(office_chart& val)
void process_build_object::visit(office_text& val)
{
object_odf_context_.object_type_ = 2;
object_odf_context_.office_text_ = &val;//конвертация будет уровнем выше
object_odf_context_.office_text_ = &val; //конвертация будет уровнем выше
}
void process_build_object::visit(office_math& val)
{
object_odf_context_.object_type_ = 3; //0;//временно замещающая картинка
object_odf_context_.office_math_ = &val;//конвертация будет уровнем выше
object_odf_context_.object_type_ = 3; //= 0 - временно замещающая картинка
object_odf_context_.office_math_ = &val; //конвертация будет уровнем выше
}
void process_build_object::visit(office_spreadsheet& val)
{
object_odf_context_.object_type_ = 4;
object_odf_context_.office_spreadsheet_ = &val; //конвертация будет уровнем выше
}
void process_build_object::visit(const chart_chart& val)
{
object_odf_context_.object_type_ = 1;

View File

@ -52,6 +52,7 @@
#include "office_body.h"
#include "office_chart.h"
#include "office_text.h"
#include "office_spreadsheet.h"
#include "math_elements.h"
#include "table.h"
#include "odfcontext.h"
@ -118,6 +119,7 @@ public:
object_type_ (0),
office_text_ (NULL),
office_math_ (NULL),
office_spreadsheet_ (NULL),
baseRef_ (ref),
baseFontHeight_ (12)
{
@ -159,6 +161,7 @@ public:
int object_type_;
office_text *office_text_;
office_math *office_math_;
office_spreadsheet *office_spreadsheet_;
int baseFontHeight_;
std::wstring baseRef_;
@ -211,7 +214,6 @@ public:
///////////////////////////////////////////
};
// Класс для обхода всех элеменов office:object для построения диаграммы
class process_build_object
: public base_visitor,
@ -222,7 +224,8 @@ class process_build_object
public visitor<office_chart>,
public visitor<office_text>,
public visitor<office_math>,
public visitor<office_spreadsheet>,
public const_visitor<chart_chart>,
public const_visitor<chart_title>,
@ -283,47 +286,48 @@ private:
public:
virtual void visit(const office_document_content& val);
virtual void visit(office_document_content& val);
virtual void visit(office_document_content & val);
virtual void visit(office_body & val);
virtual void visit(office_chart & val);
virtual void visit(office_text & val);
virtual void visit(office_math & val);
virtual void visit(office_body & val);
virtual void visit(office_chart & val);
virtual void visit(office_text & val);
virtual void visit(office_math & val);
virtual void visit(office_spreadsheet & val);
virtual void visit(const chart_chart& val);
virtual void visit(const chart_title& val);
virtual void visit(const chart_subtitle& val);
virtual void visit(const chart_footer& val);
virtual void visit(const chart_legend& val);
virtual void visit(const chart_chart & val);
virtual void visit(const chart_title & val);
virtual void visit(const chart_subtitle & val);
virtual void visit(const chart_footer & val);
virtual void visit(const chart_legend & val);
virtual void visit(const chart_plot_area& val);
virtual void visit(const chart_axis& val);
virtual void visit(const chart_series& val);
virtual void visit(const chart_domain& val);
virtual void visit(const chart_data_point & val);
virtual void visit(const chart_mean_value & val);
virtual void visit(const chart_error_indicator & val);
virtual void visit(const chart_axis & val);
virtual void visit(const chart_series & val);
virtual void visit(const chart_domain & val);
virtual void visit(const chart_data_point & val);
virtual void visit(const chart_mean_value & val);
virtual void visit(const chart_error_indicator & val);
virtual void visit(const chart_regression_curve & val);
virtual void visit(const chart_equation & val);
virtual void visit(const chart_categories& val);
virtual void visit(const chart_grid& val);
virtual void visit(const chart_wall& val);
virtual void visit(const chart_floor& val);
virtual void visit(const table_table& val);
virtual void visit(const chart_equation & val);
virtual void visit(const chart_categories & val);
virtual void visit(const chart_grid & val);
virtual void visit(const chart_wall & val);
virtual void visit(const chart_floor & val);
virtual void visit(const table_table & val);
virtual void visit(const table_table_rows& val);
virtual void visit(const table_rows_no_group& val);
virtual void visit(const table_table_row_group& val);
virtual void visit(const table_table_rows & val);
virtual void visit(const table_rows_no_group & val);
virtual void visit(const table_table_row_group & val);
virtual void visit(const table_table_header_rows& val);
virtual void visit(table_table_header_rows& val);
virtual void visit(table_table_header_rows & val);
virtual void visit(table_table_rows& val);
virtual void visit(const table_table_row& val);
virtual void visit(table_table_rows & val);
virtual void visit(const table_table_row & val);
virtual void visit(const table_columns_no_group& val);
virtual void visit(table_table_header_columns& val);
virtual void visit(table_table_columns& val);
virtual void visit(const table_columns_no_group & val);
virtual void visit(table_table_header_columns & val);
virtual void visit(table_table_columns & val);
virtual void visit(const table_table_column_group& val);
virtual void visit(const table_table_column& val);
virtual void visit(const table_table_column & val);
virtual void visit(const table_table_cell& val);

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

@ -116,7 +116,6 @@ public:
void apply_from(const common_horizontal_margin_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(length_or_percent) fo_margin_left_;
_CP_OPT(length_or_percent) fo_margin_right_;
};
@ -129,7 +128,6 @@ public:
void apply_from(const common_vertical_margin_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(length_or_percent) fo_margin_top_;
_CP_OPT(length_or_percent) fo_margin_bottom_;
};
@ -143,10 +141,7 @@ public:
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(length_or_percent) fo_margin_;
friend class style_page_layout_properties_attlist;
};
// common-math_style_attlist
@ -158,9 +153,7 @@ public:
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(math_variant) mathvariant_;
};
// common-break-attlist
@ -171,7 +164,6 @@ public:
void apply_from(const common_break_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(fo_break) fo_break_before_;
_CP_OPT(fo_break) fo_break_after_;
@ -185,7 +177,6 @@ public:
void apply_from(const common_page_number_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(unsigned int) style_page_number_;
};
@ -198,7 +189,6 @@ public:
void apply_from(const common_background_color_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(background_color) fo_background_color_;
};
@ -211,7 +201,6 @@ public:
void apply_from(const common_shadow_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(shadow_type) style_shadow_;
};
@ -224,7 +213,6 @@ public:
void apply_from(const common_keep_with_next_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(keep_together) keep_together_;
};
@ -238,7 +226,6 @@ public:
void serialize(CP_ATTR_NODE);
_CP_OPT(writing_mode) style_writing_mode_;
};
/// common-draw-data-attlist
@ -249,7 +236,6 @@ public:
void apply_from(const common_xlink_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) href_;
_CP_OPT(xlink_type) type_;
_CP_OPT(xlink_show) show_;
@ -265,7 +251,6 @@ public:
void apply_from(const common_value_and_type_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(office_value_type) office_value_type_;
_CP_OPT(std::wstring) office_value_;
_CP_OPT(std::wstring) office_currency_;
@ -273,7 +258,6 @@ public:
_CP_OPT(std::wstring) office_time_value_;
_CP_OPT(std::wstring) office_boolean_value_;
_CP_OPT(std::wstring) office_string_value_;
};
// common-border-attlist
@ -284,7 +268,6 @@ public:
void apply_from(const common_border_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(border_style) fo_border_;
_CP_OPT(border_style) fo_border_top_;
_CP_OPT(border_style) fo_border_bottom_;
@ -301,16 +284,10 @@ public:
void apply_from(const common_border_line_width_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
// style:border-line-width
_CP_OPT(border_widths) style_border_line_width_;
// style:border-line-width-top
_CP_OPT(border_widths) style_border_line_width_top_;
// style:border-line-width-bottom
_CP_OPT(border_widths) style_border_line_width_bottom_;
// style:border-line-width-left
_CP_OPT(border_widths) style_border_line_width_left_;
// style:border-line-width-right
_CP_OPT(border_widths) style_border_line_width_right_;
};
@ -323,7 +300,6 @@ public:
void apply_from(const common_padding_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(length) fo_padding_;
_CP_OPT(length) fo_padding_top_;
@ -340,12 +316,11 @@ public:
void apply_from(const common_rotation_angle_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(unsigned int) style_rotation_angle_;
};
/// common-num-format-attlist
// common-num-format-attlist
class common_num_format_attlist
{
public:
@ -353,13 +328,12 @@ public:
void apply_from(const common_num_format_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) style_num_format_;
_CP_OPT(Bool) style_num_letter_sync_;
};
/// common-num-format-prefix-suffix-attlist
// common-num-format-prefix-suffix-attlist
class common_num_format_prefix_suffix_attlist
{
public:
@ -367,13 +341,12 @@ public:
void apply_from(const common_num_format_prefix_suffix_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) style_num_prefix_;
_CP_OPT(std::wstring) style_num_suffix_;
};
/// common-text-align
// common-text-align
class common_text_align
{
public:
@ -381,11 +354,10 @@ public:
void apply_from(const common_text_align & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(text_align) fo_text_align_;
};
/// common-draw-size-attlist
// common-draw-size-attlist
class common_draw_size_attlist
{
public:
@ -393,7 +365,6 @@ public:
void apply_from(const common_draw_size_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(length) svg_width_;
_CP_OPT(length) svg_height_;
@ -407,7 +378,6 @@ public:
void apply_from(const common_text_anchor_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(anchor_type) type_;
_CP_OPT(unsigned int) page_number_;
};
@ -424,7 +394,6 @@ public:
}
void serialize(CP_ATTR_NODE){}
public:
// _CP_OPT(animation_type) type_;
//_CP_OPT(animation_direction) direction_;
//text:animation
@ -435,7 +404,7 @@ public:
};
/// common-draw-rel-size-attlist
// common-draw-rel-size-attlist
class common_draw_rel_size_attlist
{
public:
@ -443,13 +412,13 @@ 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
// common-vertical-rel-attlist
class common_vertical_rel_attlist
{
public:
@ -457,12 +426,11 @@ public:
void apply_from(const common_vertical_rel_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(vertical_rel) style_vertical_rel_;
};
/// common-horizontal-rel-attlist
// common-horizontal-rel-attlist
class common_horizontal_rel_attlist
{
public:
@ -470,12 +438,11 @@ public:
void apply_from(const common_horizontal_rel_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(horizontal_rel) style_horizontal_rel_;
};
/// common-vertical-pos-attlist
// common-vertical-pos-attlist
class common_vertical_pos_attlist
{
public:
@ -483,13 +450,12 @@ public:
void apply_from(const common_vertical_pos_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(vertical_pos) style_vertical_pos_;
_CP_OPT(length) svg_y_;
};
/// common-horizontal-pos-attlist
// common-horizontal-pos-attlist
class common_horizontal_pos_attlist
{
public:
@ -498,13 +464,12 @@ public:
void apply_from(const common_horizontal_pos_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(horizontal_pos) style_horizontal_pos_;
_CP_OPT(length) svg_x_;
};
/// common-draw-style-name-attlist
// common-draw-style-name-attlist
class common_draw_style_name_attlist
{
public:
@ -512,7 +477,6 @@ public:
void apply_from(const common_draw_style_name_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(style_ref) draw_style_name_;
_CP_OPT(std::wstring) draw_class_names_;
_CP_OPT(style_ref) presentation_style_name_;
@ -528,7 +492,6 @@ public:
void apply_from(const common_draw_z_index_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(int) draw_z_index_;
};
@ -540,7 +503,6 @@ public:
void apply_from(const common_draw_id_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) draw_id_;
};
@ -552,7 +514,6 @@ public:
void apply_from(const common_draw_layer_name_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) draw_layer_;
};
@ -564,7 +525,6 @@ public:
void apply_from(const common_draw_transform_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) draw_transform_;
};
@ -576,7 +536,6 @@ public:
void apply_from(const common_draw_name_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) draw_name_;
};
@ -588,7 +547,6 @@ public:
void apply_from(const common_text_spreadsheet_shape_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) table_end_cell_address_;
_CP_OPT(length) table_end_x_;
_CP_OPT(length) table_end_y_;
@ -606,7 +564,6 @@ public:
void apply_from(const common_draw_shape_with_styles_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
common_draw_z_index_attlist common_draw_z_index_attlist_;
common_draw_id_attlist common_draw_id_attlist_;
common_draw_layer_name_attlist common_draw_layer_name_attlist_;
@ -625,7 +582,6 @@ public:
void apply_from(const common_draw_text_style_name_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(style_ref) draw_text_style_name_;
};
@ -637,7 +593,6 @@ public:
void apply_from(const common_draw_position_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(length) svg_x_;
_CP_OPT(length) svg_y_;
@ -651,7 +606,6 @@ public:
void apply_from(const common_draw_shape_with_text_and_styles_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
common_draw_shape_with_styles_attlist common_draw_shape_with_styles_attlist_;
common_draw_text_style_name_attlist common_draw_text_style_name_attlist_;
};
@ -664,7 +618,6 @@ public:
void apply_from(const presentation_shape_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(std::wstring) presentation_class_;
_CP_OPT(Bool) presentation_placeholder_;
_CP_OPT(Bool) presentation_user_transformed_;
@ -678,7 +631,6 @@ public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(style_ref) style_name_;
_CP_OPT(std::wstring) number_language_;
_CP_OPT(std::wstring) number_country_;
@ -710,7 +662,6 @@ public:
void apply_from(const common_presentation_attlist & Other);
void serialize(CP_ATTR_NODE);
public:
_CP_OPT(presentation_class) presentation_class_;
_CP_OPT(std::wstring) style_name_;
_CP_OPT(Bool) presentation_placeholder_;
@ -726,7 +677,6 @@ public:
void apply_from(const common_anim_smil_attlist & Other);
void serialize(CP_ATTR_NODE){}
public:
//_CP_OPT(std::wstring) smil_direction_;
//_CP_OPT(std::wstring) smil_subtype_;
//_CP_OPT(std::wstring) smil_type_;

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 },
@ -220,8 +222,11 @@ static const _shape_converter _OO_OOX_custom_shapes[]=
{L"concave-star6" ,L"" ,0 ,0 ,0 },
{L"signet" ,L"" ,0 ,0 ,0 },
{L"doorplate" ,L"" ,0 ,0 ,0 },
{L"" ,L"round1Rect" ,0 ,0 ,0 },
{L"" ,L"round1Rect" ,0 ,0 ,0 },
{L"" ,L"round2DiagRect" ,0 ,0 ,0 },
{L"" ,L"snip2DiagRect" ,0 ,0 ,0 },
{L"" ,L"round2SameRect" ,0 ,0 ,0 },
{L"" ,L"mathPlus" ,0 ,0 ,0 },
{L"" ,L"mathMinus" ,0 ,0 ,0 },
{L"" ,L"mathMultiply" ,0 ,0 ,0 },
@ -281,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 },
@ -293,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)
@ -185,7 +184,7 @@ double inch_to_pt(double Val)
double emu_to_pt(double Val)
{
return Val * 72.0 / (360000.0 * 2.54);
return Val / 12700; // 1 / 12700 = 72.0 / (360000.0 * 2.54);
}
double px_to_pt(double Val)
{
@ -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

@ -501,7 +501,34 @@ void Compute_GraphicFill(const common_draw_fill_attlist & props, const office_el
}
}
if (props.draw_fill_)
{
fill.type = props.draw_fill_->get_type();
}
switch(fill.type)
{
case 1:
if (!fill.solid) fill.type = -1;
case 2:
if (!fill.bitmap)
{
if (fill.solid) fill.type = 1;
else fill.type = -1;
}
break;
case 3:
if (!fill.gradient)
{
fill.gradient = oox::oox_gradient_fill::create();
}
break;
case 4:
if (!fill.hatch)
{
fill.hatch = oox::oox_hatch_fill::create();
}
break;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -36,7 +36,6 @@
#include <sstream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/regex.hpp>
@ -48,16 +47,20 @@
#include "style_graphic_properties.h"
#include "odfcontext.h"
#include "../docx/xlsx_package.h"
#include "../docx/docx_package.h"
#include "../docx/pptx_package.h"
#include "datatypes/length.h"
#include "datatypes/borderstyle.h"
#include "../../../OfficeUtils/src/OfficeUtils.h"
#include "../../../Common/3dParty/pole/pole.h"
namespace cpdoccore {
namespace odf_reader {
/// draw-image-attlist
// draw-image-attlist
void draw_image_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"draw:filter-name", draw_filter_name_);
@ -85,11 +88,6 @@ void draw_chart_attlist::add_attributes( const xml::attributes_wc_ptr & Attribut
const wchar_t * draw_image::ns = L"draw";
const wchar_t * draw_image::name = L"image";
std::wostream & draw_image::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
void draw_image::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
draw_image_attlist_.add_attributes(Attributes);
@ -288,5 +286,108 @@ void draw_object_ole::add_child_element( xml::sax * Reader, const std::wstring &
CP_NOT_APPLICABLE_ELM();
}
std::wstring draw_object_ole::detectObject(const std::wstring &fileName)
{
POLE::Storage *storage = new POLE::Storage(fileName.c_str());
if (storage == NULL) return L"";
if (storage->open(false, false) == false)
{
delete storage;
return L"";
}
std::wstring prog;
POLE::Stream* pStream = new POLE::Stream(storage, "CompObj");
if ((pStream) && (pStream->size() > 28))
{
//skip the CompObjHeader
pStream->seek(28);
int sz_obj = pStream->size() - 28;
std::vector<std::string> str;
while (sz_obj > 0)
{
_UINT32 sz = 0;
pStream->read((unsigned char*)&sz, 4); sz_obj-= 4;
if (sz > sz_obj)
break;
unsigned char *data = new unsigned char[sz];
pStream->read(data, sz);
str.push_back(std::string((char*)data, sz));
delete []data;
sz_obj-= sz;
}
if (!str.empty())
{
prog = std::wstring (str.back().begin(), str.back().end());
}
delete pStream;
}
delete storage;
return prog;
}
std::wstring draw_object::office_convert(odf_document * odfDocument, int type)
{
std::wstring href_result;
std::wstring folderPath = odfDocument->get_folder();
std::wstring objectOutPath = FileSystem::Directory::CreateDirectoryWithUniqueName(folderPath);
if (type == 1)
{
oox::package::docx_document outputDocx;
oox::docx_conversion_context conversionDocxContext ( odfDocument);
conversionDocxContext.set_output_document (&outputDocx);
//conversionContext.set_font_directory (fontsPath);
if (odfDocument->docx_convert(conversionDocxContext))
{
outputDocx.write(objectOutPath);
href_result = common_xlink_attlist_.href_.get_value_or(L"Object");
int pos = href_result.find(L"./");
if (pos >= 0) href_result = href_result.substr(2);
href_result = L"docx" + href_result + L".docx";
}
}
if (type == 2)
{
oox::package::xlsx_document outputXlsx;
oox::xlsx_conversion_context conversionXlsxContext ( odfDocument);
conversionXlsxContext.set_output_document (&outputXlsx);
//conversionContext.set_font_directory (fontsPath);
if (odfDocument->xlsx_convert(conversionXlsxContext))
{
outputXlsx.write(objectOutPath);
href_result = common_xlink_attlist_.href_.get_value_or(L"Object");
int pos = href_result.find(L"./");
if (pos >= 0) href_result = href_result.substr(2);
href_result = L"xlsx" + href_result + L".xlsx";
}
}
if (!href_result.empty())
{
std::wstring temp_file = folderPath + FILE_SEPARATOR_STR + href_result;
COfficeUtils oCOfficeUtils(NULL);
oCOfficeUtils.CompressFileOrDirectory(objectOutPath.c_str(), temp_file.c_str(), -1);
}
FileSystem::Directory::DeleteDirectory(objectOutPath);
return href_result;
}
}
}

View File

@ -35,12 +35,18 @@
#include <cpdoccore/CPOptional.h>
#include <cpdoccore/xml/xmlelement.h>
#include <cpdoccore/xml/nodetype.h>
#include "office_elements.h"
#include "office_elements_create.h"
#include "datatypes/common_attlists.h"
#include "../docx/xlsxconversioncontext.h"
namespace cpdoccore {
namespace oox
{
class _oox_drawing;
}
typedef shared_ptr<oox::_oox_drawing>::Type oox_drawing_ptr;
namespace odf_reader {
/// draw-image-attlist
@ -54,7 +60,6 @@ public:
};
class draw_image : public office_element_impl<draw_image>
{
public:
@ -68,22 +73,18 @@ public:
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
private:
draw_image_attlist draw_image_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
office_element_ptr office_binary_data_;
office_element_ptr_array content_;
friend class odf_document;
};
CP_REGISTER_OFFICE_ELEMENT2(draw_image);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//draw-chart-attlist
class draw_chart_attlist
@ -91,12 +92,10 @@ class draw_chart_attlist
public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
//_CP_OPT(std::wstring) draw_filter_name_;
};
//объект рисования не нужен .. нужно только место для фрэйма - сам чарт в другом месте
class draw_chart : public office_element_impl<draw_chart>
{
public:
@ -106,7 +105,7 @@ public:
static const ElementType type = typeDrawChart;
CPDOCCORE_DEFINE_VISITABLE();
//virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void docx_convert(oox::docx_conversion_context & Context){}
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
@ -117,18 +116,19 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
private:
draw_chart_attlist draw_chart_attlist_;
draw_chart_attlist draw_chart_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
office_element_ptr_array content_;
//office_element_ptr title_;
office_element_ptr_array content_;
//office_element_ptr title_;
friend class odf_document;
};
CP_REGISTER_OFFICE_ELEMENT2(draw_chart);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//draw-frame-attlist
//draw-frame-attlist
class draw_frame_attlist
{
public:
@ -150,20 +150,17 @@ public:
static const ElementType type = typeDrawFrame;
CPDOCCORE_DEFINE_VISITABLE();
draw_frame() : oox_drawing_(NULL) {}
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
virtual void pptx_convert_placeHolder(oox::pptx_conversion_context & Context);
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
public:
int idx_in_owner ;
odf_types::common_presentation_attlist common_presentation_attlist_;
odf_types::union_common_draw_attlists common_draw_attlists_;
@ -174,7 +171,7 @@ public:
office_element_ptr_array content_;
office_element_ptr office_event_listeners_;
// в content перенести нельзя - иначе событи будет добавляться не к этому объекту а следующему
// в content перенести нельзя - иначе событи будет добавляться не к этому объекту а следующему
office_element_ptr draw_glue_point_;
office_element_ptr draw_image_map_;
//office_element_ptr draw_chart_map_;
@ -184,12 +181,19 @@ public:
friend class odf_document;
friend class draw_image;
friend class draw_chart;
oox_drawing_ptr oox_drawing_;
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_REGISTER_OFFICE_ELEMENT2(draw_frame);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//draw-frame-attlist
//-------------------------------------------------------------------------------------------------------------
//draw-frame-attlist
class draw_g_attlist
{
public:
@ -211,19 +215,19 @@ public:
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
public:
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
public:
odf_types::union_common_draw_attlists common_draw_attlists_;
draw_g_attlist draw_g_attlist_;
office_element_ptr_array content_;
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_REGISTER_OFFICE_ELEMENT2(draw_g);
//-------------------------------------------------------------------------------------------------------------
// draw-text-box-attlist
class draw_text_box_attlist
{
@ -239,7 +243,6 @@ public:
};
class draw_text_box : public office_element_impl<draw_text_box>
{
public:
@ -253,20 +256,20 @@ public:
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
draw_text_box_attlist draw_text_box_attlist_;
office_element_ptr_array content_;
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);
virtual void add_text(const std::wstring & Text);
public:
draw_text_box_attlist draw_text_box_attlist_;
office_element_ptr_array content_;
};
CP_REGISTER_OFFICE_ELEMENT2(draw_text_box);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-------------------------------------------------------------------------------------------------------------
/// draw-object-attlist
class draw_object_attlist
{
@ -289,17 +292,18 @@ public:
static const ElementType type = typeDrawObject;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
virtual void docx_convert (oox::docx_conversion_context & Context);
virtual void xlsx_convert (oox::xlsx_conversion_context & Context);
virtual void pptx_convert (oox::pptx_conversion_context & Context);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
public:
draw_object_attlist draw_object_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
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);
std::wstring office_convert(odf_document * odfDocument, int type);
};
CP_REGISTER_OFFICE_ELEMENT2(draw_object);
@ -318,13 +322,14 @@ public:
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context);
odf_types::common_xlink_attlist common_xlink_attlist_;
_CP_OPT(std::wstring) draw_class_id_;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
public:
odf_types::common_xlink_attlist common_xlink_attlist_;
_CP_OPT(std::wstring) draw_class_id_;
std::wstring detectObject(const std::wstring &fileName);
};
CP_REGISTER_OFFICE_ELEMENT2(draw_object_ole);

View File

@ -762,7 +762,7 @@ int ComputeMarginY(const style_page_layout_properties_attlist & pageProperties,
}
void common_draw_docx_convert(oox::docx_conversion_context & Context, const union_common_draw_attlists & attlists_,oox::_docx_drawing &drawing)
void common_draw_docx_convert(oox::docx_conversion_context & Context, const union_common_draw_attlists & attlists_, oox::_docx_drawing *drawing)
{
const _CP_OPT(style_ref) & styleRef = attlists_.shape_with_text_and_styles_.
common_draw_shape_with_styles_attlist_.common_draw_style_name_attlist_.draw_style_name_;
@ -773,7 +773,7 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
odf_reader::style_instance* styleInst = Context.root()->odf_context().styleContainer().style_by_name(styleName, odf_types::style_family::Graphic,Context.process_headers_footers_);
if (styleInst)
{
if (drawing.sub_type > 1) //without text-box
if (drawing->sub_type > 1) //without text-box
{
style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic);
if (defaultStyle)instances.push_back(defaultStyle);
@ -797,20 +797,20 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
/////////////////////////////////////////////////////////////////////////////////////////////
drawing.styleWrap = graphicProperties.style_wrap_;
drawing->styleWrap = graphicProperties.style_wrap_;
if (drawing.styleWrap && drawing.styleWrap->get_type() == style_wrap::Parallel)
if (drawing->styleWrap && drawing->styleWrap->get_type() == style_wrap::Parallel)
{
if (graphicProperties.style_number_wrapped_paragraphs_)
drawing.parallel = graphicProperties.style_number_wrapped_paragraphs_->get_value();
drawing->parallel = graphicProperties.style_number_wrapped_paragraphs_->get_value();
}
_CP_OPT(run_through) styleRunThrough = graphicProperties.style_run_through_;
drawing.styleHorizontalRel = graphicProperties.common_horizontal_rel_attlist_.style_horizontal_rel_;
drawing.styleHorizontalPos = graphicProperties.common_horizontal_pos_attlist_.style_horizontal_pos_;
drawing.styleVerticalPos = graphicProperties.common_vertical_pos_attlist_.style_vertical_pos_;
drawing.styleVerticalRel = graphicProperties.common_vertical_rel_attlist_.style_vertical_rel_;
drawing->styleHorizontalRel = graphicProperties.common_horizontal_rel_attlist_.style_horizontal_rel_;
drawing->styleHorizontalPos = graphicProperties.common_horizontal_pos_attlist_.style_horizontal_pos_;
drawing->styleVerticalPos = graphicProperties.common_vertical_pos_attlist_.style_vertical_pos_;
drawing->styleVerticalRel = graphicProperties.common_vertical_rel_attlist_.style_vertical_rel_;
_CP_OPT(anchor_type) anchor =
attlists_.shape_with_text_and_styles_.
@ -821,102 +821,116 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
int level_drawing = Context.get_drawing_context().get_current_level();
if (drawing.parallel == 1 || anchor && anchor->get_type() == anchor_type::AsChar || level_drawing >1 )
if (drawing->parallel == 1 || anchor && anchor->get_type() == anchor_type::AsChar || level_drawing >1 )
{
drawing.isInline = true;
drawing->isInline = true;
}
if (attlists_.shape_with_text_and_styles_.common_draw_shape_with_styles_attlist_.common_draw_transform_attlist_.draw_transform_)
{
std::wstring transformStr = attlists_.shape_with_text_and_styles_.common_draw_shape_with_styles_attlist_.common_draw_transform_attlist_.draw_transform_.get();
oox_convert_transforms(transformStr, drawing.additional);
oox_convert_transforms(transformStr, drawing->additional);
}
if (!drawing.isInline)
if (!drawing->isInline)
{
if (!drawing.styleWrap)
drawing.styleWrap = style_wrap(style_wrap::Parallel);//у опен офис и мс разные дефолты
if (!drawing->styleWrap)
drawing->styleWrap = style_wrap(style_wrap::Parallel);//у опен офис и мс разные дефолты
drawing.relativeHeight = L"2";
drawing.behindDoc = L"0";
drawing->relativeHeight = L"2";
drawing->behindDoc = L"0";
_CP_OPT(int) zIndex = attlists_.shape_with_text_and_styles_.common_draw_shape_with_styles_attlist_.common_draw_z_index_attlist_.draw_z_index_;
if (zIndex)//порядок отрисовки объектов
{
if (*zIndex < 0)
drawing.relativeHeight = L"0";
drawing->relativeHeight = L"0";
else
drawing.relativeHeight = boost::lexical_cast<std::wstring>( 2 + *zIndex );
drawing->relativeHeight = boost::lexical_cast<std::wstring>( 2 + *zIndex );
}
if (drawing.styleWrap && drawing.styleWrap->get_type() == style_wrap::RunThrough
if (drawing->styleWrap && drawing->styleWrap->get_type() == style_wrap::RunThrough
&& styleRunThrough && styleRunThrough->get_type() == run_through::Background
)
{
drawing. behindDoc = L"1";
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);
drawing->margin_rect[3] = GetMargin(graphicProperties, sideBottom);
drawing.margin_rect[0] = GetMargin(graphicProperties, sideLeft);
drawing.margin_rect[1] = GetMargin(graphicProperties, sideTop);
drawing.margin_rect[2] = GetMargin(graphicProperties, sideRight);
drawing.margin_rect[3] = GetMargin(graphicProperties, sideBottom);
drawing->posOffsetH = ComputeMarginX(pagePropertiesNode, pageProperties, attlists_, graphicProperties, drawing->additional);
drawing->posOffsetV = ComputeMarginY( pageProperties, attlists_, graphicProperties, drawing->additional);
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();
if (type == odf_types::percent_or_scale::Percent)
drawing->pctWidth = attlists_.rel_size_.style_rel_width_->get_percent().get_value();
}
if (attlists_.rel_size_.style_rel_height_ )
{
int type = attlists_.rel_size_.style_rel_height_->get_type();
if (type == odf_types::percent_or_scale::Percent)
drawing->pctHeight = attlists_.rel_size_.style_rel_height_->get_percent().get_value();
}
}
drawing.number_wrapped_paragraphs=graphicProperties.style_number_wrapped_paragraphs_.
drawing->number_wrapped_paragraphs=graphicProperties.style_number_wrapped_paragraphs_.
get_value_or( integer_or_nolimit( integer_or_nolimit::NoLimit) ).get_value();
if (anchor && anchor->get_type() == anchor_type::AsChar && drawing.posOffsetV< 0)
if (anchor && anchor->get_type() == anchor_type::AsChar && drawing->posOffsetV< 0)
{
drawing.posOffsetV = (int)(length(0.01, length::cm).get_value_unit(length::emu));
drawing->posOffsetV = (int)(length(0.01, length::cm).get_value_unit(length::emu));
}
//////////////////////////////////////////////
graphicProperties.apply_to(drawing.additional);
graphicProperties.apply_to(drawing->additional);
//////////////////////////////////////////
bool bTxbx = (drawing.sub_type == 1);
bool bTxbx = (drawing->sub_type == 1);
Compute_GraphicFill(graphicProperties.common_draw_fill_attlist_, graphicProperties.style_background_image_, Context.root()->odf_context().drawStyles() ,drawing.fill, bTxbx);
Compute_GraphicFill(graphicProperties.common_draw_fill_attlist_, graphicProperties.style_background_image_, Context.root()->odf_context().drawStyles() ,drawing->fill, bTxbx);
if ((drawing.fill.bitmap) && (drawing.fill.bitmap->rId.length() < 1))
if ((drawing->fill.bitmap) && (drawing->fill.bitmap->rId.length() < 1))
{
std::wstring href = drawing.fill.bitmap->xlink_href_;
drawing.fill.bitmap->rId = Context.add_mediaitem(href, oox::typeImage, drawing.fill.bitmap->isInternal, href);
std::wstring href = drawing->fill.bitmap->xlink_href_;
drawing->fill.bitmap->rId = Context.add_mediaitem(href, oox::typeImage, drawing->fill.bitmap->isInternal, href);
}
////////////////////////////////////////////////////
drawing.additional.push_back(odf_reader::_property(L"border_width_left", Compute_BorderWidth(graphicProperties, sideLeft)));
drawing.additional.push_back(odf_reader::_property(L"border_width_top", Compute_BorderWidth(graphicProperties, sideTop)));
drawing.additional.push_back(odf_reader::_property(L"border_width_right", Compute_BorderWidth(graphicProperties, sideRight)));
drawing.additional.push_back(odf_reader::_property(L"border_width_bottom", Compute_BorderWidth(graphicProperties, sideBottom)));
drawing->additional.push_back(odf_reader::_property(L"border_width_left", Compute_BorderWidth(graphicProperties, sideLeft)));
drawing->additional.push_back(odf_reader::_property(L"border_width_top", Compute_BorderWidth(graphicProperties, sideTop)));
drawing->additional.push_back(odf_reader::_property(L"border_width_right", Compute_BorderWidth(graphicProperties, sideRight)));
drawing->additional.push_back(odf_reader::_property(L"border_width_bottom", Compute_BorderWidth(graphicProperties, sideBottom)));
if (graphicProperties.common_border_attlist_.fo_border_)
{
if (graphicProperties.common_border_attlist_.fo_border_->is_none() == false)
{
drawing.additional.push_back(_property(L"stroke-color", graphicProperties.common_border_attlist_.fo_border_->get_color().get_hex_value() ));
drawing.additional.push_back(_property(L"stroke-width", graphicProperties.common_border_attlist_.fo_border_->get_length().get_value_unit(odf_types::length::pt) ));
drawing->additional.push_back(_property(L"stroke-color", graphicProperties.common_border_attlist_.fo_border_->get_color().get_hex_value() ));
drawing->additional.push_back(_property(L"stroke-width", graphicProperties.common_border_attlist_.fo_border_->get_length().get_value_unit(odf_types::length::pt) ));
}
}
///////////////////////////
drawing.x = get_value_emu(attlists_.position_.svg_x_);
drawing.y = get_value_emu(attlists_.position_.svg_y_);
drawing->x = get_value_emu(attlists_.position_.svg_x_);
drawing->y = get_value_emu(attlists_.position_.svg_y_);
drawing.cx = get_value_emu(attlists_.rel_size_.common_draw_size_attlist_.svg_width_);
drawing.cy = get_value_emu(attlists_.rel_size_.common_draw_size_attlist_.svg_height_);
drawing->cx = get_value_emu(attlists_.rel_size_.common_draw_size_attlist_.svg_width_);
drawing->cy = get_value_emu(attlists_.rel_size_.common_draw_size_attlist_.svg_height_);
if (drawing.cx < 0) //frame textbox int WORD_EXAMPLE.odt = 45 inch !!!!
if (drawing->cx < 0) //frame textbox int WORD_EXAMPLE.odt = 45 inch !!!!
{
drawing.cx = -drawing.cx;
drawing.additional.push_back(_property(L"fit-to-size", true));
drawing->cx = -drawing->cx;
drawing->additional.push_back(_property(L"fit-to-size", true));
}
if (drawing.cy < 0)
drawing.cy = 0;
if (drawing->cy < 0)
drawing->cy = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////
if ((drawing.styleWrap) && (drawing.styleWrap->get_type() == style_wrap::Dynamic)) //автоподбор
if ((drawing->styleWrap) && (drawing->styleWrap->get_type() == style_wrap::Dynamic)) //автоподбор
{
int max_width = get_value_emu(pageProperties.fo_page_width_);
int max_height = get_value_emu(pageProperties.fo_page_height_);
@ -949,57 +963,56 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, const unio
// }
//}
//if (drawing.cx<1 && max_width >0)
//if (drawing->cx<1 && max_width >0)
//{
// drawing.cx = std::min(762000,max_width);
// drawing->cx = std::min(762000,max_width);
//}
//if (drawing.cy <1 && max_height >0)
//if (drawing->cy <1 && max_height >0)
//{
// drawing.cy = std::min(142875,max_height);
// drawing->cy = std::min(142875,max_height);
//}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
_CP_OPT(double) dVal;
GetProperty(drawing.additional, L"svg:scale_x",dVal);
if (dVal)drawing.cx = (int)(0.5 + drawing.cx * dVal.get());
GetProperty(drawing->additional, L"svg:scale_x",dVal);
if (dVal)drawing->cx = (int)(0.5 + drawing->cx * dVal.get());
GetProperty(drawing.additional, L"svg:scale_y",dVal);
if (dVal)drawing.cy = (int)(0.5 + drawing.cy * dVal.get());
GetProperty(drawing->additional, L"svg:scale_y",dVal);
if (dVal)drawing->cy = (int)(0.5 + drawing->cy * dVal.get());
GetProperty(drawing.additional, L"svg:translate_x", dVal);
GetProperty(drawing->additional, L"svg:translate_x", dVal);
if (dVal)
{
int val = get_value_emu(dVal.get());
drawing.x = val >= 0 ? val : 0; //??? todooo отрицательные величины ...
drawing->x = val >= 0 ? val : 0; //??? todooo отрицательные величины ...
}
GetProperty(drawing.additional,L"svg:translate_y", dVal);
GetProperty(drawing->additional,L"svg:translate_y", dVal);
if (dVal)
{
int val = get_value_emu(dVal.get());
drawing.y = val >= 0 ? val : 0; //??? todooo отрицательные величины ...
drawing->y = val >= 0 ? val : 0; //??? todooo отрицательные величины ...
}
if (drawing.inGroup && drawing.type != oox::typeGroupShape)
if (drawing->inGroup && drawing->type != oox::typeGroupShape)
{
Context.get_drawing_context().set_position_child_group(drawing.x, drawing.y);
Context.get_drawing_context().set_size_child_group(drawing.cx + drawing.x, drawing.cy + drawing.y);
Context.get_drawing_context().set_position_child_group (drawing->x, drawing->y);
Context.get_drawing_context().set_size_child_group (drawing->cx + drawing->x, drawing->cy + drawing->y);
// ваще то тут "несовсем" всерно ... нужно сначала все стартовые позиции добавить ..
_INT32 x_group_offset, y_group_offset;
Context.get_drawing_context().get_position_group(x_group_offset, y_group_offset);
drawing.x -= x_group_offset;
drawing.y -= y_group_offset;
drawing->x -= x_group_offset;
drawing->y -= y_group_offset;
}
}
void draw_shape::docx_convert(oox::docx_conversion_context & Context)
{
/////...../////
//--------------------------------------------------------------------------------------------------
oox::_docx_drawing drawing = oox::_docx_drawing();
drawing.type = oox::typeShape;
@ -1016,10 +1029,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);
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 +1047,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();
@ -1041,7 +1067,7 @@ void draw_shape::docx_convert(oox::docx_conversion_context & Context)
else
Context.add_new_run(_T(""));
docx_serialize(strm, drawing, Context.get_drawing_state_content());
drawing.serialize(strm/*, Context.get_drawing_state_content()*/);
if (new_run) Context.finish_run();
@ -1062,11 +1088,18 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
if (!frame)
return;
if (pos_replaicement >=0 && !Context.get_drawing_context().get_use_image_replace())
return;//заменяемый объект
//--------------------------------------------------
//тут может быть не только текст , но и таблицы, другие объекты ...
oox::StreamsManPtr prev = Context.get_stream_man();
oox::_docx_drawing * drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
if (!drawing) return;
if (pos_replaicement >= 0 && !Context.get_drawing_context().get_use_image_replace())
{
return; //skip replacement image (math, chart, ...) - возможно записать как альтернативный контент - todooo ???
}
if (drawing->type == oox::typeUnknown)
drawing->type = oox::typeImage;
oox::StreamsManPtr prev = Context.get_stream_man();
std::wstringstream temp_stream(Context.get_drawing_context().get_text_stream_frame());
Context.set_stream_man( boost::shared_ptr<oox::streams_man>( new oox::streams_man(temp_stream) ));
@ -1087,14 +1120,7 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
Context.get_drawing_context().get_text_stream_frame() = temp_stream.str();
Context.set_stream_man(prev);
//--------------------------------------------------
oox::_docx_drawing drawing = oox::_docx_drawing();
drawing.type = oox::typeImage;
drawing.id = Context.get_drawing_context().get_current_frame_id ();
drawing.name = Context.get_drawing_context().get_current_object_name ();
drawing.inGroup = Context.get_drawing_context().in_group();
//--------------------------------------------------
oox::hyperlinks::_ref hyperlink = Context.last_hyperlink();
//нужно еще систему конроля - могут придте уже "использованные" линки с картинок - из колонтитулов (но на них уже использовали релсы)
@ -1102,20 +1128,14 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
if (hyperlink.drawing == true && hyperlink.used_rels == false)
{
oox::_hlink_desc desc = {hyperlink.id, hyperlink.href, true};
drawing.hlinks.push_back(desc);
drawing->hlinks.push_back(desc);
}
//if (Context.get_drawing_context().get_current_level() > 1)
// drawing.isInline = true;
/////////
common_draw_docx_convert(Context, frame->common_draw_attlists_, drawing);
/////////
drawing.fill.bitmap = oox::oox_bitmap_fill::create();
drawing.fill.type = 2;
drawing.fill.bitmap->isInternal = false;
drawing.fill.bitmap->rId = Context.add_mediaitem(href, oox::typeImage, drawing.fill.bitmap->isInternal,href);
drawing.fill.bitmap->bStretch = true;
drawing->fill.bitmap = oox::oox_bitmap_fill::create();
drawing->fill.type = 2;
drawing->fill.bitmap->isInternal = false;
drawing->fill.bitmap->rId = Context.add_mediaitem(href, oox::typeImage, drawing->fill.bitmap->isInternal,href);
drawing->fill.bitmap->bStretch = true;
const _CP_OPT(style_ref) & styleRef = frame->common_draw_attlists_.shape_with_text_and_styles_.
common_draw_shape_with_styles_attlist_.
@ -1131,52 +1151,20 @@ void draw_image::docx_convert(oox::docx_conversion_context & Context)
////////////////
if (properties)
{
if (properties->content().fo_clip_ && drawing.fill.bitmap)
if (properties->content().fo_clip_ && drawing->fill.bitmap)
{
std::wstring strRectClip = properties->content().fo_clip_.get();
strRectClip = strRectClip.substr(5,strRectClip.length()-6);
std::wstring fileName = Context.root()->get_folder() + FILE_SEPARATOR_STR+ href;
drawing.fill.bitmap->bCrop = parse_clipping(strRectClip,fileName,drawing.fill.bitmap->cropRect, NULL/*Context.applicationFonts_*/);
drawing->fill.bitmap->bCrop = parse_clipping(strRectClip, fileName, drawing->fill.bitmap->cropRect, NULL/*Context.applicationFonts_*/);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
std::wostream & strm = Context.output_stream();
runState = Context.get_run_state();
pState = Context.get_paragraph_state();
if (!Context.get_drawing_context().in_group() && !pState)
{
Context.start_paragraph();
Context.set_paragraph_keep(true);
pState = Context.get_paragraph_state();
}
Context.set_paragraph_state(false);
if (!Context.get_drawing_context().in_group())//user_test-odt.odt
Context.add_new_run(_T(""));
docx_serialize(strm, drawing, Context.get_drawing_state_content());
if (!Context.get_drawing_context().in_group())
Context.finish_run();
Context.set_paragraph_state(pState);
}
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 +1173,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,30 +1193,28 @@ 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);
/////...../////
//---------------------------------------------------------------------------------------------------------
const draw_frame * frame = Context.get_drawing_context().get_current_frame();//owner
if (!frame)
return;
oox::_docx_drawing drawing = oox::_docx_drawing();
drawing.type = oox::typeShape;
drawing.id = Context.get_drawing_context().get_current_frame_id();
drawing.name = Context.get_drawing_context().get_current_object_name();
drawing.inGroup = Context.get_drawing_context().in_group();
oox::_docx_drawing * drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
if (!drawing) return;
drawing.sub_type = 1; //textBox
drawing->type = oox::typeShape;
drawing->sub_type = 1; //textBox
const std::wstring & content = Context.get_drawing_context().get_text_stream_frame();
drawing.additional.push_back(_property(L"text-content",content));
drawing->additional.push_back(_property(L"text-content",content));
Context.get_drawing_context().clear_stream_frame();
/////////
common_draw_docx_convert(Context, frame->common_draw_attlists_, drawing);
//+ локальные
/////////
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_;
@ -1236,59 +1222,44 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
if ((draw_text_box_attlist_.fo_min_height_) && (draw_text_box_attlist_.fo_min_height_->get_type()==length_or_percent::Length))
{
size_t min_y = get_value_emu(draw_text_box_attlist_.fo_min_height_->get_length());
if (drawing.cy < min_y)
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)
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());
if (drawing.cy > max_y) drawing.cy = max_y;
if (drawing->cy > max_y) drawing->cy = max_y;
}
if ((draw_text_box_attlist_.fo_max_width_) && (draw_text_box_attlist_.fo_max_width_->get_type()==length_or_percent::Length))
{
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 (drawing->cx > max_x) drawing->cy = max_x;
}
if (auto_fit_text)
drawing.additional.push_back(_property(L"fit-to-size", auto_fit_text));
///////////////////////////////////////////////////////////////////
std::wostream & strm = Context.output_stream();
runState = Context.get_run_state();
pState = Context.get_paragraph_state();
if (!Context.get_drawing_context().in_group() && !pState)
if (auto_fit_shape)
{
Context.start_paragraph();
Context.set_paragraph_keep(true);
pState = Context.get_paragraph_state();
drawing->additional.push_back(_property(L"text-wrap" , 0));
drawing->additional.push_back(_property(L"auto-grow-height", auto_fit_shape));
}
Context.set_paragraph_state(false);
if (!Context.get_drawing_context().in_group())
Context.add_new_run(_T(""));
docx_serialize(strm, drawing, Context.get_drawing_state_content());
if (!Context.get_drawing_context().in_group())
Context.finish_run();
Context.set_paragraph_state(pState);
else if (auto_fit_text)
drawing->additional.push_back(_property(L"fit-to-size", auto_fit_text));
}
void draw_g::docx_convert(oox::docx_conversion_context & Context)
{
@ -1297,16 +1268,6 @@ void draw_g::docx_convert(oox::docx_conversion_context & Context)
Context.add_delayed_element(this);
return;
}
//if (Context.get_drawing_state_content())
//{
// BOOST_FOREACH(const office_element_ptr & elm, content_)
// {
// ElementType type = elm->get_type();
// elm->docx_convert(Context);
// }
// return;
//}
oox::_docx_drawing drawing = oox::_docx_drawing();
@ -1326,7 +1287,7 @@ void draw_g::docx_convert(oox::docx_conversion_context & Context)
drawing.name = Context.get_drawing_context().get_current_object_name();
//--------------------------------------------------
common_draw_docx_convert(Context, common_draw_attlists_, drawing);
common_draw_docx_convert(Context, common_draw_attlists_, &drawing);
//--------------------------------------------------
oox::StreamsManPtr prev = Context.get_stream_man();
@ -1396,7 +1357,7 @@ void draw_g::docx_convert(oox::docx_conversion_context & Context)
if (!Context.get_drawing_context().in_group())
Context.add_new_run(_T(""));
docx_serialize(strm, drawing, Context.get_drawing_state_content());
drawing.serialize(strm/*, Context.get_drawing_state_content()*/);
if (!Context.get_drawing_context().in_group())
Context.finish_run();
@ -1406,55 +1367,78 @@ 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);
return;
}
oox_drawing_ = oox_drawing_ptr(new oox::_docx_drawing());
Context.get_drawing_context().start_frame(this);
const _CP_OPT(std::wstring) name =
common_draw_attlists_.shape_with_text_and_styles_.
common_draw_shape_with_styles_attlist_.
common_draw_name_attlist_.draw_name_;
BOOST_FOREACH(const office_element_ptr & elm, content_)
Context.get_drawing_context().add_name_object(name.get_value_or(L"Object"));
oox::_docx_drawing* drawing = dynamic_cast<oox::_docx_drawing *>(oox_drawing_.get());
drawing->id = Context.get_drawing_context().get_current_frame_id();
drawing->name = Context.get_drawing_context().get_current_object_name();
drawing->inGroup = Context.get_drawing_context().in_group();
common_draw_docx_convert(Context, common_draw_attlists_, drawing);
for (int i = 0 ; i < content_.size(); i++)
{
ElementType type = elm->get_type();
Context.get_drawing_context().add_name_object(name.get_value_or(L"Object"));
elm->docx_convert(Context);
content_[i]->docx_convert(Context);
}
//-----------------------------------------------------------------------------------------------------
bool runState = Context.get_run_state();
bool pState = Context.get_paragraph_state();
bool keepState = Context.get_paragraph_keep();
Context.set_run_state (false);
Context.set_paragraph_state (false);
if (!Context.get_drawing_context().in_group() && !runState)
Context.add_new_run(_T(""));
drawing->serialize(Context.output_stream()/*, Context.get_drawing_state_content()*/);
if (!Context.get_drawing_context().in_group() && !runState)
Context.finish_run();
Context.set_run_state (runState);
Context.set_paragraph_state (pState);
Context.set_paragraph_keep (keepState);
Context.get_drawing_context().stop_frame();
}
void draw_object::docx_convert(oox::docx_conversion_context & Context)
{
try
{
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
odf_reader::odf_document * odf_reader = Context.root();
std::wstring folderPath = odf_reader->get_folder();
std::wstring objectPath = folderPath +FILE_SEPARATOR_STR + href;
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
//normalize path ??? todooo
boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);
cpdoccore::odf_reader::odf_document objectSubDoc(objectPath ,NULL);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//функциональная часть
office_element *contentSubDoc = objectSubDoc.get_impl()->get_content();
draw_frame *frame = NULL;
object_odf_context objectBuild(href);
//if (!contentSubDoc)//Diagramma.odt - кривые ссылки на объекты
// return;
//---------------------------------------------------------------------------------------------------------------------
draw_frame* frame = NULL;
oox::_docx_drawing * drawing = NULL;
office_element* contentSubDoc = objectSubDoc.get_impl()->get_content();
object_odf_context objectBuild (href);
if (contentSubDoc)
{
process_build_object process_build_object_(objectBuild, objectSubDoc.odf_context());
@ -1462,83 +1446,50 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
objectBuild.docx_convert(Context);
frame = Context.get_drawing_context().get_current_frame();//owner
frame = Context.get_drawing_context().get_current_frame(); //owner
if (frame)
drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
}
//------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1 && frame) //диаграмма
{
oox::_docx_drawing drawing = oox::_docx_drawing();
if (!frame || !drawing)
{
objectBuild.object_type_ = 0;
}
drawing.type = oox::typeChart;
drawing.id = Context.get_drawing_context().get_current_frame_id();
drawing.name = Context.get_drawing_context().get_current_object_name();
drawing.inGroup = Context.get_drawing_context().in_group();
if (objectBuild.object_type_ == 1) //диаграмма
{
drawing->type = oox::typeChart;
bool isMediaInternal = true;
drawing.chartId = Context.add_mediaitem(href, drawing.type, isMediaInternal, href);
common_draw_docx_convert(Context, frame->common_draw_attlists_, drawing);
bool runState = Context.get_run_state();
bool pState = Context.get_paragraph_state();
Context.set_run_state(false);
Context.set_paragraph_state(false);
if (!Context.get_drawing_context().in_group() && !runState)
Context.add_new_run(_T(""));
docx_serialize(Context.output_stream(), drawing, Context.get_drawing_state_content());
if (!Context.get_drawing_context().in_group() && !runState)
Context.finish_run();
Context.set_run_state (runState);
Context.set_paragraph_state (pState);
drawing->objectId = Context.add_mediaitem(href, drawing->type, isMediaInternal, href);
}
else if (objectBuild.object_type_ == 3 && frame) //мат формулы
else if (objectBuild.object_type_ == 2 ) //embedded text
{
oox::_docx_drawing drawing = oox::_docx_drawing();
drawing.type = oox::typeShape;
drawing.id = Context.get_drawing_context().get_current_frame_id();
drawing.name = Context.get_drawing_context().get_current_object_name();
drawing.inGroup = Context.get_drawing_context().in_group();
common_draw_docx_convert(Context, frame->common_draw_attlists_, drawing);
//text in text not support
}
else if (objectBuild.object_type_ == 3) //мат формулы
{
const std::wstring & content = Context.get_drawing_context().get_text_stream_frame();
bool in_frame = !drawing.isInline;
bool in_frame = !drawing->isInline;
bool runState = Context.get_run_state();
bool pState = Context.get_paragraph_state();
if (drawing.fill.type > 0)
if (drawing->fill.type > 0)
in_frame = true;
if (in_frame)
{
drawing.additional.push_back(_property(L"fit-to-size", true));
drawing.additional.push_back(_property(L"text-content", std::wstring(L"<w:p><m:oMathPara><m:oMathParaPr/>") +
drawing->type = oox::typeShape;
drawing->additional.push_back(_property(L"fit-to-size", true));
drawing->additional.push_back(_property(L"text-content", std::wstring(L"<w:p><m:oMathPara><m:oMathParaPr/>") +
content + std::wstring(L"</m:oMathPara></w:p>")));
Context.set_run_state(false);
Context.set_paragraph_state(false);
if (!Context.get_drawing_context().in_group())
Context.add_new_run(_T(""));
docx_serialize(Context.output_stream(), drawing, Context.get_drawing_state_content());
if (!Context.get_drawing_context().in_group())
Context.finish_run();
Context.set_run_state (runState);
Context.set_paragraph_state (pState);
}
else
{//in text
drawing->type = oox::typeUnknown; //not drawing
if (runState) Context.finish_run();
//if (pState == false)
{
@ -1555,10 +1506,26 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
}
Context.get_drawing_context().clear_stream_frame();
}
else if (objectBuild.object_type_ == 0)
else if (objectBuild.object_type_ == 4) //embedded sheet
{
bool & use_image_replace = Context.get_drawing_context().get_use_image_replace();
use_image_replace = true;
std::wstring href_new = office_convert(&objectSubDoc, 2);
if (!href_new.empty())
{
drawing->type = oox::typeMsObject;
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
drawing->objectId = Context.add_mediaitem(href, drawing->type, isMediaInternal, href);
drawing->objectProgId = L"Excel.Sheet.12";
}
}
else
{
//замещающая картинка(если она конечно присутствует)
bool & use_image_replace = Context.get_drawing_context().get_use_image_replace();
use_image_replace = true;
}
@ -1571,11 +1538,28 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
void draw_object_ole::docx_convert(oox::docx_conversion_context & Context)
{
//временно - замещающая картинка(если она конечно присутствует)
bool & use_image_replace = Context.get_drawing_context().get_use_image_replace();
use_image_replace = true;
//------------------------------------------------
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
if (href.empty()) return;
draw_frame* frame = Context.get_drawing_context().get_current_frame(); //owner
if (!frame) return;
oox::_docx_drawing * drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
if (!drawing) return;
drawing->type = oox::typeOleObject;
bool isMediaInternal = true;
drawing->objectId = Context.add_mediaitem(href, drawing->type, isMediaInternal, href);
drawing->objectProgId = detectObject(objectPath);
}
}

View File

@ -55,12 +55,14 @@
#include "odf_document_impl.h"
#include "calcs_styles.h"
#include "../docx/oox_drawing.h"
#include "../docx/pptx_drawing.h"
#include "chart_build_oox.h"
#include "datatypes/length.h"
#include "datatypes/borderstyle.h"
#include "../../../OfficeUtils/src/OfficeUtils.h"
namespace cpdoccore {
using namespace odf_types;
@ -86,6 +88,8 @@ void draw_frame::pptx_convert_placeHolder(oox::pptx_conversion_context & Context
}
void draw_frame::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().start_frame();
common_draw_shape_with_styles_attlist common_draw_attlist_ = common_draw_attlists_.shape_with_text_and_styles_.common_draw_shape_with_styles_attlist_;
const int z_index = common_draw_attlist_.common_draw_z_index_attlist_.draw_z_index_.get_value_or(0);
@ -109,8 +113,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);
}
@ -198,147 +202,114 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_text_context().start_base_style(baseStyleName ,odf_types::style_family::Presentation);
////////////////////////////////////////////////
int i=0;
int size = content_.size();
while(true)
oox_drawing_ = oox_drawing_ptr(new oox::_pptx_drawing());
for (int i = 0; i < content_.size(); i++)
{
if (i>=size)break;
office_element_ptr const & elm = content_[i];
elm->pptx_convert(Context);
i++;
content_[i]->pptx_convert(Context);
}
Context.get_text_context().end_base_style();
Context.get_slide_context().end_frame();
}
void draw_image::pptx_convert(oox::pptx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
Context.get_slide_context().start_image(href);
Context.get_slide_context().set_image(href);
////////////////////////////////////в принципе достаточно общая часть ...
Context.get_text_context().start_object();
int i=0;
int size = content_.size();
while(true)
for (int i = 0; i < content_.size(); i++)
{
if (i>=size)break;
content_[i]->pptx_convert(Context);
i++;
content_[i]->pptx_convert(Context);
}
std::wstring text_content_ = Context.get_text_context().end_object();
if (text_content_.length()>0)
{
Context.get_slide_context().set_property(_property(L"text-content",text_content_));
Context.get_slide_context().set_property(_property(L"text-content", text_content_));
}
////////////////////////////////////////////////////////////////////////////3 раза уже повторилась Content -> Context
Context.get_slide_context().end_image();
}
void draw_chart::pptx_convert(oox::pptx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
Context.get_slide_context().start_chart(href);
Context.get_slide_context().set_chart(href);
int i=0;
int size = content_.size();
while(true)
for (int i = 0; i < content_.size(); i++)
{
if (i>=size)break;
content_[i]->pptx_convert(Context);
i++;
content_[i]->pptx_convert(Context);
}
Context.get_slide_context().end_chart();
}
void draw_text_box::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().start_shape(2);//rect с наваротами
Context.get_slide_context().set_text_box(); //rect с наваротами
Context.get_text_context().start_object();
int i=0;
int size = content_.size();
while(true)
for (int i = 0; i < content_.size(); i++)
{
if (i>=size)break;
content_[i]->pptx_convert(Context);
i++;
content_[i]->pptx_convert(Context);
}
std::wstring text_content_ = Context.get_text_context().end_object();
if (text_content_.length()>0)
{
Context.get_slide_context().set_property(_property(L"text-content",text_content_));
}
Context.get_slide_context().end_shape();
}
void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
{
try {
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
odf_reader::odf_document * odf_reader = Context.root();
std::wstring folderPath = odf_reader->get_folder();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
//normalize path ??? todooo
boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);
cpdoccore::odf_reader::odf_document objectSubDoc(objectPath, NULL);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//в отдельных embd объектах чаще всего диаграммы, уравнения... но МОГУТ быть и обычные объекты подтипа frame!!!
//пример RemanejamentoOrcamentario.ods
///////////////////////////////////////////////////////////////////////////
//функциональная часть
//---------------------------------------------------------------------------------------------------------------------
office_element *contentSubDoc = objectSubDoc.get_impl()->get_content();
if (!contentSubDoc)
{
//здесь другой формат xml (не Open Office)
//временно - замещающая картинка(если она конечно присутствует)
Context.get_slide_context().start_object_ole();
return;
}
object_odf_context objectBuild(href);
process_build_object process_build_object_(objectBuild, objectSubDoc.odf_context());
contentSubDoc->accept(process_build_object_);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отображательная часть
//---------------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1)//диаграмма
{
const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"");
objectBuild.pptx_convert(Context);
Context.get_slide_context().start_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
Context.get_slide_context().end_chart();
Context.get_slide_context().set_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
}
else if (objectBuild.object_type_ == 2)//odt текст
else if (objectBuild.object_type_ == 2)//odt text
{
Context.get_slide_context().start_shape(2);
Context.get_text_context().start_object();
Context.get_slide_context().set_use_image_replacement();
//сменить контекст с главного на другой ... проблема со стилями!!
Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer());
objectBuild.pptx_convert(Context);
std::wstring href_new = office_convert( &objectSubDoc, 1);
std::wstring text_content_ = Context.get_text_context().end_object();
Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ...
if (text_content_.length()>0)
if (!href_new.empty())
{
Context.get_slide_context().set_property(_property(L"text-content",text_content_));
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
Context.get_slide_context().set_ms_object(href, L"Word.Document");
}
Context.get_slide_context().end_shape();
}
else if (objectBuild.object_type_ == 3) //мат формулы
else if (objectBuild.object_type_ == 3) //math
{
Context.get_slide_context().start_shape(2);
Context.get_slide_context().set_text_box();
objectBuild.pptx_convert(Context);
@ -356,11 +327,23 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_slide_context().set_property(_property(L"fit-to-size", true));
Context.get_slide_context().set_property(_property(L"text-content", text_content));
}
Context.get_slide_context().end_shape();
}
else if (objectBuild.object_type_ == 4) //ods sheet
{
Context.get_slide_context().set_use_image_replacement();
std::wstring href_new = office_convert( &objectSubDoc, 2);
if (!href_new.empty())
{
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
Context.get_slide_context().set_ms_object(href, L"Excel.Sheet");
}
}
else
{
//временно - замещающая картинка(если она конечно присутствует)
//замещающая картинка(если она конечно присутствует)
Context.get_slide_context().set_use_image_replacement();
}
@ -373,14 +356,14 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context)
{
//объект бин в embeddings
//Context.get_slide_context().start_object_ole();
//распознать тип по guid???
//временно - замещающая картинка(если она конечно присутствует)
Context.get_slide_context().set_use_image_replacement();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
//Context.get_slide_context().end_object_ole();
if (!href.empty())
Context.get_slide_context().set_ole_object(href, detectObject(objectPath));
}
}

View File

@ -53,7 +53,7 @@
#include "odf_document_impl.h"
#include "calcs_styles.h"
#include "../docx/oox_drawing.h"
#include "../docx/xlsx_drawing.h"
#include "chart_build_oox.h"
#include "datatypes/length.h"
@ -128,6 +128,7 @@ void draw_frame::xlsx_convert(oox::xlsx_conversion_context & Context)
//////////////////////////////////////////////////////////////////////////
Context.get_drawing_context().start_drawing( name);
Context.get_drawing_context().start_frame();
const _CP_OPT(length) svg_widthVal = common_draw_attlists_.rel_size_.common_draw_size_attlist_.svg_width_;
const _CP_OPT(length) svg_heightVal = common_draw_attlists_.rel_size_.common_draw_size_attlist_.svg_height_;
@ -190,12 +191,16 @@ void draw_frame::xlsx_convert(oox::xlsx_conversion_context & Context)
Compute_GraphicFill(properties.common_draw_fill_attlist_, properties.style_background_image_,
Context.root()->odf_context().drawStyles() ,fill);
Context.get_drawing_context().set_fill(fill);
oox_drawing_ = oox_drawing_ptr(new oox::_xlsx_drawing());
////////////////////////////////////////////////
for (int i = 0 ; i < content_.size(); i++)
{
office_element_ptr const & elm = content_[i];
elm->xlsx_convert(Context);
}
Context.get_drawing_context().end_frame();
Context.get_drawing_context().end_drawing();
Context.get_drawing_context().clear();
@ -204,7 +209,8 @@ void draw_frame::xlsx_convert(oox::xlsx_conversion_context & Context)
void draw_image::xlsx_convert(oox::xlsx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
Context.get_drawing_context().start_image(href);
Context.get_drawing_context().set_image(href);
////////////////////////////////////в принципе достаточно общая часть ...
Context.get_text_context().start_drawing_content();//... если в объекте есть текст он привяжется к объекту - иначе к ячейке
@ -216,25 +222,24 @@ void draw_image::xlsx_convert(oox::xlsx_conversion_context & Context)
if (text_content_.length()>0)
{
Context.get_drawing_context().set_property(_property(L"text-content",text_content_));
Context.get_drawing_context().set_property(_property(L"text-content", text_content_));
}
////////////////////////////////////////////////////////////////////////////3 раза уже повторилась Content -> Context
Context.get_drawing_context().end_image();
}
void draw_chart::xlsx_convert(oox::xlsx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
Context.get_drawing_context().start_chart(href);
Context.get_drawing_context().set_chart(href);
for (int i = 0 ; i < content_.size(); i++)
{
content_[i]->xlsx_convert(Context);
}
Context.get_drawing_context().end_chart();
}
void draw_text_box::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_drawing_context().start_shape(2);//rect с наваротами
Context.get_drawing_context().set_text_box();
Context.get_text_context().start_drawing_content();
for (int i = 0 ; i < content_.size(); i++)
@ -248,26 +253,20 @@ void draw_text_box::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_drawing_context().set_property(_property(L"text-content",text_content_));
}
Context.get_drawing_context().end_shape();
}
void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
{
try {
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
odf_reader::odf_document * odf_reader = Context.root();
std::wstring folderPath = odf_reader->get_folder();
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
// normalize path ???? todooo
boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);
cpdoccore::odf_reader::odf_document objectSubDoc(objectPath,NULL);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//в отдельных embd объектах чаще всего диаграммы... но МОГУТ быть и обычные объекты подтипа frame!!! пример RemanejamentoOrcamentario.ods
///////////////////////////////////////////////////////////////////////////
//функциональная часть
//---------------------------------------------------------------------------------------------------------------------
office_element *contentSubDoc = objectSubDoc.get_impl()->get_content();
object_odf_context objectBuild(href);
@ -276,39 +275,30 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
process_build_object process_build_object_(objectBuild, objectSubDoc.odf_context());
contentSubDoc->accept(process_build_object_);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отображательная часть
//---------------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1) //диаграмма
{
const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"");
objectBuild.xlsx_convert(Context);
Context.get_drawing_context().start_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
Context.get_drawing_context().end_chart();
Context.get_drawing_context().set_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
}
else if (objectBuild.object_type_ == 2) //текст (odt text)
{
Context.get_drawing_context().start_shape(2);
Context.get_text_context().start_drawing_content();
Context.get_drawing_context().set_use_image_replacement();
//сменить контекст с главного на другой ... проблема со стилями!!
Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer());
objectBuild.xlsx_convert(Context);
std::wstring href_new = office_convert( &objectSubDoc, 1);
std::wstring text_content = Context.get_text_context().end_drawing_content();
Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ...
if (!text_content.empty())
if (!href_new.empty())
{
Context.get_drawing_context().set_property(_property(L"text-content", text_content));
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
Context.get_drawing_context().set_ms_object(href, L"Word.Document");
}
Context.get_drawing_context().end_shape();
}
else if (objectBuild.object_type_ == 3) //мат формулы
{
Context.get_drawing_context().start_shape(2);
Context.get_drawing_context().set_text_box();
objectBuild.xlsx_convert(Context);
@ -326,11 +316,15 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
Context.get_drawing_context().set_property(_property(L"fit-to-size", true));
Context.get_drawing_context().set_property(_property(L"text-content", text_content));
}
Context.get_drawing_context().end_shape();
}
else if (objectBuild.object_type_ == 4) // embedded sheet
{
Context.get_drawing_context().set_use_image_replacement();
//???
}
else
{
//временно - замещающая картинка(если она конечно присутствует)
//замещающая картинка(если она конечно присутствует)
Context.get_drawing_context().set_use_image_replacement();
}
@ -340,15 +334,20 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
_CP_LOG << "[error] : convert draw::object error" << std::endl;
}
}
void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context)
{
//временно - замещающая картинка(если она конечно присутствует)
//Context.get_drawing_context().start_object_ole();
void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_drawing_context().set_use_image_replacement();
//Context.get_drawing_context().end_object_ole();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
if (!href.empty())
Context.get_drawing_context().set_ole_object(href, detectObject(objectPath));
}
}
}

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

@ -414,12 +414,23 @@ void number_number::oox_convert(oox::num_format_context & Context)
void number_text::oox_convert(oox::num_format_context & Context)
{
std::wostream & strm = Context.output();
std::wstringstream strm;
BOOST_FOREACH(const office_element_ptr & elm, text_)
{
elm->text_to_stream(strm);
}
std::wstring text_ = strm.str();
if (text_ == L"%")
{
}
else
{
text_ = L"\"" + text_ + L"\""; //Book 70.ods Design of Pile Cap.ods
}
Context.output() << text_;
}

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

@ -102,7 +102,17 @@ enum ElementType
typeTextUserIndex,
typeTextAlphabeticalIndex,
typeTextBibliography,
typeTextBibliographyMark,
typeTextTableOfContentSource,
typeTextIllustrationIndexSource,
typeTextTableIndexSource,
typeTextObjectIndexSource,
typeTextUserIndexSource,
typeTextAlphabeticalIndexSource,
typeTextBibliographySource,
typeTextTrackedChanges,
typeTextChangedRegion,
typeTextChangeStart,

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

@ -133,6 +133,9 @@ std::wostream & s::text_to_stream(std::wostream & _Wostream) const
else
_Wostream << std::wstring(1, L' ');
if (content_)
_Wostream << *content_;
return _Wostream;
}
@ -140,7 +143,10 @@ void s::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:c", text_c_);
}
void s::add_text(const std::wstring & Text)
{
content_ = Text;
}
void s::docx_convert(oox::docx_conversion_context & Context)
{
Context.add_element_to_run();
@ -326,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);
}
@ -353,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)
@ -400,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);
}
@ -414,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);
}
@ -426,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);
}
@ -440,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);
}
@ -459,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)
@ -521,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);
}
@ -536,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);
}
@ -545,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

@ -51,7 +51,6 @@
namespace cpdoccore {
namespace odf_reader {
namespace text {
template <class ElementT>
@ -59,33 +58,25 @@ class paragraph_content_element : public paragraph_content_impl<ElementT>
{
};
// TODO:
// 5.6 Индексные метки
// 5.7 Метки изменений
// 5.8 Внедренные графические объекты и текстовые блоки
// simple text
//////////////////////////////////////////////////////////////////////////////////////////////////
class text : public paragraph_content_element<text>
{
public:
static office_element_ptr create(const std::wstring & Text);
public:
static const wchar_t * ns;
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeText;
static const ElementType type = typeTextText;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
bool preserve_;
text(const std::wstring & Text) : text_(Text) {preserve_ = true;};
text() {preserve_ = true;};
@ -94,15 +85,10 @@ public:
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)
{};
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) {}
virtual void add_text(const std::wstring & Text);
private:
std::wstring text_;
};
@ -118,16 +104,12 @@ public:
static const ElementType type = typeTextS;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
s(unsigned int c) : text_c_(c) {};
s() {};
@ -136,10 +118,10 @@ public:
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) {}
virtual void add_text(const std::wstring & Text) {}
virtual void add_text(const std::wstring & Text);
private:
_CP_OPT(unsigned int) text_c_;
_CP_OPT(std::wstring) content_;
};
CP_REGISTER_OFFICE_ELEMENT2(s);
@ -155,26 +137,22 @@ public:
static const ElementType type = typeTextTab;
CPDOCCORE_DEFINE_VISITABLE();
public:
tab(unsigned int ab_ref) : text_tab_ref_(ab_ref) {};
tab() {};
virtual void docx_convert(oox::docx_conversion_context & Context) ;
virtual void xlsx_convert(oox::xlsx_conversion_context & Context) ;
virtual void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
_CP_OPT(unsigned int) attr_tab_ref() const { return text_tab_ref_; }
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) {}
virtual void add_text(const std::wstring & Text) {}
public:
tab(unsigned int ab_ref) : text_tab_ref_(ab_ref) {};
tab() {};
_CP_OPT(unsigned int) attr_tab_ref() const { return text_tab_ref_; }
private:
_CP_OPT(unsigned int) text_tab_ref_;
};
@ -191,15 +169,12 @@ public:
static const ElementType type = typeTextLineBreak;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
line_break() {};
private:
@ -222,10 +197,9 @@ public:
static const ElementType type = typeTextBookmark;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
bookmark() {}
bookmark() {}
bookmark(const std::wstring & Name) : text_name_(Name){};
const std::wstring & attr_name() const { return text_name_; }
@ -235,7 +209,6 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text) {}
private:
std::wstring text_name_;
};
@ -252,10 +225,9 @@ public:
static const ElementType type = typeTextBookmarkStart;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
bookmark_start() {}
bookmark_start() {}
bookmark_start(const std::wstring & Name) : text_name_(Name){};
const std::wstring & attr_name() const { return text_name_; }
@ -265,7 +237,6 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text) {}
private:
std::wstring text_name_;
};
@ -282,10 +253,9 @@ public:
static const ElementType type = typeTextBookmarkEnd;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
bookmark_end() {} ;
bookmark_end() {} ;
bookmark_end(const std::wstring & Name) : text_name_(Name){};
const std::wstring & attr_name() const { return text_name_; }
@ -295,7 +265,6 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text) {}
private:
std::wstring text_name_;
};
@ -372,10 +341,9 @@ public:
static const ElementType type = typeTextReferenceMarkEnd;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
reference_mark_end() {};
reference_mark_end() {};
reference_mark_end(const std::wstring & Name) : text_name_(Name){};
const std::wstring & attr_name() const { return text_name_; }
@ -385,7 +353,6 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
virtual void add_text(const std::wstring & Text) {}
private:
std::wstring text_name_;
};
@ -403,17 +370,15 @@ public:
static const ElementType type = typeTextSpan;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
span() {}
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_;
@ -438,22 +403,19 @@ public:
static const ElementType type = typeTextA;
CPDOCCORE_DEFINE_VISITABLE();
public:
virtual void docx_convert(oox::docx_conversion_context & Context);
virtual void xlsx_convert(oox::xlsx_conversion_context & Context);
virtual void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
public:
a() {}
a() {}
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);
virtual void add_text(const std::wstring & Text);
private:
odf_types::common_xlink_attlist common_xlink_attlist_;
std::wstring office_name_;
@ -462,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);
@ -513,6 +475,7 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
@ -660,7 +623,6 @@ public:
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context);
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
@ -668,8 +630,7 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
private:
// TODO: attributes
// todooo attributes
office_element_ptr_array text_;
};
@ -699,7 +660,7 @@ private:
virtual void add_text(const std::wstring & Text);
private:
// TODO: attributes
// todooo attributes
office_element_ptr_array text_;
};
@ -816,7 +777,6 @@ public:
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context);
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
@ -824,8 +784,7 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
private:
// TODO: attributes
// todooo attributes
office_element_ptr_array text_;
};
@ -846,7 +805,6 @@ public:
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context) ;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
private:
@ -854,8 +812,7 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
private:
// TODO: attributes
// todooo attributes
office_element_ptr_array text_;
};
@ -878,7 +835,6 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
virtual void add_text(const std::wstring & Text);
private:
office_element_ptr_array text_;
};

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

@ -87,27 +87,6 @@ bool table_format_properties::add_child_element( xml::sax * Reader, const std::w
}
}
/*
[ ] w:tblStyle Referenced Table Style
[ ] w:tblpPr Floating Table Positioning
[ ] w:tblOverlap Floating Table Allows Other Tables to Overlap
[ ] w:bidiVisual Visually Right to Left Table
[ ] w:tblStyleRowBandSize Number of Rows in Row Band
[ ] w:tblStyleColBandSize Number of Columns in Column Band
[x] w:tblW Preferred Table Width
[x] w:jc Table Alignment
[ ] w:tblCellSpacing Table Cell Spacing Default
[ ] w:tblInd Table Indent from Leading Margin
[ ] w:tblBorders Table Borders
[ ] w:shd Table Shading
[ ] w:tblLayout Table Layout
[ ] w:tblCellMar Table Cell Margin Defaults
[ ] w:tblLook Table Style Conditional Formatting Settings
[ ] w:tblPrChange Revision Information for Table Properties
*/
void table_format_properties::docx_convert(oox::docx_conversion_context & Context)
{
std::wostream & _tblPr = Context.get_styles_context().table_style();
@ -137,7 +116,7 @@ void table_format_properties::docx_convert(oox::docx_conversion_context & Contex
if (table_align_)
{
std::wstring w_val = L"left";
if (table_align_->get_type() == table_align::Margins)
if (table_align_->get_type() == table_align::Margins || table_align_->get_type() == table_align::Left)
{
if (common_horizontal_margin_attlist_.fo_margin_left_ && common_horizontal_margin_attlist_.fo_margin_right_)
{
@ -147,19 +126,16 @@ void table_format_properties::docx_convert(oox::docx_conversion_context & Contex
if (w_val != L"center" && common_horizontal_margin_attlist_.fo_margin_left_ )
{
odf_types::length indent = common_horizontal_margin_attlist_.fo_margin_left_->get_length();
_tblPr << L"<w:tblInd w:w=\"" << indent.get_value_unit(odf_types::length::pt) * 20<< "\" w:type=\"dxa\" />";
_tblPr << L"<w:tblInd w:w=\"" << indent.get_value_unit(odf_types::length::pt) * 20 << "\" w:type=\"dxa\" />";
}
}
else
else //if (table_align_->get_type() == table_align::Center)
w_val = boost::lexical_cast<std::wstring>(*table_align_);
_tblPr << L"<w:jc w:val=\"" << w_val << "\" />";
}
if (table_align_ && table_align_->get_type() == table_align::Center)
{
// TODO ()
}
_tblPr << "<w:tblLayout w:type=\"fixed\" />";
if (common_background_color_attlist_.fo_background_color_)

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,12 +438,12 @@ 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_;
else if (style_language_complex_)w_val = *style_language_complex_;
else if (style_country_complex_)w_val = *style_country_complex_;
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_;
CP_XML_ATTR(L"lang", w_val);
}
@ -444,23 +457,45 @@ void text_format_properties_content::pptx_convert(oox::pptx_conversion_context &
}
if (style_font_name_ || style_font_name_asian_ || style_font_name_complex_ || fo_font_family_)
{
std::wstring w_font = (fo_font_family_ ? *fo_font_family_: L"");
std::wstring w_ascii = (style_font_name_ ? *style_font_name_: w_font);
if (w_ascii.length()>0)
{
CP_XML_NODE(L"a:latin"){CP_XML_ATTR(L"typeface",delete_apostroph_in_name(w_ascii));}
}
fonts_container & fonts = Context.root()->odf_context().fontContainer();
if (style_font_name_asian_)
{
std::wstring w_eastAsia = *style_font_name_asian_;
CP_XML_NODE(L"a:ea"){CP_XML_ATTR(L"typeface",delete_apostroph_in_name(w_eastAsia));}
}
std::wstring w_eastAsia;
std::wstring w_hAnsi;
std::wstring w_cs;
std::wstring w_ascii = w_hAnsi = w_cs = (fo_font_family_ ? *fo_font_family_ : L"");
if (style_font_name_complex_)
{
std::wstring w_cs = *style_font_name_complex_;
CP_XML_NODE(L"a:cs"){CP_XML_ATTR(L"typeface",delete_apostroph_in_name(w_cs));}
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();
}
if (!w_ascii.empty())
{
CP_XML_NODE(L"a:latin"){CP_XML_ATTR(L"typeface", delete_apostroph_in_name(w_ascii));}
}
if (!w_eastAsia.empty())
{
CP_XML_NODE(L"a:ea"){CP_XML_ATTR(L"typeface", delete_apostroph_in_name(w_eastAsia));}
}
if (!w_cs.empty())
{
CP_XML_NODE(L"a:cs"){CP_XML_ATTR(L"typeface", delete_apostroph_in_name(w_cs));}
}
}
@ -619,7 +654,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 +701,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 +876,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 +1014,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 +1160,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 +1207,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 +1364,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)

Some files were not shown because too many files have changed in this diff Show More