Compare commits

...

55 Commits

Author SHA1 Message Date
b9216e9bdc OdfFormatReader - convert tables of indexes 2018-06-08 19:20:18 +03:00
253c24cf03 [x2t] Fix bug #36574 2018-06-07 14:31:14 +03:00
02e8649a61 . 2018-06-06 19:32:16 +03:00
447dc81426 [ios][x2t] enable txt format 2018-06-06 16:02:57 +03:00
0f3c883d24 . 2018-06-06 15:24:54 +03:00
0b16b9a7f9 . 2018-06-05 19:35:00 +03:00
7014faa9a1 . 2018-06-04 15:27:48 +03:00
93287c84c8 OdfFormatReader - meta data file, new convert tabs stop 2018-06-04 15:24:49 +03:00
dafcbacfaf [ios][x2t] add version property 2018-06-04 13:48:09 +03:00
1c73ff0c3f Merge remote-tracking branch 'origin/hotfix/v5.1.5' into develop 2018-06-01 18:18:31 +03:00
5a8c9069be OdfFormatReader - fix users file 2018-06-01 18:17:56 +03:00
4ba2e1fa6d x2t - split version info in separate file 2018-06-01 16:11:13 +03:00
95af281145 x2t - write embedded ms package with zero offsets 2018-05-31 17:29:44 +03:00
00fb2ba7bb [ios][x2t] update converter 2018-05-31 14:44:14 +03:00
0f65e36517 Merge branch 'feature/graphics' into develop 2018-05-31 11:39:29 +03:00
aa1af73fda x2t version up 2018-05-30 19:20:18 +03:00
1610978821 [ios][se][pe] fixed build 2018-05-30 18:08:43 +03:00
20faf24556 RtfFormatWriter - add comments (fix bug #37807) 2018-05-30 16:37:41 +03:00
ae90e4ae96 Merge pull request #87 from ONLYOFFICE/feature/onlypass
Feature/onlypass
2018-05-30 13:58:42 +03:00
6fae9115ea Merge branch 'hotfix/v5.1.5' into feature/onlypass 2018-05-30 13:58:29 +03:00
c14a21b2da Merge remote-tracking branch 'origin/hotfix/v5.1.5' into develop 2018-05-30 13:21:14 +03:00
b952692225 . 2018-05-30 12:50:50 +03:00
23249e69f9 . 2018-05-29 19:53:13 +03:00
09f6c3f4e8 . 2018-05-29 19:03:58 +03:00
111ceff368 [ios][x2t] update converter 2018-05-29 18:55:18 +03:00
867b0634f3 Fix bug #36423
Fix problem with the clip in the EMF
2018-05-29 18:33:49 +03:00
f9c27275a7 . 2018-05-29 17:01:34 +03:00
dd12ee0b9e Merge remote-tracking branch 'origin/hotfix/v5.1.5' into develop 2018-05-29 16:24:03 +03:00
de83971832 [x2t] Fix dependence of docx comments with empty text 2018-05-29 16:01:50 +03:00
0d158e46b5 OdfFormatWriter - extending number formats 2018-05-29 16:03:08 +03:00
dde6b8bdc7 . 2018-05-29 14:15:32 +03:00
b66bb0d63f RtfFormatReader - add commetns 2018-05-29 14:14:33 +03:00
d666da2697 OdfFormatReader - fix bug #37832 2018-05-28 13:35:45 +03:00
8e35f9b063 [ios][x2t] fixed build 2018-05-25 12:25:37 +03:00
25268b706d OdfFormatreader - content of illustrations 2018-05-24 18:40:01 +03:00
97ff1efba8 XlsFormat -fix issue 308 2018-05-24 17:52:21 +03:00
1879ce8dbb v5.1.4 2018-05-24 15:34:46 +03:00
50ff5fc0b2 v5.1.4 2018-05-24 15:32:34 +03:00
537e774f79 . 2018-05-24 15:08:20 +03:00
6d3761c20b XlsFormatReader - fix arrow 2018-05-24 12:18:43 +03:00
ee41b4ccb2 [x2t] Replace XmlUtils::CStringWriter with NSStringUtils::CStringBuilder 2018-05-24 12:00:53 +03:00
7b0f902c0f [x2t] Turn on DeleteNoUnicode option for bug #37789 2018-05-23 20:32:03 +03:00
e6039f7f6f OdfFormatReader - convert table content to sdt table content 2018-05-23 19:28:29 +03:00
1c2b86519e [bug] Fix bug 37565 2018-05-23 16:38:24 +03:00
755119c825 fix bug #35107 2018-05-23 15:24:40 +03:00
3a73480437 fix bug #37537 2018-05-23 14:51:05 +03:00
323d1b44cd openssl 2018-05-23 13:36:26 +03:00
a99a195c68 OdfFormatReader - convert form elements aka field elements (in editor visualization is worse) 2018-05-22 17:43:30 +03:00
0d979b8033 OdfFormatReader - convert form elements aka sdt elements 2018-05-22 16:23:42 +03:00
dd3b671e57 . 2018-05-21 19:47:31 +03:00
74bd059607 OdfFormatReader - forms, controls 2018-05-21 19:46:56 +03:00
83fa44edcd Use system libcurl 2018-05-21 18:12:06 +03:00
2ead42a513 Build on linux 2018-05-17 15:32:23 +03:00
427046cb8f Fix build on mac 2018-05-17 12:14:12 +03:00
e60cc05b6e Downgrade icu to v58.2
ICU58 is the last version that works on Windows XP and Windows Vista.
2018-05-16 12:20:15 +03:00
160 changed files with 8527 additions and 2902 deletions

View File

@ -39,7 +39,7 @@ namespace Writers
{
class DocumentWriter : public ContentWriter
{
XmlUtils::CStringWriter m_oWriter;
NSStringUtils::CStringBuilder m_oWriter;
HeaderFooterWriter& m_oHeaderFooterWriter;
public:
std::wstring m_sDir;

View File

@ -40,9 +40,9 @@ namespace Writers
class ContentWriter
{
public:
XmlUtils::CStringWriter m_oBackground;
XmlUtils::CStringWriter m_oContent;
XmlUtils::CStringWriter m_oSecPr;
NSStringUtils::CStringBuilder m_oBackground;
NSStringUtils::CStringBuilder m_oContent;
NSStringUtils::CStringBuilder m_oSecPr;
};
class HdrFtrItem
{

View File

@ -38,7 +38,7 @@ namespace Writers
{
class MediaWriter
{
XmlUtils::CStringWriter m_oWriter;
NSStringUtils::CStringBuilder m_oWriter;
std::wstring m_sDir;
std::wstring m_sMediaDir;
public:

View File

@ -41,11 +41,11 @@ namespace Writers
class NumberingWriter
{
XmlUtils::CStringWriter m_oWriter;
NSStringUtils::CStringBuilder m_oWriter;
std::wstring m_sDir;
public:
XmlUtils::CStringWriter m_oANum;
XmlUtils::CStringWriter m_oNumList;
NSStringUtils::CStringBuilder m_oANum;
NSStringUtils::CStringBuilder m_oNumList;
NumberingWriter( std::wstring sDir) : m_sDir(sDir)
{

View File

@ -516,7 +516,7 @@ public:
bRStyle || bSpacing || bDStrikeout || bCaps || bSmallCaps || bPosition || bFontHint || bBoldCs || bItalicCs || bFontSizeCs || bCs || bRtl || bLang || bLangBidi || bLangEA || bThemeColor || bVanish ||
!Outline.empty() || !Fill.empty() || !Del.empty() || !Ins.empty() || !MoveFrom.empty() || !MoveTo.empty() || !rPrChange.empty();
}
void Write(XmlUtils::CStringWriter* pCStringWriter)
void Write(NSStringUtils::CStringBuilder* pCStringWriter)
{
pCStringWriter->WriteString(L"<w:rPr>");
if(bRStyle)
@ -834,7 +834,7 @@ public:
bpersonalCompose = false;
bpersonalReply = false;
}
void Write(XmlUtils::CStringWriter* pCStringWriter)
void Write(NSStringUtils::CStringBuilder* pCStringWriter)
{
std::wstring sType;
switch(byteType)
@ -990,7 +990,7 @@ public:
class tblStylePr
{
public:
XmlUtils::CStringWriter Writer;
NSStringUtils::CStringBuilder Writer;
BYTE Type;
bool bType;
public:
@ -1050,7 +1050,7 @@ public:
bHeight = false;
bPaddings = false;
}
void Write(XmlUtils::CStringWriter* pCStringWriter)
void Write(NSStringUtils::CStringBuilder* pCStringWriter)
{
if(bType)
{
@ -1111,7 +1111,7 @@ public:
// tblPr()
// {
// }
// void Write(CStringWriter* pCStringWriter)
// void Write(NSStringUtils::CStringBuilder* pCStringWriter)
// {
// }
//};
@ -1131,7 +1131,7 @@ public:
bW = false;
bWDocx = false;
}
void Write(XmlUtils::CStringWriter& pCStringWriter, const std::wstring& sName)
void Write(NSStringUtils::CStringBuilder& pCStringWriter, const std::wstring& sName)
{
pCStringWriter.WriteString(Write(sName));
}
@ -1185,7 +1185,7 @@ public:
bValue = false;
bThemeColor = false;
}
void Write(std::wstring sName, XmlUtils::CStringWriter* pCStringWriter, bool bCell)
void Write(std::wstring sName, NSStringUtils::CStringBuilder* pCStringWriter, bool bCell)
{
if(bValue)
{
@ -1276,7 +1276,7 @@ public:
{
return !(bLeft || bTop || bRight || bBottom || bInsideV || bInsideH || bBetween);
}
void Write(XmlUtils::CStringWriter* pCStringWriter, bool bCell)
void Write(NSStringUtils::CStringBuilder* pCStringWriter, bool bCell)
{
if(bLeft)
oLeft.Write(L"w:left", pCStringWriter, bCell);
@ -1318,8 +1318,8 @@ public:
long Restart;
long Start;
BYTE Suff;
XmlUtils::CStringWriter ParaPr;
XmlUtils::CStringWriter TextPr;
NSStringUtils::CStringBuilder ParaPr;
NSStringUtils::CStringBuilder TextPr;
std::wstring PStyle;
bool bILvl;
@ -1352,7 +1352,7 @@ public:
delete Text[i];
}
}
void Write(XmlUtils::CStringWriter& oWriter)
void Write(NSStringUtils::CStringBuilder& oWriter)
{
oWriter.WriteString(L"<w:lvl");
if(bILvl)
@ -1475,7 +1475,7 @@ public:
{
RELEASEOBJECT(Lvl);
}
void Write(XmlUtils::CStringWriter& oWriter)
void Write(NSStringUtils::CStringBuilder& oWriter)
{
oWriter.WriteString(L"<w:lvlOverride");
if (bILvl)
@ -1518,7 +1518,7 @@ public:
delete Lvls[i];
}
}
void Write(XmlUtils::CStringWriter& oWriterANum)
void Write(NSStringUtils::CStringBuilder& oWriterANum)
{
if(bId)
{
@ -1561,7 +1561,7 @@ public:
RELEASEOBJECT(LvlOverrides[i]);
}
}
void Write(XmlUtils::CStringWriter& oWriterNumList)
void Write(NSStringUtils::CStringBuilder& oWriterNumList)
{
if(bAId && bId)
{
@ -1585,7 +1585,7 @@ public:
sName = name;
bGridAfter = false;
}
void Write(XmlUtils::CStringWriter& writer)
void Write(NSStringUtils::CStringBuilder& writer)
{
if(bGridAfter && nGridAfter > 0)
{
@ -1602,7 +1602,7 @@ public:
std::wstring href;
std::wstring anchor;
std::wstring tooltip;
XmlUtils::CStringWriter writer;
NSStringUtils::CStringBuilder writer;
static WriteHyperlink* Parse(std::wstring fld)
{
WriteHyperlink* res = NULL;
@ -1681,7 +1681,7 @@ public:
}
return res;
}
void Write(XmlUtils::CStringWriter& wr)
void Write(NSStringUtils::CStringBuilder& wr)
{
if(false == rId.empty())
{
@ -1877,25 +1877,22 @@ public:
sRes += L"\"";
}
sRes += L">";
if(false == pComment->Text.empty())
std::wstring sText = pComment->Text;
XmlUtils::replace_all(sText, L"\r", L"");
bool bFirst = true;
int nPrevIndex = 0;
for (int i = 0; i < (int)sText.length(); i++)
{
std::wstring sText = pComment->Text;
XmlUtils::replace_all(sText, L"\r", L"");
bool bFirst = true;
int nPrevIndex = 0;
for (int i = 0; i < (int)sText.length(); i++)
wchar_t cToken = sText[i];
if('\n' == cToken)
{
wchar_t cToken = sText[i];
if('\n' == cToken)
{
bFirst = writeContentWritePart(pComment, sText, nPrevIndex, i, bFirst, sRes);
nPrevIndex = i + 1;
}
bFirst = writeContentWritePart(pComment, sText, nPrevIndex, i, bFirst, sRes);
nPrevIndex = i + 1;
}
writeContentWritePart(pComment, sText, nPrevIndex, (int)sText.length(), bFirst, sRes);
}
writeContentWritePart(pComment, sText, nPrevIndex, (int)sText.length(), bFirst, sRes);
sRes += L"</w:comment>";
return sRes;
}
@ -2590,7 +2587,7 @@ public: CFramePr()
{
return !(bDropCap || bH || bHAnchor || bHRule || bHSpace || bLines || bVAnchor || bVSpace || bW || bWrap || bX || bXAlign || bY || bYAlign);
}
void Write(XmlUtils::CStringWriter& oStringWriter)
void Write(NSStringUtils::CStringBuilder& oStringWriter)
{
oStringWriter.WriteString(L"<w:framePr");
if(bDropCap)
@ -2728,7 +2725,7 @@ public:
std::wstring sDocLocation;
std::wstring sTgtFrame;
XmlUtils::CStringWriter writer;
NSStringUtils::CStringBuilder writer;
bool bHistory;
public:
@ -2736,7 +2733,7 @@ public:
{
bHistory = false;
}
void Write(XmlUtils::CStringWriter& wr)
void Write(NSStringUtils::CStringBuilder& wr)
{
if(false == rId.empty())
{
@ -2767,12 +2764,12 @@ public:
class CFldSimple{
public:
std::wstring sInstr;
XmlUtils::CStringWriter writer;
NSStringUtils::CStringBuilder writer;
public:
CFldSimple()
{
}
void Write(XmlUtils::CStringWriter& wr)
void Write(NSStringUtils::CStringBuilder& wr)
{
if(false == sInstr.empty())
{
@ -2797,14 +2794,14 @@ public:
long* vMergeOrigin;
rPr* RPr;
XmlUtils::CStringWriter* PPr;
NSStringUtils::CStringBuilder* PPr;
SectPr* sectPr;
CWiterTblPr* tblPr;
XmlUtils::CStringWriter* tblGridChange;
XmlUtils::CStringWriter* trPr;
XmlUtils::CStringWriter* tcPr;
XmlUtils::CStringWriter* content;
XmlUtils::CStringWriter* contentRun;
NSStringUtils::CStringBuilder* tblGridChange;
NSStringUtils::CStringBuilder* trPr;
NSStringUtils::CStringBuilder* tcPr;
NSStringUtils::CStringBuilder* content;
NSStringUtils::CStringBuilder* contentRun;
TrackRevision()
{
Id = NULL;
@ -2841,11 +2838,11 @@ public:
}
std::wstring ToString(std::wstring sName)
{
XmlUtils::CStringWriter writer;
NSStringUtils::CStringBuilder writer;
Write(&writer, sName);
return writer.GetData();
}
void Write(XmlUtils::CStringWriter* pCStringWriter, std::wstring sName)
void Write(NSStringUtils::CStringBuilder* pCStringWriter, std::wstring sName)
{
if(IsNoEmpty())
{

View File

@ -659,7 +659,7 @@ public:
int ReadContent( BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
switch(type)
{
case c_oSerProp_pPrType::ContextualSpacing:
@ -672,7 +672,7 @@ public:
}break;
case c_oSerProp_pPrType::Ind:
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, this->ReadInd, &oTempWriter);
if(oTempWriter.GetCurSize() > 0)
{
@ -915,7 +915,7 @@ public:
READ1_TRACKREV(type, length, pPPrChange)
else if(c_oSerProp_RevisionType::pPrChange == type)
{
pPPrChange->PPr = new XmlUtils::CStringWriter();
pPPrChange->PPr = new NSStringUtils::CStringBuilder();
res = Read(length, pPPrChange->PPr);
}
else
@ -925,7 +925,7 @@ public:
int ReadInd(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
switch(type)
{
case c_oSerProp_pPrType::Ind_Left:
@ -1032,7 +1032,7 @@ public:
int ReadNumPr(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if(c_oSerProp_pPrType::numPr_lvl == type)
{
long nLvl = m_oBufferedStream.GetLong();
@ -1723,7 +1723,7 @@ public:
}
else if( c_oSerProp_tblPrType::TableCellMar == type )
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ1_DEF(length, res, this->ReadCellMargins, &oTempWriter);
if(oTempWriter.GetCurSize() > 0)
{
@ -1738,7 +1738,7 @@ public:
READ1_DEF(length, res, oBinary_pPrReader.ReadBorders, &odocBorders);
if(false == odocBorders.IsEmpty())
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
odocBorders.Write(&oTempWriter, false);
pWiterTblPr->TableBorders += L"<w:tblBorders>";
pWiterTblPr->TableBorders += oTempWriter.GetData();
@ -1754,7 +1754,7 @@ public:
}
else if( c_oSerProp_tblPrType::tblpPr == type )
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, this->Read_tblpPr, &oTempWriter);
pWiterTblPr->tblpPr += L"<w:tblpPr w:vertAnchor=\"page\" w:horzAnchor=\"page\"";
pWiterTblPr->tblpPr += oTempWriter.GetData();
@ -1762,7 +1762,7 @@ public:
}
else if( c_oSerProp_tblPrType::tblpPr2 == type )
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, this->Read_tblpPr2, &oTempWriter);
pWiterTblPr->tblpPr += L"<w:tblpPr";
pWiterTblPr->tblpPr += oTempWriter.GetData();
@ -1852,7 +1852,7 @@ public:
int ReadCellMargins(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerMarginsType::left == type )
{
docW oLeft;
@ -1884,7 +1884,7 @@ public:
int Read_tblpPr(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSer_tblpPrType::X == type )
{
double dX = m_oBufferedStream.GetDouble();
@ -1938,7 +1938,7 @@ public:
int Read_tblpPr2(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSer_tblpPrType2::HorzAnchor == type )
{
std::wstring sXml;
@ -2017,7 +2017,7 @@ public:
int Read_RowPr(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerProp_rowPrType::CantSplit == type )
{
BYTE CantSplit = m_oBufferedStream.GetUChar();
@ -2186,7 +2186,7 @@ public:
int Read_CellPr(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerProp_cellPrType::GridSpan == type )
{
long nGridSpan = m_oBufferedStream.GetLong();
@ -2215,7 +2215,7 @@ public:
}
else if( c_oSerProp_cellPrType::CellMar == type )
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ1_DEF(length, res, this->ReadCellMargins, &oTempWriter);
if(oTempWriter.GetCurSize() > 0)
{
@ -2340,7 +2340,7 @@ public:
int ReadPaddings2(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if (c_oSerPaddingType::left == type)
{
double dLeft = m_oBufferedStream.GetDouble();
@ -2411,7 +2411,7 @@ public:
READ1_TRACKREV(type, length, pTrackRevision)
else if (c_oSerProp_RevisionType::tblPrChange == type)
{
pTrackRevision->trPr = new XmlUtils::CStringWriter();
pTrackRevision->trPr = new NSStringUtils::CStringBuilder();
READ2_DEF(length, res, this->Read_RowPr, pTrackRevision->trPr);
}
else
@ -2425,7 +2425,7 @@ public:
READ1_TRACKREV(type, length, pTrackRevision)
else if (c_oSerProp_RevisionType::tcPrChange == type)
{
pTrackRevision->tcPr = new XmlUtils::CStringWriter();
pTrackRevision->tcPr = new NSStringUtils::CStringBuilder();
READ2_DEF(length, res, this->Read_CellPr, pTrackRevision->tcPr);
}
else
@ -2827,14 +2827,14 @@ public:
res = oBinary_rPrReader.Read(length, &oNew_rPr);
if(oNew_rPr.IsNoEmpty())
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
oNew_rPr.Write(&oTempWriter);
odocStyle->TextPr = oTempWriter.GetData();
}
}
else if(c_oSer_sts::Style_ParaPr == type)
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
oBinary_pPrReader.m_nCurNumId = -1;
oBinary_pPrReader.m_nCurLvl = -1;
res = oBinary_pPrReader.Read(length, &oTempWriter);
@ -2848,14 +2848,14 @@ public:
}
else if(c_oSer_sts::Style_RowPr == type)
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, oBinary_tblPrReader.Read_RowPr, &oTempWriter);
std::wstring sRowPr = oTempWriter.GetData();
odocStyle->RowPr = sRowPr;
}
else if(c_oSer_sts::Style_CellPr == type)
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, oBinary_tblPrReader.Read_CellPr, &oTempWriter);
std::wstring sCellPr = oTempWriter.GetData();
odocStyle->CellPr = sCellPr;
@ -2912,7 +2912,7 @@ public:
READ1_DEF(length, res, this->ReadTblStyleProperty, &otblStylePr);
if(otblStylePr.bType && otblStylePr.Writer.GetCurSize() > 0)
{
XmlUtils::CStringWriter oCStringWriter;
NSStringUtils::CStringBuilder oCStringWriter;
switch(otblStylePr.Type)
{
case ETblStyleOverrideType::tblstyleoverridetypeBand1Horz: oCStringWriter.WriteString(std::wstring(_T("<w:tblStylePr w:type=\"band1Horz\">")));break;
@ -2959,7 +2959,7 @@ public:
}
else if(c_oSerProp_tblStylePrType::ParPr == type)
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
res = oBinary_pPrReader.Read(length, &oTempWriter);
if(oTempWriter.GetCurSize() > 0)
{
@ -2978,7 +2978,7 @@ public:
}
else if(c_oSerProp_tblStylePrType::TrPr == type)
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, oBinary_tblPrReader.Read_RowPr, &oTempWriter);
if(oTempWriter.GetCurSize() > 0)
@ -2990,7 +2990,7 @@ public:
}
else if(c_oSerProp_tblStylePrType::TcPr == type)
{
XmlUtils::CStringWriter oTempWriter;
NSStringUtils::CStringBuilder oTempWriter;
READ2_DEF(length, res, oBinary_tblPrReader.Read_CellPr, &oTempWriter);
if(oTempWriter.GetCurSize() > 0)
{
@ -3711,10 +3711,10 @@ private:
Binary_pPrReader oBinary_pPrReader;
Binary_rPrReader oBinary_rPrReader;
Binary_tblPrReader oBinary_tblPrReader;
XmlUtils::CStringWriter* m_pCurWriter;
NSStringUtils::CStringBuilder* m_pCurWriter;
rPr m_oCur_rPr;
rPr m_oMath_rPr;
XmlUtils::CStringWriter m_oCur_pPr;
NSStringUtils::CStringBuilder m_oCur_pPr;
BYTE m_byteLastElemType;
CComments* m_pComments;
public:
@ -3747,7 +3747,7 @@ public:
READ_TABLE_DEF(res, this->ReadDocumentContent, NULL);
return res;
}
XmlUtils::CStringWriter& GetRunStringWriter()
NSStringUtils::CStringBuilder& GetRunStringWriter()
{
if(NULL != m_pCurWriter)
return *m_pCurWriter;
@ -3990,8 +3990,8 @@ public:
READ1_TRACKREV(type, length, pTrackRevision)
else if ( c_oSerProp_RevisionType::Content == type )
{
pTrackRevision->content = new XmlUtils::CStringWriter();
XmlUtils::CStringWriter* pPrevWriter = m_pCurWriter;
pTrackRevision->content = new NSStringUtils::CStringBuilder();
NSStringUtils::CStringBuilder* pPrevWriter = m_pCurWriter;
m_pCurWriter = pTrackRevision->content;
READ1_DEF(length, res, this->ReadParagraphContent, NULL);
m_pCurWriter = pPrevWriter;
@ -4157,7 +4157,7 @@ public:
pFldSimple->sInstr = m_oBufferedStream.GetString3(length);
else if ( c_oSer_FldSimpleType::Content == type )
{
XmlUtils::CStringWriter* pPrevWriter = m_pCurWriter;
NSStringUtils::CStringBuilder* pPrevWriter = m_pCurWriter;
m_pCurWriter = &pFldSimple->writer;
READ1_DEF(length, res, this->ReadParagraphContent, NULL);
m_pCurWriter = pPrevWriter;
@ -4447,7 +4447,7 @@ public:
pHyperlink->sTgtFrame = m_oBufferedStream.GetString3(length);
else if ( c_oSer_HyperlinkType::Content == type )
{
XmlUtils::CStringWriter* pPrevWriter = m_pCurWriter;
NSStringUtils::CStringBuilder* pPrevWriter = m_pCurWriter;
m_pCurWriter = &pHyperlink->writer;
READ1_DEF(length, res, this->ReadParagraphContent, NULL);
long rId;
@ -6119,8 +6119,8 @@ public:
READ1_TRACKREV(type, length, pTrackRevision)
else if(c_oSerProp_RevisionType::ContentRun == type)
{
pTrackRevision->contentRun = new XmlUtils::CStringWriter();
XmlUtils::CStringWriter* pPrevWriter = m_pCurWriter;
pTrackRevision->contentRun = new NSStringUtils::CStringBuilder();
NSStringUtils::CStringBuilder* pPrevWriter = m_pCurWriter;
m_pCurWriter = pTrackRevision->contentRun;
READ1_DEF(length, res, this->ReadMathMRun, NULL);
m_pCurWriter = pPrevWriter;
@ -7028,7 +7028,7 @@ public:
int ReadDocTable(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerDocTableType::tblPr == type )
{
CWiterTblPr oWiterTblPr;
@ -7053,7 +7053,7 @@ public:
int Read_tblGrid(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerDocTableType::tblGrid_Item == type )
{
double dgridCol = m_oBufferedStream.GetDouble();
@ -7083,7 +7083,7 @@ public:
else if(c_oSerProp_RevisionType::tblGridChange == type)
{
oBinary_tblPrReader.m_aCurTblGrid.clear();
pTrackRevision->tblGridChange = new XmlUtils::CStringWriter();
pTrackRevision->tblGridChange = new NSStringUtils::CStringBuilder();
READ2_DEF(length, res, this->Read_tblGrid, pTrackRevision->tblGridChange);
}
else
@ -7093,7 +7093,7 @@ public:
int Read_TableContent(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerDocTableType::Row == type )
{
pCStringWriter->WriteString(std::wstring(_T("<w:tr>")));
@ -7124,7 +7124,7 @@ public:
int Read_Row(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerDocTableType::Row_Pr == type )
{
pCStringWriter->WriteString(std::wstring(_T("<w:trPr>")));
@ -7142,7 +7142,7 @@ public:
int ReadRowContent(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerDocTableType::Cell == type )
{
pCStringWriter->WriteString(std::wstring(_T("<w:tc>")));
@ -7173,7 +7173,7 @@ public:
int ReadCell(BYTE type, long length, void* poResult)
{
int res = c_oSerConstants::ReadOk;
XmlUtils::CStringWriter* pCStringWriter = static_cast<XmlUtils::CStringWriter*>(poResult);
NSStringUtils::CStringBuilder* pCStringWriter = static_cast<NSStringUtils::CStringBuilder*>(poResult);
if( c_oSerDocTableType::Cell_Pr == type )
{
pCStringWriter->WriteString(std::wstring(_T("<w:tcPr>")));
@ -8260,7 +8260,7 @@ public:
}
else if ( c_oSerNotes::NoteContent == type )
{
XmlUtils::CStringWriter& writer = pBinary_DocumentTableReader->m_oDocumentWriter.m_oContent;
NSStringUtils::CStringBuilder& writer = pBinary_DocumentTableReader->m_oDocumentWriter.m_oContent;
if(m_bIsFootnote)
{
writer.WriteString(L"<w:footnote");

View File

@ -43,7 +43,7 @@ namespace Writers
class SettingWriter
{
std::wstring m_sDir;
XmlUtils::CStringWriter m_oSettingWriter;
NSStringUtils::CStringBuilder m_oSettingWriter;
HeaderFooterWriter& m_oHeaderFooterWriter;
public:
SettingWriter(std::wstring sDir, HeaderFooterWriter& oHeaderFooterWriter):m_sDir(sDir),m_oHeaderFooterWriter(oHeaderFooterWriter)

View File

@ -46,12 +46,12 @@ namespace Writers
class StylesWriter
{
XmlUtils::CStringWriter m_oWriter;
NSStringUtils::CStringBuilder m_oWriter;
std::wstring m_sDir;
public:
XmlUtils::CStringWriter m_Styles;
XmlUtils::CStringWriter m_rPrDefault;
XmlUtils::CStringWriter m_pPrDefault;
NSStringUtils::CStringBuilder m_Styles;
NSStringUtils::CStringBuilder m_rPrDefault;
NSStringUtils::CStringBuilder m_pPrDefault;
int m_nVersion;
StylesWriter(std::wstring sDir, int nVersion):m_sDir(sDir),m_nVersion(nVersion)
{

View File

@ -43,7 +43,7 @@ namespace Writers
class FontTableWriter
{
XmlUtils::CStringWriter m_oWriter;
NSStringUtils::CStringBuilder m_oWriter;
std::wstring m_sDir;
NSFonts::IApplicationFonts* m_pApplicationFonts;
NSFonts::IFontManager* m_pFontManager;

View File

@ -19,9 +19,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OdfFormulasConvert", "..\wi
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OdfFileReaderTest", "OdfFileTest.vcproj", "{C2882DDD-07E6-4314-AD4B-48F43F38D722}"
ProjectSection(ProjectDependencies) = postProject
{C27E9A9F-3A17-4482-9C5F-BF15C01E747C} = {C27E9A9F-3A17-4482-9C5F-BF15C01E747C}
{50E20601-4A8D-4AFB-8870-63828D328429} = {50E20601-4A8D-4AFB-8870-63828D328429}
{609ED938-3CA8-4BED-B363-25096D4C4812} = {609ED938-3CA8-4BED-B363-25096D4C4812}
{94954A67-A853-43B1-A727-6EF2774C5A6A} = {94954A67-A853-43B1-A727-6EF2774C5A6A}
{C27E9A9F-3A17-4482-9C5F-BF15C01E747C} = {C27E9A9F-3A17-4482-9C5F-BF15C01E747C}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OfficeFileCrypt", "..\..\OfficeCryptReader\win32\ECMACryptReader.vcproj", "{C27E9A9F-3A17-4482-9C5F-BF15C01E747C}"

View File

@ -73,9 +73,11 @@ SOURCES += \
../src/odf/office_event_listeners.cpp \
../src/odf/office_presentation.cpp \
../src/odf/office_scripts.cpp \
../src/odf/office_forms.cpp \
../src/odf/office_settings.cpp \
../src/odf/office_spreadsheet.cpp \
../src/odf/office_text.cpp \
../src/odf/office_meta.cpp \
../src/odf/paragraph_elements.cpp \
../src/odf/ruby.cpp \
../src/odf/search_table_cell.cpp \
@ -184,6 +186,7 @@ SOURCES += \
../src/odf/datatypes/styleverticalrel.cpp \
../src/odf/datatypes/stylewrap.cpp \
../src/odf/datatypes/stylewrapcontourmode.cpp \
../src/odf/datatypes/stylenumformat.cpp \
../src/odf/datatypes/tablealign.cpp \
../src/odf/datatypes/tablecentering.cpp \
../src/odf/datatypes/tablemode.cpp \
@ -211,6 +214,7 @@ SOURCES += \
../src/odf/datatypes/tablefunction.cpp \
../src/odf/datatypes/tableorder.cpp \
../src/odf/datatypes/dategroup.cpp \
../src/odfcommandtype.cpp \
../src/docx/xlsx_conditionalFormatting.cpp \
../src/docx/xlsx_dxfs.cpp \
../src/docx/docx_content_type.cpp \
@ -335,9 +339,11 @@ HEADERS += \
../src/odf/office_event_listeners.h \
../src/odf/office_presentation.h \
../src/odf/office_scripts.h \
../src/odf/office_forms.h \
../src/odf/office_settings.h \
../src/odf/office_spreadsheet.h \
../src/odf/office_text.h \
../src/odf/office_meta.h \
../src/odf/paragraph_elements.h \
../src/odf/ruby.h \
../src/odf/search_table_cell.h \
@ -372,6 +378,7 @@ HEADERS += \
../src/odf/datatypes/mathvariant.h \
../src/odf/calcext_elements.h \
../src/odf/table_database_ranges.h \
../src/odfcommandtype.h \
../src/odf/datatypes/anchortype.h \
../src/odf/datatypes/backgroundcolor.h \
../src/odf/datatypes/bool.h \
@ -445,6 +452,7 @@ HEADERS += \
../src/odf/datatypes/styleverticalpos.h \
../src/odf/datatypes/styleverticalrel.h \
../src/odf/datatypes/stylewrap.h \
../src/odf/datatypes/stylenumformat.h \
../src/odf/datatypes/stylewrapcontourmode.h \
../src/odf/datatypes/tablealign.h \
../src/odf/datatypes/tablecentering.h \

View File

@ -63,9 +63,11 @@
#include "../src/odf/office_event_listeners.cpp"
#include "../src/odf/office_presentation.cpp"
#include "../src/odf/office_scripts.cpp"
#include "../src/odf/office_forms.cpp"
#include "../src/odf/office_settings.cpp"
#include "../src/odf/office_spreadsheet.cpp"
#include "../src/odf/office_text.cpp"
#include "../src/odf/office_meta.cpp"
#include "../src/odf/paragraph_elements.cpp"
#include "../src/odf/ruby.cpp"
#include "../src/odf/search_table_cell.cpp"

View File

@ -127,3 +127,5 @@
#include "../src/odf/datatypes/tablefunction.cpp"
#include "../src/odf/datatypes/tableorder.cpp"
#include "../src/odf/datatypes/dategroup.cpp"
#include "../src/odf/datatypes/commandtype.cpp"
#include "../src/odf/datatypes/stylenumformat.cpp"

View File

@ -42,6 +42,8 @@
#include "docx_conversion_context.h"
#include "../odf/odfcontext.h"
#include "../odf/text_content.h"
#include "../odf/calcs_styles.h"
#include "../odf/style_paragraph_properties.h"
#include "../odf/style_text_properties.h"
#include "../odf/style_table_properties.h"
@ -100,7 +102,7 @@ void text_tracked_context::start_change (std::wstring id)
}
void text_tracked_context::end_change ()
{
mapChanges_.insert( std::pair<std::wstring, _state>(current_state_.id, current_state_));
mapChanges_.insert( std::make_pair(current_state_.id, current_state_));
current_state_.clear();
}
@ -130,7 +132,54 @@ text_tracked_context::_state & text_tracked_context::get_tracked_change(std::wst
return current_state_; //empty
}
//----------------------------------------------------------------------------------------------------------------
void text_forms_context::start_element (int type)
{
current_state_.clear();
current_state_.type = type;
}
void text_forms_context::set_id (const std::wstring& id)
{
current_state_.id = id;
}
void text_forms_context::set_name (const std::wstring& name)
{
current_state_.name = name;
}
void text_forms_context::set_label (const std::wstring& label)
{
current_state_.label = label;
}
void text_forms_context::set_uuid (const std::wstring& uuid)
{
current_state_.uuid = uuid;
}
void text_forms_context::set_value (const std::wstring &value)
{
current_state_.value = value;
}
void text_forms_context::set_element(odf_reader::form_element *elm)
{
current_state_.element = elm;
}
void text_forms_context::end_element ()
{
mapElements_.insert( std::make_pair(current_state_.id, current_state_));
current_state_.clear();
}
text_forms_context::_state& text_forms_context::get_state_element (std::wstring id)
{
std::map<std::wstring, _state>::iterator it = mapElements_.find(id);
if (it != mapElements_.end())
{
return it->second;
}
else
return current_state_; //empty
}
//----------------------------------------------------------------------------------------------------------------
docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfDocument) :
next_dump_page_properties_ (false),
page_break_ (false),
@ -141,6 +190,7 @@ docx_conversion_context::docx_conversion_context(odf_reader::odf_document * OdfD
in_paragraph_ (false),
in_header_ (false),
in_drawing_content_ (false),
in_table_content_ (false),
text_tracked_context_ (*this),
table_context_ (*this),
output_document_ (NULL),
@ -254,20 +304,21 @@ void docx_conversion_context::finish_paragraph()
void docx_conversion_context::finish_run()
{
if (in_run_)
{
output_stream() << L"</w:r>";
in_run_ = false;
if (get_comments_context().state()==2)
{
output_stream()<< L"<w:commentRangeEnd w:id=\"" << get_comments_context().current_id() << L"\" />";
add_element_to_run();
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().current_id() << L"\" />";
get_comments_context().state(0);
finish_run();
}
}
if (false == in_run_) return;
output_stream() << L"</w:r>";
in_run_ = false;
if (get_comments_context().state()==2)
{
output_stream()<< L"<w:commentRangeEnd w:id=\"" << get_comments_context().current_id() << L"\"/>";
add_element_to_run();
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().current_id() << L"\"/>";
get_comments_context().state(0);
finish_run();
}
}
void docx_conversion_context::start_math_formula()
{
@ -283,6 +334,202 @@ void docx_conversion_context::end_math_formula()
output_stream() << L"<m:oMath>" << math_content << L"</m:oMath>";
}
}
void docx_conversion_context::start_sdt(int type)
{
in_table_content_ = true;
table_content_context_.type_table_content = type;
if (table_content_context_.type_table_content < 4)
{
output_stream() << L"<w:sdt><w:sdtPr>";
if (table_content_context_.type_table_content == 3)
{
output_stream() << L"<w:bibliography/>";
}
else
{
output_stream() << L"<w:docPartObj><w:docPartGallery w:val=\"";
if (table_content_context_.type_table_content == 1) output_stream() << L"Table of Contents";
if (table_content_context_.type_table_content == 2) output_stream() << L"List od Illustrations";
output_stream() << L"\"/><w:docPartUnique/></w:docPartObj>";
}
output_stream() << L"</w:sdtPr><w:sdtContent>";
}
}
void docx_conversion_context::start_index_content()
{
if (!in_table_content_) return;
start_paragraph(false);
std::wstring sInstrText;
switch(table_content_context_.type_table_content)
{
case 1: sInstrText += L" TOC \\h \\o \"1-3\" \\u \\l 1-3 "; break;
case 2:
case 4:
case 6:
case 7: sInstrText += L" TOC \\h \\z "; break;
case 5: sInstrText += L" INDEX \\z "; break;
case 3: sInstrText += L" BIBLIOGRAPHY "; break;
}
if (!table_content_context_.caption_sequence_name.empty())
{
sInstrText += L" \\c \"" + table_content_context_.caption_sequence_name + L"\" ";
}
output_stream() << L"<w:r>";
output_stream() << L"<w:fldChar w:fldCharType=\"begin\"/>";
output_stream() << L"</w:r>";
output_stream() << L"<w:r>";
output_stream() << L"<w:instrText xml:space=\"preserve\">" + sInstrText + L"</w:instrText>";
output_stream() << L"</w:r>";
output_stream() << L"<w:r>";
//output_stream() << L"<w:rPr>
//output_stream() << L"<w:rFonts w:ascii="Minion Pro" w:eastAsia="DejaVuSans" w:hAnsi="Minion Pro"/>
//output_stream() << L"<w:bCs w:val="0"/>
//output_stream() << L"<w:sz w:val="21"/>
//output_stream() << L"<w:szCs w:val="24"/>
//output_stream() << L"</w:rPr>
output_stream() << L"<w:fldChar w:fldCharType=\"separate\"/>";
output_stream() << L"</w:r>";
finish_paragraph();
}
void docx_conversion_context::end_index_content()
{
if (!in_table_content_) return;
start_paragraph(false);
output_stream() << L"<w:r>";
//output_stream() << L"<w:rPr>";
//output_stream() << L"<w:rFonts w:ascii="Minion Pro" w:hAnsi="Minion Pro"/>";
//output_stream() << L"<w:sz w:val="20"/>
//output_stream() << L"</w:rPr>";
output_stream() << L"<w:fldChar w:fldCharType=\"end\"/>";
output_stream() << L"</w:r>";
finish_paragraph();
}
void docx_conversion_context::end_sdt()
{
if (!in_table_content_) return;
if (table_content_context_.type_table_content < 4)
{
output_stream() << L"</w:sdtContent></w:sdt>";
}
in_table_content_ = false;
table_content_context_.clear_all();
}
void docx_conversion_context::start_index_element()
{
table_content_context_.clear_current_level_index();
}
void docx_conversion_context::end_index_element()
{
table_content_context_.clear_current_level_index();
}
void docx_conversion_context::start_bookmark (const std::wstring &name)
{
std::map<std::wstring, int>::iterator pFind = mapBookmarks.find(name);
int id = -1;
if (pFind == mapBookmarks.end())
{
id = mapBookmarks.size() + 1;
mapBookmarks.insert(std::make_pair(name, id));
}
else
{
id = pFind->second;
}
finish_run();
output_stream() << L"<w:bookmarkStart w:id=\"" << std::to_wstring(id) << L"\" w:name=\"" << name << L"\"/>";
}
void docx_conversion_context::end_bookmark (const std::wstring &name)
{
std::map<std::wstring, int>::iterator pFind = mapBookmarks.find(name);
int id = -1;
if (pFind == mapBookmarks.end())
{
return; //???
}
else
{
id = pFind->second;
}
finish_run();
output_stream() << L"<w:bookmarkEnd w:id=\"" << std::to_wstring(id) << L"\"/>";
}
void docx_conversion_context::start_alphabetical_index (const std::wstring &id)
{
std::map<std::wstring, std::vector<odf_reader::office_element_ptr>>::iterator pFind = mapAlphabeticals.find(id);
if (pFind != mapAlphabeticals.end()) return;
std::vector<odf_reader::office_element_ptr> texts;
mapAlphabeticals.insert(std::make_pair(id, texts));
current_alphabetic_index_ = id;
}
void docx_conversion_context::add_alphabetical_index_text (odf_reader::office_element_ptr & elem)
{
std::map<std::wstring, std::vector<odf_reader::office_element_ptr>>::iterator pFind = mapAlphabeticals.find(current_alphabetic_index_);
if (pFind == mapAlphabeticals.end())
{
return;
}
pFind->second.push_back(elem);
}
void docx_conversion_context::end_alphabetical_index (const std::wstring &id)
{
std::map<std::wstring, std::vector<odf_reader::office_element_ptr>>::iterator pFind = mapAlphabeticals.find(id);
if (pFind == mapAlphabeticals.end())
{
return;
}
finish_run();
output_stream() << L"<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>";
output_stream() << L"<w:r><w:instrText>XE \"";
odf_reader::ElementType type;
for (size_t i = 0; i < pFind->second.size(); i++)
{
type = pFind->second[i]->get_type();
pFind->second[i]->text_to_stream(output_stream());
}
output_stream() << L"\"</w:instrText></w:r>";
output_stream() << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
for (size_t i = 0; i < pFind->second.size(); i++)
{
pFind->second[i]->docx_convert(*this);
}
mapAlphabeticals.erase(pFind);
if (mapAlphabeticals.empty())
current_alphabetic_index_.clear();
else
current_alphabetic_index_ = mapAlphabeticals.begin()->first; // todooo vector+map+level
}
void docx_conversion_context::start_chart(std::wstring name)
{
@ -369,7 +616,11 @@ void docx_conversion_context::start_document()
output_stream() << L"xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" ";
output_stream() << L"xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" ";
output_stream() << L"xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" ";
output_stream() << L"mc:Ignorable=\"w14 wp14\">";
output_stream() << L"xmlns:cx=\"http://schemas.microsoft.com/office/drawing/2014/chartex\" ";
output_stream() << L"xmlns:cx1=\"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex\" ";
output_stream() << L"xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" ";
output_stream() << L"xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\" ";
output_stream() << L"mc:Ignorable=\"w14 w15 w16se wne wp14\">";
//apply page-default prop
@ -437,21 +688,25 @@ std::wstring docx_conversion_context::dump_settings_document()
_CP_OPT(std::wstring) strVal;
_CP_OPT(int) intVal;
if (odf_reader::GetProperty(settings_properties_,L"evenAndOddHeaders",boolVal))
if (odf_reader::GetProperty(settings_properties_,L"evenAndOddHeaders", boolVal))
{
CP_XML_NODE(L"w:evenAndOddHeaders");
}
if (odf_reader::GetProperty(settings_properties_,L"displayBackgroundShape",boolVal))
if (odf_reader::GetProperty(settings_properties_,L"displayBackgroundShape", boolVal))
{
CP_XML_NODE(L"w:displayBackgroundShape");
}
if (odf_reader::GetProperty(settings_properties_,L"zoom",intVal))
if (odf_reader::GetProperty(settings_properties_,L"zoom", intVal))
{
CP_XML_NODE(L"w:zoom")
{
CP_XML_ATTR(L"w:percent",intVal.get());
}
}
if (odf_reader::GetProperty(settings_properties_,L"mirrorMargins", boolVal))
{
CP_XML_NODE(L"w:mirrorMargins");
}
}
}
return output.str();
@ -831,7 +1086,7 @@ bool docx_conversion_context::process_page_properties(std::wostream & strm)
if (page_layout_instance_)
{
page_layout_instance_->docx_serialize(strm, *this);
page_layout_instance_->docx_serialize(strm, *this);
}
else
{
@ -856,13 +1111,13 @@ bool docx_conversion_context::process_page_properties(std::wostream & strm)
void docx_conversion_context::end_process_style_content(bool in_styles)
{
docx_serialize_paragraph_style(output_stream(), automatic_parent_style_, in_styles);
serialize_paragraph_style(output_stream(), automatic_parent_style_, in_styles);
if (automatic_parent_style_.empty())
styles_context_.docx_serialize_text_style( output_stream(), L"", text_tracked_context_.dumpRPr_);
}
void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & strm, const std::wstring & ParentId, bool in_styles)
void docx_conversion_context::serialize_paragraph_style(std::wostream & strm, const std::wstring & ParentId, bool in_styles)
//in_styles = true -> styles.xml
//почему то конструкция <pPr><rPr/></pPr><rPr/> "не работает" в части в rPr в ms2010 )
{
@ -907,7 +1162,7 @@ void docx_conversion_context::docx_serialize_paragraph_style(std::wostream & str
}
}
CP_XML_STREAM() << paragraph_style.str();
docx_serialize_list_properties(CP_XML_STREAM());
serialize_list_properties(CP_XML_STREAM());
if ((run_style.tellp() > 0 && in_styles == false) || !get_text_tracked_context().dumpRPrInsDel_.empty())
@ -940,7 +1195,8 @@ void docx_conversion_context::start_automatic_style(const std::wstring & ParentI
void docx_conversion_context::end_automatic_style()
{
in_automatic_style_ = false;
automatic_parent_style_ = L"";
automatic_parent_style_.clear();
tabs_context_.clear();
}
bool docx_conversion_context::in_automatic_style()
@ -1113,8 +1369,215 @@ std::wstring docx_conversion_context::find_list_rename(const std::wstring & List
void docx_conversion_context::end_list_item()
{
}
int docx_conversion_context::process_text_attr(odf_reader::text::paragraph_attrs *Attr)
{
if ( Attr->text_style_name_.empty() ) return 0;
void docx_conversion_context::docx_serialize_list_properties(std::wostream & strm)
odf_reader::style_instance * styleInst =
root()->odf_context().styleContainer().style_by_name(Attr->text_style_name_, odf_types::style_family::Paragraph, process_headers_footers_);
if (!styleInst) return 0;
if (false == styleInst->is_automatic()) return 0;
odf_reader::style_content *styleContent = styleInst->content();
if (!styleContent) return 0;
push_text_properties(styleContent->get_style_text_properties());
return 1;
}
int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_attrs *Attr)
{
if (!Attr) return 0;
bool in_drawing = false;
if (get_drawing_context().get_current_shape() || get_drawing_context().get_current_frame())
{
in_drawing = true;
}
if (false == Attr->text_style_name_.empty())
{
if (in_table_content_ && Attr->text_style_name_.empty())
{
table_content_context_.set_current_level(Attr->text_style_name_);
}
if (odf_reader::style_instance * styleInst =
root()->odf_context().styleContainer().style_by_name(Attr->text_style_name_, odf_types::style_family::Paragraph, process_headers_footers_)
)
{
process_page_break_after(styleInst);
if (styleInst->is_automatic())
{
if (odf_reader::style_content * styleContent = styleInst->content())
{
std::wstring id;
//office_element_ptr parent_tab_stops_;
if (const odf_reader::style_instance * parentStyleContent = styleInst->parent())
{
std::wstring parent_name = parentStyleContent->name();
id = styles_map_.get( parent_name, parentStyleContent->type() );
if (in_table_content_ && table_content_context_.empty_current_table_content_level_index())
{
table_content_context_.set_current_level(parent_name);
}
}
start_automatic_style(id);
odf_reader::calc_tab_stops(styleInst, get_tabs_context());
//вытаскивает rtl c цепочки стилей !! - просто прописать в наследуемом НЕЛЬЗЯ !!
odf_reader::paragraph_format_properties properties = odf_reader::calc_paragraph_properties_content(styleInst);
if (properties.style_writing_mode_)
{
odf_types::writing_mode::type type = properties.style_writing_mode_->get_type();
switch(type)
{
case odf_types::writing_mode::RlTb:
case odf_types::writing_mode::TbRl:
case odf_types::writing_mode::Rl:
set_rtl(true);
break;
default:
set_rtl(false);
}
}
set_margin_left(properties.fo_margin_left_? 20.0 * properties.fo_margin_left_->get_length().get_value_unit(odf_types::length::pt) : 0);
styleContent->docx_convert(*this);
end_automatic_style();
push_text_properties(styleContent->get_style_text_properties());
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
output_stream() << L"<w:pPr>";
if (is_paragraph_header() )
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
}
else
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << L"</w:pPr>";
}
}
return 1;
}
}
else
{
const std::wstring id = styles_map_.get( styleInst->name(), styleInst->type() );
output_stream() << L"<w:pPr>";
//todooo причесать
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
if (is_paragraph_header() )
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
output_stream() << L"</w:pPr>";
finish_paragraph();
start_paragraph();
output_stream() << L"<w:pPr>";
}
else
{
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
}
}
output_stream() << L"<w:pStyle w:val=\"" << id << L"\" />";
if (!get_text_tracked_context().dumpPPr_.empty())
{
output_stream() << get_text_tracked_context().dumpPPr_;
get_text_tracked_context().dumpPPr_.clear();
}
serialize_list_properties(output_stream());
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
{
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\" />";
}
if (!get_text_tracked_context().dumpRPrInsDel_.empty())
{
output_stream() << L"<w:rPr>";
output_stream() << get_text_tracked_context().dumpRPrInsDel_;
get_text_tracked_context().dumpRPrInsDel_.clear();
output_stream() << L"</w:rPr>";
}
output_stream() << L"</w:pPr>";
return 2;
}
}
}
if (!get_section_context().dump_.empty()
&& !get_table_context().in_table()
&& (get_process_note() == oox::docx_conversion_context::noNote)
&& !in_drawing)
{
output_stream() << L"<w:pPr>";
output_stream() << get_section_context().dump_;
get_section_context().dump_.clear();
//todooo выяснить реальны ли заголовки без стилей и свойств
output_stream() << L"</w:pPr>";
return 3;
}
return 0;
}
void docx_conversion_context::process_page_break_after(const odf_reader::style_instance * styleInst)
{
if (styleInst)
{
const odf_reader::style_instance * inst = styleInst;
while (inst)
{
if (inst->content() && inst->content()->get_style_paragraph_properties())
{
_CP_OPT(odf_types::fo_break) fo_break_val = inst->content()->get_style_paragraph_properties()->content_.fo_break_after_;
if (fo_break_val)
{
if (fo_break_val->get_type() == odf_types::fo_break::Page)
{
set_page_break_after(true);
break;
}
else if (fo_break_val->get_type() == odf_types::fo_break::Auto)
{
break;
}
}
}
inst = inst->parent();
}
}
}
void docx_conversion_context::serialize_list_properties(std::wostream & strm)
{
if (!list_style_stack_.empty())
{
@ -1300,7 +1763,7 @@ void docx_conversion_context::add_note_reference ()
typedef std::map<std::wstring, text_tracked_context::_state>::iterator map_changes_iterator;
void docx_conversion_context::start_text_changes (std::wstring id)
void docx_conversion_context::start_text_changes (const std::wstring &id)
{
text_tracked_context::_state &state_add = text_tracked_context_.get_tracked_change(id);
if (state_add.id != id) return;
@ -1467,7 +1930,7 @@ void docx_conversion_context::end_changes()
text_tracked_context_.dumpPPr_.clear();
text_tracked_context_.dumpRPr_.clear();
}
void docx_conversion_context::end_text_changes (std::wstring id)
void docx_conversion_context::end_text_changes (const std::wstring &id)
{
if (map_current_changes_.empty()) return;
@ -1492,6 +1955,7 @@ void docx_conversion_context::add_user_field(const std::wstring & name, const st
{
map_user_fields.insert(std::make_pair(name, value));
}
std::wstring docx_conversion_context::get_user_field(const std::wstring & name)
{
std::map<std::wstring, std::wstring>::iterator pFind = map_user_fields.find(name);

View File

@ -62,12 +62,15 @@ namespace cpdoccore {
class style_text_properties;
class draw_frame;
class draw_shape;
class draw_control;
class office_element;
class style_columns;
class form_element;
namespace text
{
class note_citation;
class paragraph_attrs;
}
}
@ -162,7 +165,16 @@ public:
current_object_name_ = L"";
current_shape_ = drawShape;
}
void start_group()
void start_control(odf_reader::draw_control * drawControl)
{
current_level_++;
objects_count_++;
current_shape_id_ = objects_count_;
current_object_name_ = L"";
current_control_ = drawControl;
}
void start_group()
{
current_level_++;
objects_count_++;
@ -210,6 +222,7 @@ public:
{
current_level_--;
frames_.pop_back();
caption_.clear();
}
std::wstring & get_text_stream_frame()
@ -226,7 +239,6 @@ public:
else
throw;
}
std::wstring & get_text_stream_shape()
{
return shape_text_content_;
@ -237,15 +249,24 @@ public:
}
void clear_stream_frame()
{
if (frames_.size()>0)
frames_.back().text_content=L"";
if (!frames_.empty())
frames_.back().text_content.clear();
}
void stop_shape()
{
current_level_--;
current_shape_ = NULL;
shape_text_content_=L"";
current_shape_id_ =0;
shape_text_content_.clear();
current_shape_id_ = 0;
caption_.clear();
}
void stop_control()
{
current_level_--;
current_control_ = NULL;
shape_text_content_.clear();
current_shape_id_ = 0;
caption_.clear();
}
void stop_group()
{
@ -255,10 +276,10 @@ public:
int get_current_frame_id() const
{
if (frames_.size()>0) return frames_.back().id;
if (!frames_.empty()) return frames_.back().id;
else return 0;
}
bool in_group() { return groups_.size() > 0; }
bool in_group() { return !groups_.empty(); }
int get_current_level() const { return current_level_; }
int get_current_shape_id() const { return current_shape_id_; }
@ -266,10 +287,15 @@ public:
odf_reader::draw_frame * get_current_frame() const
{
if (frames_.size()>0) return frames_.back().ptr;
if (!frames_.empty()) return frames_.back().ptr;
else return NULL;
}
odf_reader::draw_shape * get_current_shape() const { return current_shape_; }
void set_next_object_caption(const std::wstring & value)
{
caption_ = value;
}
private:
std::wstring shape_text_content_;
@ -282,10 +308,13 @@ private:
std::vector<_group> groups_;
std::vector<_frame> frames_;
odf_reader::draw_shape * current_shape_;
odf_reader::draw_shape *current_shape_;
size_t current_shape_id_;
odf_reader::draw_control*current_control_;
std::wstring zero_string_;
std::wstring caption_;
};
@ -542,6 +571,163 @@ private:
std::map<std::wstring, _state> mapChanges_;
};
class text_forms_context
{
public:
struct _state
{
std::wstring id;
std::wstring name;
int type = 0; //enum?
std::wstring label;
std::wstring uuid;
std::wstring value;
odf_reader::form_element* element = NULL;
void clear()
{
type = 0;
id.clear();
name.clear();
label.clear();
value.clear();
uuid.clear();
element = NULL;
}
};
text_forms_context(){}
void start_element (int type);
void set_id (const std::wstring& id);
void set_name (const std::wstring& name);
void set_label (const std::wstring& label);
void set_uuid (const std::wstring& uuid);
void set_value (const std::wstring& value);
void set_element(odf_reader::form_element *elm);
void end_element ();
_state& get_state_element (std::wstring id);
private:
_state current_state_;
std::map<std::wstring, _state> mapElements_;
};
class table_content_context
{
public:
enum template_type
{
TableContent = 1,
Illustrations = 2,
Bibliography = 3,
Tables = 4
};
enum level_type
{
Span = 1,
Text = 2,
LinkStart = 3,
LinkEnd = 4,
TabStop = 5,
PageNumber = 6,
Chapter = 7
};
struct _state
{
std::wstring name;
std::vector<int> levels;
void clear()
{
name.clear();
levels.clear();
}
};
void start_template(int type)
{
current_template.clear();
type_table_content = type;
}
void end_template()
{
}
void add_level_content(int type)
{
current_state.levels.push_back(type);
}
void start_level(const std::wstring& style_name)
{
current_state.name = style_name;
}
void end_level()
{
current_template.insert(std::make_pair(current_state.name, current_state));
current_state.clear();
}
//std::vector<int> find(const std::wstring &name)
//{
// std::map<std::wstring, _state>::iterator pFind = current_template.find(name);
// if (pFind == current_template.end())
// {
// std::vector<int> empty;
// return empty;
// }
// return pFind->second.levels;
//}
void set_current_level(const std::wstring &name)
{
std::map<std::wstring, _state>::iterator pFind = current_template.find(name);
if (pFind == current_template.end())
{
current_level_.clear();
}
current_level_ = pFind->second.levels;
current_level_index_ = 0;
}
void next_level_index()
{
current_level_index_++;
}
int get_type_current_level_index()
{
if (current_level_index_ < (int)current_level_.size() && current_level_index_ >= 0)
return current_level_[current_level_index_];
return 0;
}
void clear_current_level_index()
{
current_level_index_ = 0;
current_level_.clear();
}
bool empty_current_table_content_level_index()
{
return current_level_.empty();
}
void clear_all()
{
type_table_content = 0;
current_level_index_ = 0;
current_level_.clear();
current_template.clear();
current_state.clear();
caption_sequence_name.clear();
}
std::wstring caption_sequence_name;
int type_table_content;
private:
std::vector<int> current_level_;
int current_level_index_;
std::map<std::wstring, _state> current_template;
_state current_state;
};
//---------------------------------------------------------------------------------------------------------
class docx_conversion_context : boost::noncopyable
{
@ -565,7 +751,7 @@ public:
void add_user_field (const std::wstring & name, const std::wstring & value);
std::wstring get_user_field (const std::wstring & name);
void add_element_to_run (std::wstring parenStyleId = _T(""));
void add_element_to_run (std::wstring parenStyleId = _T(""));
void finish_run ();
void add_new_run (std::wstring parentStyleId = _T(""));
bool get_run_state () { return in_run_; }
@ -574,11 +760,14 @@ public:
void start_paragraph (bool is_header = false);
void finish_paragraph ();
bool is_alphabetical_index () { return false == mapAlphabeticals.empty();}
bool is_table_content () { return in_table_content_; }
bool is_paragraph_header () { return in_header_; }
bool get_paragraph_state () { return in_paragraph_; }
void set_paragraph_state (bool val) { in_paragraph_ = val; }
bool get_paragraph_keep () { return is_paragraph_keep_;}
void set_paragraph_keep (bool val) { is_paragraph_keep_ = val; }
bool get_delete_text_state () { return is_delete_text_; }
void set_delete_text_state (bool Val) { is_delete_text_ = Val; }
@ -611,7 +800,16 @@ public:
void start_office_text ();
void end_office_text ();
void process_styles ();
void start_sdt (int type);
void end_sdt ();
void start_index_content();
void end_index_content();
void start_index_element();
void end_index_element();
void process_styles ();
void process_fonts ();
void process_list_styles ();
@ -619,6 +817,10 @@ public:
void process_comments ();
bool process_page_properties(std::wostream & strm);
void process_section (std::wostream & strm, odf_reader::style_columns * columns = NULL);
int process_paragraph_attr (odf_reader::text::paragraph_attrs *attr);
int process_text_attr (odf_reader::text::paragraph_attrs *Attr);
void process_page_break_after(const odf_reader::style_instance *styleInst);
std::vector<odf_reader::_property> & get_settings_properties ();
void set_settings_property (const odf_reader::_property & prop);
@ -665,8 +867,8 @@ public:
void start_list_item (bool restart = false);
void end_list_item ();
void docx_serialize_list_properties(std::wostream & strm);
void docx_serialize_paragraph_style(std::wostream & strm, const std::wstring & ParentId, bool in_styles = false);
void serialize_list_properties(std::wostream & strm);
void serialize_paragraph_style(std::wostream & strm, const std::wstring & ParentId, bool in_styles = false);
std::wstring find_list_rename(const std::wstring & ListStyleName) const;
@ -680,6 +882,10 @@ public:
section_context & get_section_context() { return section_context_; }
notes_context & get_notes_context() { return notes_context_; }
text_tracked_context& get_text_tracked_context(){ return text_tracked_context_; }
text_forms_context & get_forms_context() { return text_forms_context_; }
tabs_context & get_tabs_context() { return tabs_context_;}
table_content_context & get_table_content_context() { return table_content_context_;}
void docx_convert_delayed ();
void add_delayed_element (odf_reader::office_element * Elm);
@ -710,9 +916,16 @@ public:
void start_math_formula ();
void end_math_formula ();
void start_text_changes (std::wstring id);
void end_text_changes (std::wstring id);
void start_text_changes (const std::wstring &id);
void end_text_changes (const std::wstring &id);
void start_bookmark (const std::wstring &name);
void end_bookmark (const std::wstring &name);
void start_alphabetical_index (const std::wstring &id);
void end_alphabetical_index (const std::wstring &id);
void add_alphabetical_index_text (odf_reader::office_element_ptr & elem);
void set_process_headers_footers(bool Val) { process_headers_footers_ = Val; }
headers_footers & get_headers_footers() { return headers_footers_; }
header_footer_context & get_header_footer_context() { return header_footer_context_; }
@ -738,6 +951,7 @@ private:
std::wstringstream footer_xml_;
std::wstringstream header_xml_;
std::wstringstream settings_xml_;
std::wstringstream meta_xml_;
styles_context styles_context_;
math_context math_context_;
@ -749,6 +963,9 @@ private:
header_footer_context header_footer_context_;
notes_context notes_context_;
text_tracked_context text_tracked_context_;
text_forms_context text_forms_context_;
tabs_context tabs_context_;
table_content_context table_content_context_;
boost::shared_ptr<streams_man> streams_man_;
@ -775,6 +992,7 @@ private:
bool in_automatic_style_;
bool in_drawing_content_;
bool in_table_content_;
bool in_paragraph_;
bool in_run_;
bool in_header_;
@ -782,17 +1000,21 @@ private:
bool is_rtl_; // right-to-left
bool is_paragraph_keep_;
std::wstring current_alphabetic_index_;
int current_margin_left_;
int new_list_style_number_; // счетчик для нумерации имен созданных в процессе конвертации стилей
NoteType process_note_;
std::vector<odf_reader::office_element*> delayed_elements_;
std::vector<odf_reader::office_element*> delayed_elements_;
std::vector< 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_;// цепочки переименований нумераций
std::vector< 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_;// цепочки переименований нумераций
std::map<std::wstring, std::wstring> map_user_fields;
std::map<std::wstring, std::wstring> map_user_fields;
std::map<std::wstring, int> mapBookmarks;
std::map<std::wstring, std::vector<odf_reader::office_element_ptr>> mapAlphabeticals;
};
}

View File

@ -209,8 +209,8 @@ void docx_serialize_image_child(std::wostream & strm, _docx_drawing & val)
CP_XML_NODE(L"pic:cNvPr")
{
//CP_XML_ATTR(L"desc text",L"");
CP_XML_ATTR(L"id",val.id);
CP_XML_ATTR(L"name",val.name);
CP_XML_ATTR(L"id", val.id + 1);
CP_XML_ATTR(L"name", val.name);
}
CP_XML_NODE(L"pic:cNvPicPr")
{
@ -316,7 +316,7 @@ 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);
CP_XML_ATTR(L"id", 0xf000 + val.id + 1);
oox_serialize_action(CP_XML_STREAM(), val.action);
}
@ -398,8 +398,8 @@ void docx_serialize_wps(std::wostream & strm, _docx_drawing & val)
CP_XML_ATTR(L"cy", val.cy);
}
serialize_null_extent(CP_XML_STREAM());
}
serialize_null_extent(CP_XML_STREAM());
}
else//anchor
{
@ -607,6 +607,42 @@ void docx_serialize_object(std::wostream & strm, _docx_drawing & val)
}
}
void docx_serialize_control(std::wostream & strm, _docx_drawing & val)
{
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"w:pict")
{
CP_XML_NODE(L"v:shape")
{
CP_XML_ATTR(L"id", L"control_" + val.objectId);
std::wstring style_str; // = L"width:730.6pt; height:261.8pt";
style_str += L"width:" + boost::lexical_cast<std::wstring>(val.cx / 12700.) + L"pt;";
style_str += L"height:" + boost::lexical_cast<std::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"w:control")
{
CP_XML_ATTR(L"w:name", val.name);
CP_XML_ATTR(L"w:shapeid", L"control_" + val.objectId);
CP_XML_ATTR(L"r:id", val.objectId);
}
}
}
}
void _docx_drawing::serialize(std::wostream & strm/*, bool insideOtherDrawing*/)
{
if (type == typeUnknown) return;
@ -619,6 +655,10 @@ void _docx_drawing::serialize(std::wostream & strm/*, bool insideOtherDrawing*/)
{
docx_serialize_object(strm, *this);
}
else if (type == typeControl)
{
docx_serialize_control(strm, *this);
}
else
{
//if (insideOtherDrawing)

View File

@ -39,10 +39,9 @@
namespace cpdoccore {
namespace oox {
/**/
docx_table_state::docx_table_state(docx_conversion_context & Context,
const std::wstring & StyleName) : context_(Context),
docx_table_state::docx_table_state(docx_conversion_context & Context, const std::wstring & StyleName) :
context_(Context),
table_style_(StyleName),
current_table_column_(-1),
columns_spanned_num_(0),
@ -93,6 +92,19 @@ std::wstring docx_table_state::current_row_style() const
return L"";
}
double docx_table_state::get_current_cell_width()
{
if (current_table_column_ < columns_width_.size())
return columns_width_[current_table_column_];
else
return 0;
}
void docx_table_state::add_column_width(double width)
{
columns_width_.push_back(width);
}
void docx_table_state::start_cell()
{
current_table_column_++;
@ -102,7 +114,6 @@ void docx_table_state::start_cell()
void docx_table_state::end_cell()
{}
bool docx_table_state::start_covered_cell(docx_conversion_context & Context)
{
std::wostream & _Wostream = context_.output_stream();

View File

@ -70,6 +70,8 @@ public:
void set_rows_spanned(unsigned int Column, unsigned int Val, unsigned int ColumnsSpanned, const std::wstring & Style);
unsigned int current_rows_spanned(unsigned int Column) const;
double get_current_cell_width();
void add_column_width(double width);
private:
docx_conversion_context & context_;
std::wstring table_style_;
@ -81,7 +83,8 @@ private:
std::vector<table_row_spanned> rows_spanned_;
bool close_table_covered_cell_;
std::vector<unsigned int> columns_;
std::vector<std::wstring> columnsDefaultCellStyleName_;
std::vector<double> columns_width_;
std::vector<std::wstring> columnsDefaultCellStyleName_;
};
@ -135,6 +138,14 @@ public:
{
return table_states_.back().start_cell();
}
double get_current_cell_width()
{
return table_states_.back().get_current_cell_width();
}
void add_column_width(double width)
{
table_states_.back().add_column_width(width);
}
void end_cell()
{

View File

@ -39,9 +39,58 @@
#include "../odf/odfcontext.h"
#include "../odf/style_text_properties.h"
#include "../odf/style_paragraph_properties.h"
namespace cpdoccore {
void tabs_context::reset()
{
for (size_t i = 0; i < tabs.size(); i++)
{
odf_reader::style_tab_stop *tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(tabs[i].get());
if (tab_stop)
{
clear_tabs.insert(std::make_pair(tab_stop->style_position_.get_value(), tabs[i]));
}
}
tabs.clear();
}
void tabs_context::add(const odf_reader::office_element_ptr & element)
{
odf_reader::style_tab_stop *tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(element.get());
if (tab_stop)
{
std::map<double, odf_reader::office_element_ptr>::iterator pFind = clear_tabs.find(tab_stop->style_position_.get_value());
if (pFind != clear_tabs.end())
{
clear_tabs.erase(pFind);
}
tabs.push_back(element);
}
}
void tabs_context::docx_convert(oox::docx_conversion_context & Context)
{
if (clear_tabs.empty() && tabs.empty()) return;
std::wstringstream & _pPr = Context.get_styles_context().paragraph_nodes();
_pPr << L"<w:tabs>";
for (std::map<double, odf_reader::office_element_ptr>::iterator it = clear_tabs.begin(); it != clear_tabs.end(); ++it)
{
odf_reader::style_tab_stop * tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(it->second.get());
tab_stop->docx_convert(Context, true);
}
for (size_t i = 0; i < tabs.size(); i++)
{
odf_reader::style_tab_stop * tab_stop = dynamic_cast<odf_reader::style_tab_stop*>(tabs[i].get());
tab_stop->docx_convert(Context, false);
}
_pPr << L"</w:tabs>";
}
void styles_context::start_process_style(const odf_reader::style_instance * Instance)
{
current_processed_style_ = Instance;

View File

@ -33,6 +33,8 @@
#include <sstream>
#include <iosfwd>
#include <map>
#include <vector>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
@ -40,14 +42,41 @@
namespace cpdoccore {
namespace oox{
class docx_conversion_context;
class pptx_conversion_context;
};
namespace odf_reader
{
class style_instance;
class style_text_properties;
class fonts_container;
typedef boost::shared_ptr<style_text_properties> style_text_properties_ptr;
class office_element;
typedef boost::shared_ptr<office_element> office_element_ptr;
};
class tabs_context : boost::noncopyable
{
public:
std::vector<odf_reader::office_element_ptr> tabs;
std::map<double, odf_reader::office_element_ptr> clear_tabs;
void clear()
{
tabs.clear();
clear_tabs.clear();
}
void reset();
void add(const odf_reader::office_element_ptr & element);
void docx_convert(oox::docx_conversion_context & Context);
};
class styles_context : boost::noncopyable
{
public:

View File

@ -55,7 +55,8 @@ enum RelsType
typeOleObject,
typeSlide,
typeVideo,
typeAudio
typeAudio,
typeControl
};
struct _rel

View File

@ -54,7 +54,7 @@ void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val)
odf_reader::GetProperty ( val.additional ,L"text-content", strTextContent);
if (!strTextContent)return;
if (strTextContent.get().length()<1)return;
if (strTextContent->empty())return;
CP_XML_WRITER(strm)
{
@ -65,7 +65,7 @@ void xlsx_serialize_text(std::wostream & strm, _xlsx_drawing & val)
CP_XML_NODE(L"a:lstStyle");
if (strTextContent)
{
CP_XML_STREAM() << strTextContent.get();
CP_XML_STREAM() << *strTextContent;
}
}
}

View File

@ -38,6 +38,7 @@
#include "office_spreadsheet.h"
#include "office_presentation.h"
#include "office_scripts.h"
#include "office_forms.h"
#include "office_settings.h"
#include "paragraph_elements.h"
#include "office_binary_data.h"

View File

@ -31,8 +31,6 @@
*/
#include "calcs_styles.h"
#include <boost/foreach.hpp>
#include <vector>
#include <algorithm>
namespace cpdoccore {
@ -44,10 +42,10 @@ namespace odf_reader {
text_format_properties_content calc_text_properties_content(const std::vector<const style_text_properties*> & textProps)
{
text_format_properties_content result;
BOOST_FOREACH(const style_text_properties* v, textProps)
for (size_t i = 0; i < textProps.size(); i++)
{
if (v)
result.apply_from(v->content());
if (textProps[i])
result.apply_from(textProps[i]->content());
}
return result;
}
@ -60,20 +58,21 @@ text_format_properties_content calc_text_properties_content(const style_instance
{
if (const style_content * content = styleInstance->content())
if (const style_text_properties * textProp = content->get_style_text_properties())
textProps.push_back(textProp);
{
textProps.insert(textProps.begin(), textProp);
}
styleInstance = styleInstance->parent();
}
reverse(textProps.begin(), textProps.end());
return calc_text_properties_content(textProps);
}
text_format_properties_content calc_text_properties_content(const std::vector<const style_instance *> & styleInstances)
{
text_format_properties_content result;
BOOST_FOREACH(const style_instance * inst, styleInstances)
for (size_t i = 0; i < styleInstances.size(); i++)
{
result.apply_from(calc_text_properties_content(inst));
result.apply_from(calc_text_properties_content(styleInstances[i]));
}
return result;
}
@ -82,10 +81,10 @@ text_format_properties_content calc_text_properties_content(const std::vector<co
graphic_format_properties calc_graphic_properties_content(const std::vector<const graphic_format_properties*> & graphicProps)
{
graphic_format_properties result;
BOOST_FOREACH(const graphic_format_properties* v, graphicProps)
for (size_t i = 0; i < graphicProps.size(); i++)
{
if (v)
result.apply_from(v);
if (graphicProps[i])
result.apply_from(graphicProps[i]);
}
return result;
}
@ -97,20 +96,22 @@ graphic_format_properties calc_graphic_properties_content(const style_instance *
{
if (const style_content * content = styleInstance->content())
if (const graphic_format_properties * graphicProp = content->get_graphic_properties())
graphicProps.push_back(graphicProp);
{
graphicProps.insert(graphicProps.begin(), graphicProp);
}
styleInstance = styleInstance->parent();
}
reverse(graphicProps.begin(), graphicProps.end());
return calc_graphic_properties_content(graphicProps);
}
graphic_format_properties calc_graphic_properties_content(const std::vector<const style_instance *> & styleInstances)
{
graphic_format_properties result;
BOOST_FOREACH(const style_instance * inst, styleInstances)
{
graphic_format_properties f = calc_graphic_properties_content(inst);
for (size_t i = 0; i < styleInstances.size(); i++)
{
graphic_format_properties f = calc_graphic_properties_content(styleInstances[i]);
result.apply_from(&f);
}
return result;
@ -121,10 +122,11 @@ graphic_format_properties calc_graphic_properties_content(const std::vector<cons
paragraph_format_properties calc_paragraph_properties_content(const std::vector<const style_paragraph_properties*> & parProps)
{
paragraph_format_properties result;
BOOST_FOREACH(const style_paragraph_properties* v, parProps)
for (size_t i = 0; i < parProps.size(); i++)
{
if (v)
result.apply_from(v->content());
if (parProps[i])
result.apply_from(parProps[i]->content_);
}
return result;
}
@ -136,32 +138,60 @@ paragraph_format_properties calc_paragraph_properties_content(const style_instan
{
if (const style_content * content = styleInstance->content())
if (const style_paragraph_properties * parProp = content->get_style_paragraph_properties())
parProps.push_back(parProp);
{
parProps.insert(parProps.begin(), parProp);
}
styleInstance = styleInstance->parent();
}
reverse(parProps.begin(), parProps.end());
return calc_paragraph_properties_content(parProps);
}
paragraph_format_properties calc_paragraph_properties_content(const std::vector<const style_instance *> & styleInstances)
{
paragraph_format_properties result;
BOOST_FOREACH(const style_instance * inst, styleInstances)
for (size_t i = 0; i < styleInstances.size(); i++)
{
result.apply_from(calc_paragraph_properties_content(inst));
result.apply_from(calc_paragraph_properties_content(styleInstances[i]));
}
return result;
}
void calc_tab_stops(const style_instance * styleInstance, tabs_context & context)
{
std::vector<const style_paragraph_properties*> parProps;
while (styleInstance)
{
if (const style_content * content = styleInstance->content())
if (const style_paragraph_properties * parProp = content->get_style_paragraph_properties())
{
parProps.insert(parProps.begin(), parProp);
}
styleInstance = styleInstance->parent();
}
for (size_t i = 0; i < parProps.size(); i++)
{
if (parProps[i]->content_.style_tab_stops_)
{
style_tab_stops *tab_stops = dynamic_cast<style_tab_stops*>(parProps[i]->content_.style_tab_stops_.get());
context.reset();
for (size_t j = 0; j < tab_stops->content_.size(); j++)
{
context.add(tab_stops->content_[j]);
}
}
}
}
//////
style_table_cell_properties_attlist calc_table_cell_properties(const std::vector<const style_table_cell_properties*> & props)
{
style_table_cell_properties_attlist result;
BOOST_FOREACH(const style_table_cell_properties* v, props)
for (size_t i = 0; i < props.size(); i++)
{
if (v)
result.apply_from(v->attlist_);
if (props[i])
result.apply_from(props[i]->attlist_);
}
return result;
}
@ -173,19 +203,20 @@ style_table_cell_properties_attlist calc_table_cell_properties(const style_insta
{
if (const style_content * content = styleInstance->content())
if (const style_table_cell_properties * prop = content->get_style_table_cell_properties())
props.push_back(prop);
{
props.insert(props.begin(), prop);
}
styleInstance = styleInstance->parent();
}
reverse(props.begin(), props.end());
return calc_table_cell_properties(props);
}
style_table_cell_properties_attlist calc_table_cell_properties(const std::vector<const style_instance *> & styleInstances)
{
style_table_cell_properties_attlist result;
BOOST_FOREACH(const style_instance * inst, styleInstances)
for (size_t i = 0; i < styleInstances.size(); i++)
{
result.apply_from(calc_table_cell_properties(inst));
result.apply_from(calc_table_cell_properties(styleInstances[i]));
}
return result;
}

View File

@ -41,6 +41,7 @@
#include <vector>
namespace cpdoccore {
class tabs_context;
namespace odf_reader {
graphic_format_properties calc_graphic_properties_content(const style_instance * styleInstance);
@ -55,5 +56,6 @@ paragraph_format_properties calc_paragraph_properties_content(const std::vector<
style_table_cell_properties_attlist calc_table_cell_properties(const style_instance * styleInstance);
style_table_cell_properties_attlist calc_table_cell_properties(const std::vector<const style_instance *> & styleInstances);
void calc_tab_stops(const style_instance * styleInstance, tabs_context & context);
}
}

View File

@ -0,0 +1,76 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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 <boost/algorithm/string.hpp>
#include "commandtype.h"
#include <ostream>
namespace cpdoccore { namespace odf_types {
std::wostream & operator << (std::wostream & _Wostream, const command_type & _Val)
{
switch(_Val.get_type())
{
case command_type::command:
_Wostream << L"command";
break;
case command_type::query:
_Wostream << L"query";
break;
case command_type::table:
_Wostream << L"table";
break;
default:
break;
}
return _Wostream;
}
command_type command_type::parse(const std::wstring & Str)
{
std::wstring tmp = Str;
boost::algorithm::to_lower(tmp);
if (tmp == L"command")
return command_type( command );
else if (tmp == L"query")
return command_type( query );
else if (tmp == L"table")
return command_type( table );
else
{
return command_type( command );
}
}
} }

View File

@ -0,0 +1,74 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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
*
*/
#pragma once
#include <iosfwd>
#include <string>
#include "odfattributes.h"
namespace cpdoccore { namespace odf_types {
class command_type
{
public:
enum type
{
command,
query,
table
};
command_type() {}
command_type(type _Type) : type_(_Type)
{}
type get_type() const
{
return type_;
};
static command_type parse(const std::wstring & Str);
private:
type type_;
};
std::wostream & operator << (std::wostream & _Wostream, const command_type & _Val);
}
APPLY_PARSE_XML_ATTRIBUTES(odf_types::command_type);
}

View File

@ -49,6 +49,7 @@
#include "styleverticalpos.h"
#include "stylehorizontalpos.h"
#include "stylehorizontalrel.h"
#include "stylenumformat.h"
#include "percentorscale.h"
#include "anchortype.h"
#include "linewidth.h"
@ -331,8 +332,8 @@ public:
void apply_from(const common_num_format_attlist & Other);
void serialize(CP_ATTR_NODE);
_CP_OPT(std::wstring) style_num_format_;
_CP_OPT(Bool) style_num_letter_sync_;
_CP_OPT(odf_types::style_numformat) style_num_format_;
_CP_OPT(Bool) style_num_letter_sync_;
};

View File

@ -0,0 +1,140 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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 "stylenumformat.h"
#include <boost/algorithm/string.hpp>
#include <ostream>
namespace cpdoccore { namespace odf_types {
std::wostream & operator << (std::wostream & _Wostream, const style_numformat & _Val)
{
switch(_Val.get_type())
{
case style_numformat::arabic:
_Wostream << L"1";
break;
case style_numformat::romanUc:
_Wostream << L"I";
break;
case style_numformat::romanLc:
_Wostream << L"i";
break;
case style_numformat::alphaUc:
_Wostream << L"A";
break;
case style_numformat::alphaLc:
_Wostream << L"a";
break;
case style_numformat::aiueo:
_Wostream << L"ア, イ, ウ, ...";
break;
case style_numformat::chineseCounting:
_Wostream << L"イ, ロ, ハ, ...";
break;
case style_numformat::chineseLegal:
_Wostream << L"一, 二, 三, ...";
break;
case style_numformat::ideographLegal:
_Wostream << L"壹, 貳, 參, ...";
break;
case style_numformat::ideographTraditional:
_Wostream << L"甲, 乙, 丙, ...";
break;
case style_numformat::ideographZodiac:
_Wostream << L"子, 丑, 寅, ...";
break;
case style_numformat::ideographZodiacTraditional:
_Wostream << L"甲子, 乙丑, 丙寅, ...";
break;
case style_numformat::iroha:
_Wostream << L"イ, ロ, ハ, ...";
break;
case style_numformat::koreanDigital:
_Wostream << L"일, 이, 삼, ...";
break;
case style_numformat::russianLo:
_Wostream << L"А, Б, .., Аа, Аб, ... (ru)";
break;
case style_numformat::russianUp:
_Wostream << L"А, Б, .., Аа, Аб, ... (ru)";
break;
default:
break;
}
return _Wostream;
}
style_numformat style_numformat::parse(const std::wstring & Str)
{
std::wstring tmp = Str;
boost::algorithm::to_lower(tmp);
if (tmp == L"1")
return style_numformat( arabic );
else if (tmp == L"I")
return style_numformat( romanUc );
else if (tmp == L"i")
return style_numformat( romanLc );
else if (tmp == L"A")
return style_numformat( alphaUc );
else if (tmp == L"a")
return style_numformat( alphaLc );
else if (tmp == L"А, Б, .., Аа, Аб, ... (ru)")
return style_numformat( russianUp );
else if (tmp == L"일, 이, 삼, ...")
return style_numformat( koreanDigital );
else if (tmp == L"イ, ロ, ハ, ...")
return style_numformat( iroha );
else if (tmp == L"甲, 乙, 丙, ...")
return style_numformat( ideographTraditional );
else if (tmp == L"甲子, 乙丑, 丙寅, ...")
return style_numformat( ideographZodiacTraditional );
else if (tmp == L"子, 丑, 寅, ...")
return style_numformat( ideographZodiac );
else if (tmp == L"壹, 貳, 參, ...")
return style_numformat( ideographLegal );
else if (tmp == L"一, 二, 三, ...")
return style_numformat( chineseLegal );
else if (tmp == L"イ, ロ, ハ, ...")
return style_numformat( chineseCounting );
else if (tmp == L"ア, イ, ウ, ...")
return style_numformat( aiueo );
else
{
return style_numformat( arabic );
}
}
} }

View File

@ -0,0 +1,94 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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_ODF_STYLENUMFORMAT_H_
#define _CPDOCCORE_ODF_STYLENUMFORMAT_H_
#ifdef _MSC_VER
#pragma once
#endif
#include <iosfwd>
#include <string>
#include "odfattributes.h"
namespace cpdoccore { namespace odf_types {
class style_numformat
{
public:
enum type
{
arabic,
romanUc,
romanLc,
alphaUc,
alphaLc,
aiueo,
chineseCounting,
chineseLegal,
ideographLegal,
ideographTraditional,
ideographZodiac,
ideographZodiacTraditional,
iroha,
koreanDigital,
russianLo,
russianUp
};
style_numformat() {}
style_numformat(type _Type) : type_(_Type)
{}
type get_type() const
{
return type_;
};
static style_numformat parse(const std::wstring & Str);
private:
type type_;
};
std::wostream & operator << (std::wostream & _Wostream, const style_numformat & _Val);
}
APPLY_PARSE_XML_ATTRIBUTES(odf_types::style_numformat);
}
#endif

View File

@ -58,6 +58,8 @@ namespace _image_file_
{
bool GetResolution(const wchar_t* fileName, int & Width, int &Height, NSFonts::IApplicationFonts* appFonts)
{
if (!appFonts) return false;
CBgraFrame image;
MetaFile::IMetaFile* meta_file = MetaFile::Create(appFonts);
@ -412,11 +414,11 @@ void Compute_GraphicFill(const common_draw_fill_attlist & props, const office_el
{
if (style_background_image * image = dynamic_cast<style_background_image *>(style_image.get()))
{
if ((image) && (image->common_xlink_attlist_))
if ((image) && (image->xlink_attlist_))
{
fill.type = 2;
fill.bitmap = oox::oox_bitmap_fill::create();
fill.bitmap->xlink_href_ = image->common_xlink_attlist_->href_.get_value_or(L"");
fill.bitmap->xlink_href_ = image->xlink_attlist_->href_.get_value_or(L"");
if (image->style_repeat_)
{
switch(image->style_repeat_->get_type())
@ -550,7 +552,7 @@ void draw_a::add_child_element( xml::sax * Reader, const std::wstring & Ns, cons
}
void draw_a::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
CP_APPLY_ATTR(L"office:name" , office_name_ , std::wstring(L""));
CP_APPLY_ATTR(L"office:target-frame-name" , office_target_frame_name_);
@ -562,7 +564,7 @@ void draw_a::add_attributes( const xml::attributes_wc_ptr & Attributes )
void draw_a::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_drawing_context().start_action(L"");
Context.get_drawing_context().set_link(common_xlink_attlist_.href_.get_value_or(L""));
Context.get_drawing_context().set_link(xlink_attlist_.href_.get_value_or(L""));
Context.get_drawing_context().end_action();
for (size_t i = 0; i < content_.size(); i++)
@ -573,7 +575,7 @@ void draw_a::xlsx_convert(oox::xlsx_conversion_context & Context)
void draw_a::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().start_action(L"");
Context.get_slide_context().set_link(common_xlink_attlist_.href_.get_value_or(L""));
Context.get_slide_context().set_link(xlink_attlist_.href_.get_value_or(L""));
Context.get_slide_context().end_action();
for (size_t i = 0; i < content_.size(); i++)
@ -583,7 +585,7 @@ void draw_a::pptx_convert(oox::pptx_conversion_context & Context)
}
void draw_a::docx_convert(oox::docx_conversion_context & Context)
{
std::wstring rId = Context.add_hyperlink(common_xlink_attlist_.href_.get_value_or(L""), true);//гиперлинк с объекта, а не с текста ..
std::wstring rId = Context.add_hyperlink(xlink_attlist_.href_.get_value_or(L""), true);//гиперлинк с объекта, а не с текста ..
for (size_t i = 0; i < content_.size(); i++)
{

View File

@ -99,7 +99,7 @@ public:
friend class odf_document;
private:
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
std::wstring office_name_;
_CP_OPT(odf_types::target_frame_name) office_target_frame_name_;

View File

@ -90,7 +90,7 @@ const wchar_t * draw_image::name = L"image";
void draw_image::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
draw_image_attlist_.add_attributes(Attributes);
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
void draw_image::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
@ -122,7 +122,7 @@ std::wostream & draw_chart::text_to_stream(std::wostream & _Wostream) const
void draw_chart::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
draw_chart_attlist_.add_attributes(Attributes);
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
void draw_chart::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
@ -266,7 +266,7 @@ const wchar_t * draw_object::name = L"object";
void draw_object::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
draw_object_attlist_.add_attributes(Attributes);
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
void draw_object::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
@ -278,7 +278,7 @@ void draw_object::add_child_element( xml::sax * Reader, const std::wstring & Ns,
}
}
// draw:object
// draw:object-ole
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * draw_object_ole::ns = L"draw";
const wchar_t * draw_object_ole::name = L"object-ole";
@ -287,7 +287,7 @@ void draw_object_ole::add_attributes( const xml::attributes_wc_ptr & Attributes
{
CP_APPLY_ATTR(L"draw:class-id", draw_class_id_);
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
void draw_object_ole::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
@ -362,7 +362,7 @@ std::wstring draw_object::office_convert(odf_document_ptr odfDocument, int type)
{
outputDocx.write(objectOutPath);
href_result = common_xlink_attlist_.href_.get_value_or(L"Object");
href_result = xlink_attlist_.href_.get_value_or(L"Object");
int pos = href_result.find(L"./");
if (pos >= 0) href_result = href_result.substr(2);
@ -381,7 +381,7 @@ std::wstring draw_object::office_convert(odf_document_ptr odfDocument, int type)
{
outputXlsx.write(objectOutPath);
href_result = common_xlink_attlist_.href_.get_value_or(L"Object");
href_result = xlink_attlist_.href_.get_value_or(L"Object");
int pos = href_result.find(L"./");
if (pos >= 0) href_result = href_result.substr(2);
@ -423,14 +423,36 @@ void draw_plugin::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"draw:mime-type", draw_mime_type_);
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
void draw_plugin::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(content_);
}
// draw:control
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * draw_control::ns = L"draw";
const wchar_t * draw_control::name = L"control";
void draw_control::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"xml:id", xml_id_);
CP_APPLY_ATTR(L"draw:caption-id", caption_id_);
CP_APPLY_ATTR(L"draw:control", control_id_);
draw_attlists_.shape_with_text_and_styles_.add_attributes(Attributes);
draw_attlists_.position_.add_attributes(Attributes);
draw_attlists_.rel_size_.add_attributes(Attributes);
}
void draw_control::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"draw", L"glue-point")
{
CP_CREATE_ELEMENT(draw_glue_point_);
}
}
}
}

View File

@ -81,7 +81,7 @@ private:
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
draw_image_attlist draw_image_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
office_element_ptr office_binary_data_;
@ -121,7 +121,7 @@ private:
private:
draw_chart_attlist draw_chart_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
office_element_ptr_array content_;
//office_element_ptr title_;
@ -294,7 +294,7 @@ public:
virtual void pptx_convert (oox::pptx_conversion_context & Context);
draw_object_attlist draw_object_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
odf_document_ptr odf_document_;
@ -320,7 +320,7 @@ 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_;
odf_types::common_xlink_attlist xlink_attlist_;
_CP_OPT(std::wstring) draw_class_id_;
private:
@ -331,7 +331,7 @@ private:
};
CP_REGISTER_OFFICE_ELEMENT2(draw_object_ole);
//----------------------------------------------------------------------------------------------
class draw_param : public office_element_impl<draw_param>
{
public:
@ -354,7 +354,7 @@ private:
};
CP_REGISTER_OFFICE_ELEMENT2(draw_param);
//----------------------------------------------------------------------------------------------
class draw_plugin : public office_element_impl<draw_plugin>
{
public:
@ -368,7 +368,7 @@ 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_;
odf_types::common_xlink_attlist xlink_attlist_;
_CP_OPT(std::wstring) draw_mime_type_;
office_element_ptr_array content_;
@ -377,9 +377,34 @@ 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_plugin);
//----------------------------------------------------------------------------------------------
class draw_control : public office_element_impl<draw_control>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeDrawControl;
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){}
odf_types::union_common_draw_attlists draw_attlists_;
_CP_OPT(std::wstring) xml_id_;
_CP_OPT(std::wstring) caption_id_;
_CP_OPT(std::wstring) control_id_;
office_element_ptr draw_glue_point_;
//<svg:desc>
//<svg:title>
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_control);
}
}

View File

@ -30,6 +30,7 @@
*
*/
#include "office_forms.h"
#include "draw_frame.h"
#include <ostream>
@ -39,6 +40,7 @@
#include <boost/regex.hpp>
#include <cpdoccore/odf/odf_document.h>
#include <cpdoccore/xml/utils.h>
#include "serialize_elements.h"
@ -1097,10 +1099,10 @@ void draw_shape::docx_convert(oox::docx_conversion_context & Context)
void draw_image::docx_convert(oox::docx_conversion_context & Context)
{
if (!common_xlink_attlist_.href_)
if (!xlink_attlist_.href_)
return;
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
int pos_replaicement = href.find(L"ObjectReplacements");
const draw_frame * frame = Context.get_drawing_context().get_current_frame();//owner
@ -1245,10 +1247,13 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
size_t min_y = get_value_emu(draw_text_box_attlist_.fo_min_height_->get_length());
if (drawing->cy < min_y)
{
auto_fit_text = true;
drawing->cy = min_y;
}
if (drawing->cy < 36000) auto_fit_shape = true;
//if (drawing->cy < 36000)
//{
// auto_fit_shape = true;
//}
auto_fit_shape = true;
}
@ -1260,7 +1265,11 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
auto_fit_text = true;
drawing->cx = min_x;
}
if (drawing->cx < 36000) auto_fit_shape = true;
if (drawing->cx < 36000)
{
auto_fit_text = false;
auto_fit_shape = true;
}
}
@ -1461,7 +1470,7 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
{
try
{
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
std::wstring tempPath = Context.root()->get_temp_folder();
std::wstring odfPath = Context.root()->get_folder();
@ -1607,7 +1616,7 @@ void draw_object_ole::docx_convert(oox::docx_conversion_context & Context)
use_image_replace = true;
//------------------------------------------------
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
@ -1626,6 +1635,137 @@ void draw_object_ole::docx_convert(oox::docx_conversion_context & Context)
drawing->objectProgId = detectObject(objectPath);
}
void draw_control::docx_convert(oox::docx_conversion_context & Context)
{
if (!control_id_) return;
oox::text_forms_context::_state & state = Context.get_forms_context().get_state_element(*control_id_);
if (state.id.empty()) return;
Context.get_drawing_context().start_shape(NULL);
Context.get_drawing_context().add_name_object(state.name.empty() ? L"Control" : state.name);
//--------------------------------------------------------------------------------------------------
oox::_docx_drawing drawing = oox::_docx_drawing();
drawing.type = oox::typeShape;
drawing.id = Context.get_drawing_context().get_current_shape_id();
drawing.name = Context.get_drawing_context().get_current_object_name();
drawing.inGroup = Context.get_drawing_context().in_group();
drawing.sub_type = 1;
//---------------------------------------------------------------------------------------------------------
oox::StreamsManPtr prev = Context.get_stream_man();
std::wstringstream temp_stream(Context.get_drawing_context().get_text_stream_shape());
Context.set_stream_man( boost::shared_ptr<oox::streams_man>( new oox::streams_man(temp_stream) ));
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);
Context.start_paragraph(false);
if (draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_text_style_name_)
{
text::paragraph_attrs attrs_;
attrs_.text_style_name_ = *draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_text_style_name_;
int textStyle = Context.process_paragraph_attr(&attrs_);
}
if (state.element)
{
state.element->docx_convert_sdt(Context, this);
//state.element->docx_convert_field(Context, this);
}
else
{
std::wstring text;
if (!state.label.empty()) text = state.label;
else if (!state.value.empty()) text = state.value;
Context.add_new_run(L"");
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
Context.output_stream() << xml::utils::replace_text_to_xml( text );
Context.output_stream() << L"</w:t>";
Context.finish_run();
}
Context.finish_paragraph();
Context.get_drawing_context().get_text_stream_shape() = temp_stream.str();
Context.set_stream_man(prev);
Context.set_run_state (runState);
Context.set_paragraph_state (pState);
Context.set_drawing_state_content (drState);
Context.set_paragraph_keep (keepState);
const std::wstring & content = Context.get_drawing_context().get_text_stream_shape();
drawing.additional.push_back(_property(L"text-content",content));
Context.get_drawing_context().clear_stream_shape();
drawing.additional.push_back(_property(L"text-padding-left", 0.));
drawing.additional.push_back(_property(L"text-padding-top", 0.));
drawing.additional.push_back(_property(L"text-padding-right", 0.));
drawing.additional.push_back(_property(L"text-padding-bottom", 0.));
//---------------------------------------------------------------------------------------------------------
/////////
common_draw_docx_convert(Context, draw_attlists_, &drawing);
/////////
std::wostream & strm = Context.output_stream();
pState = Context.get_paragraph_state();
runState = Context.get_run_state();
keepState = Context.get_paragraph_keep();
//Context.set_run_state (false);
Context.set_paragraph_state (false);
bool new_run = false;
if ((pState == false && Context.get_drawing_context().get_current_level() == 1) || (Context.get_drawing_context().in_group()))
{
}
else
{
if (!Context.get_drawing_context().in_group() && !runState)
{
if (!pState)
{
Context.start_paragraph();
}
Context.add_new_run(L"");
new_run = true;
}
}
drawing.serialize(strm/*, Context.get_drawing_state_content()*/);
if (new_run)
{
Context.finish_run();
if (!pState)
{
Context.finish_paragraph();
}
}
Context.set_paragraph_state(pState);
Context.get_drawing_context().stop_shape();
}
}
}

View File

@ -209,7 +209,7 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context)
void draw_image::pptx_convert(oox::pptx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
const std::wstring href = xlink_attlist_.href_.get_value_or(L"");
Context.get_slide_context().set_image(href);
////////////////////////////////////в принципе достаточно общая часть ...
@ -228,7 +228,7 @@ void draw_image::pptx_convert(oox::pptx_conversion_context & Context)
}
void draw_chart::pptx_convert(oox::pptx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
const std::wstring href = xlink_attlist_.href_.get_value_or(L"");
Context.get_slide_context().set_chart(href);
for (size_t i = 0; i < content_.size(); i++)
@ -260,7 +260,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
{
std::wstring tempPath = Context.root()->get_temp_folder();
std::wstring odfPath = Context.root()->get_folder();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
if (!odf_document_ && !href.empty())
{
@ -310,7 +310,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
//---------------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1)//диаграмма
{
const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"Chart");
const std::wstring href_draw = xlink_attlist_.href_.get_value_or(L"Chart");
objectBuild.pptx_convert(Context);
Context.get_slide_context().set_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
@ -379,7 +379,7 @@ void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().set_use_image_replacement();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
@ -398,7 +398,7 @@ void draw_plugin::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().set_use_image_replacement();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;

View File

@ -203,7 +203,7 @@ void draw_frame::xlsx_convert(oox::xlsx_conversion_context & Context)
void draw_image::xlsx_convert(oox::xlsx_conversion_context & Context)
{
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
if (href.empty() && office_binary_data_)
{
@ -234,7 +234,7 @@ void draw_image::xlsx_convert(oox::xlsx_conversion_context & Context)
void draw_chart::xlsx_convert(oox::xlsx_conversion_context & Context)
{
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
const std::wstring href = xlink_attlist_.href_.get_value_or(L"");
Context.get_drawing_context().set_chart(href);
for (size_t i = 0 ; i < content_.size(); i++)
@ -264,7 +264,7 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
{
try
{
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
if (!odf_document_ && !href.empty())
{
@ -291,7 +291,7 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
//---------------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1) //диаграмма
{
const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"chart");
const std::wstring href_draw = xlink_attlist_.href_.get_value_or(L"chart");
objectBuild.xlsx_convert(Context);
Context.get_drawing_context().set_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
@ -352,7 +352,7 @@ void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_drawing_context().set_use_image_replacement();
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = xlink_attlist_.href_.get_value_or(L"");
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;

View File

@ -65,6 +65,9 @@ public:
draw_shape() : bad_shape_(false), word_art_(false), idx_in_owner(-1) {}
CPDOCCORE_DEFINE_VISITABLE();
friend class odf_document;
//----------------------------------------------------------------------------------------------
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);
@ -79,14 +82,11 @@ public:
odf_types::union_common_draw_attlists common_draw_attlists_;
draw_shape_attlist draw_shape_attlist_;
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
_CP_OPT(std::wstring) draw_id_; //используется для анимашек
office_element_ptr_array content_;
CPDOCCORE_DEFINE_VISITABLE();
friend class odf_document;
//----------------------------------------------------------------------------------------------
bool bad_shape_;
bool word_art_;
int sub_type_;

View File

@ -134,7 +134,7 @@ void svg_font_face_name::add_text(const std::wstring & Text)
void common_svg_font_face_xlink_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
// svg:definition-src

View File

@ -56,7 +56,7 @@ class common_svg_font_face_xlink_attlist
public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
};
// svg:font-face-uri
class svg_font_face_uri : public office_element_impl<svg_font_face_uri>

View File

@ -77,6 +77,10 @@ void content_xml_t::add_child_element( xml::sax * Reader, const std::wstring & N
create_element_and_read(Reader, Ns, Name, content_, &context_, true);
}
else if CP_CHECK_NAME(L"office", L"document-settings")
{
create_element_and_read(Reader, Ns, Name, content_, &context_, true);
}
else if CP_CHECK_NAME(L"office", L"document-meta")
{
create_element_and_read(Reader, Ns, Name, content_, &context_, true);
}
@ -88,6 +92,7 @@ void content_xml_t::add_child_element( xml::sax * Reader, const std::wstring & N
{
create_element_and_read(Reader, Ns, Name, content_, &context_, true);
}
}
void content_xml_t::add_text(const std::wstring & Text)

View File

@ -54,7 +54,9 @@
#include "office_annotation.h"
#include "office_settings.h"
#include "office_scripts.h"
#include "office_forms.h"
#include "office_event_listeners.h"
#include "office_meta.h"
#include "styles.h"
#include "style_regions.h"
@ -141,6 +143,9 @@ odf_document::Impl::Impl(xml::sax * Reader, const std::wstring & tempPath):
_CP_LOG << L"[info] parse manifest" << std::endl;
parse_manifests(content_xml_->get_content());
_CP_LOG << L"[info] parse meta" << std::endl;
parse_meta(content_xml_->get_content());
_CP_LOG << L"[info] parse settings" << std::endl;
parse_settings(content_xml_->get_content());
@ -206,6 +211,8 @@ odf_document::Impl::Impl(const std::wstring & srcPath, const std::wstring & temp
_CP_LOG << L"[info] read styles.xml" << std::endl;
styles_xml_ = read_file_content(styles_xml);
_CP_LOG << L"[info] read meta.xml" << std::endl;
meta_xml_ = read_file_content(meta_xml);
//----------------------------------------------------------------------------------------
_CP_LOG << L"[info] parse fonts" << std::endl;
parse_fonts(content_xml_ ? content_xml_->get_content() : NULL);
@ -216,6 +223,8 @@ odf_document::Impl::Impl(const std::wstring & srcPath, const std::wstring & temp
_CP_LOG << L"[info] parse settings" << std::endl;
parse_settings(settings_xml_ ? settings_xml_->get_content() : NULL);
_CP_LOG << L"[info] parse meta" << std::endl;
parse_meta(meta_xml_ ? meta_xml_->get_content() : NULL);
}
else
{
@ -635,7 +644,26 @@ void odf_document::Impl::parse_settings(office_element *element)
}
}
}
}
}
void odf_document::Impl::parse_meta(office_element *element)
{
office_document_base * document = dynamic_cast<office_document_base *>( element );
if (!document) return;
office_meta * meta = dynamic_cast<office_meta*>(document->office_meta_.get());
if (!meta) return;
for (size_t i = 0; i < meta->meta_user_defined_.size(); i++)
{
meta_user_defined * user_defined = dynamic_cast<meta_user_defined*>(meta->meta_user_defined_[i].get());
if (!user_defined) continue;
if (user_defined->meta_name_.empty()) continue;
context_->Settings().add_user_defined(user_defined->meta_name_, user_defined->content_);
}
}
void odf_document::Impl::parse_styles(office_element *element)
@ -690,12 +718,13 @@ void odf_document::Impl::parse_styles(office_element *element)
( L"common:" + styleInst->style_name_,
styleInst->style_display_name_.get_value_or(L""),
styleInst->style_family_.get_type(),
&(styleInst->style_content_),
&(styleInst->content_),
true,
false,
styleInst->style_parent_style_name_.get_value_or(L""),
styleInst->style_next_style_name_.get_value_or(L""),
styleInst->style_data_style_name_.get_value_or(L"")
styleInst->style_data_style_name_.get_value_or(L""),
styleInst->style_class_.get_value_or(L"")
);
}
// list styles
@ -769,12 +798,13 @@ void odf_document::Impl::parse_styles(office_element *element)
context_->styleContainer().add_style(L"",
L"",
styleInst->style_family_.get_type(),
&(styleInst->style_content_),
&(styleInst->content_),
false,
true,
L"",
L"",
L"");
L"",
L"");
}
for (size_t i = 0; i < docStyles->style_presentation_page_layout_.size(); i++)
{
@ -806,12 +836,13 @@ void odf_document::Impl::parse_styles(office_element *element)
context_->styleContainer().add_style(styleInst->style_name_,
styleInst->style_display_name_.get_value_or(L""),
styleInst->style_family_.get_type(),
&(styleInst->style_content_),
&(styleInst->content_),
false,
false,
styleInst->style_parent_style_name_.get_value_or(L""),
styleInst->style_next_style_name_.get_value_or(L""),
styleInst->style_data_style_name_.get_value_or(L"")
styleInst->style_data_style_name_.get_value_or(L""),
styleInst->style_class_.get_value_or(L"")
);
}
@ -956,12 +987,13 @@ void odf_document::Impl::parse_styles(office_element *element)
context_->styleContainer().add_style(styleInst->style_name_,
styleInst->style_display_name_.get_value_or(L""),
styleInst->style_family_.get_type(),
&(styleInst->style_content_),
&(styleInst->content_),
true,
false,
styleInst->style_parent_style_name_.get_value_or(L""),
styleInst->style_next_style_name_.get_value_or(L""),
styleInst->style_data_style_name_.get_value_or(L"")
styleInst->style_data_style_name_.get_value_or(L""),
styleInst->style_class_.get_value_or(L"")
);
}

View File

@ -96,6 +96,7 @@ private:
void parse_fonts (office_element *elemen);
void parse_manifests(office_element *element);
void parse_settings (office_element *element);
void parse_meta (office_element *element);
bool decrypt_folder (const std::wstring &password, const std::wstring & srcPath, const std::wstring & dstPath);
bool decrypt_file (const std::wstring &password, const std::wstring & srcPath, const std::wstring & dstPath, office_element_ptr data, int size );

View File

@ -47,7 +47,8 @@ style_instance::style_instance(
bool IsDefault,
const std::wstring & ParentStyleName,
const std::wstring & NextStyleName,
const std::wstring & DataStyleName
const std::wstring & DataStyleName,
const std::wstring & StyleClass
) :
container_ (Container),
name_ (Name),
@ -56,6 +57,7 @@ style_instance::style_instance(
is_automatic_ (IsAutomatic),
is_default_ (IsDefault),
next_name_ (NextStyleName),
style_class_ (StyleClass),
next_ (Container->style_by_name(NextStyleName, style_type_, false)),
data_style_name_(DataStyleName)
{
@ -83,7 +85,8 @@ void styles_container::add_style( const std::wstring & Name,
bool IsDefault,
const std::wstring & ParentStyleName_,
const std::wstring & NextStyleName,
const std::wstring & DataStyleName)
const std::wstring & DataStyleName,
const std::wstring & StyleClass)
{
std::wstring ParentStyleName = ParentStyleName_;
@ -91,9 +94,8 @@ void styles_container::add_style( const std::wstring & Name,
{
ParentStyleName = L"";//иначе в коде возможно зацикливание.
}
style_instance_ptr newStyle = style_instance_ptr(
new style_instance(this, Name, Type, Content, IsAutomatic, IsDefault, ParentStyleName, NextStyleName, DataStyleName)
);
style_instance_ptr newStyle = style_instance_ptr( new style_instance(this, Name, Type, Content, IsAutomatic, IsDefault,
ParentStyleName, NextStyleName, DataStyleName, StyleClass));
instances_.push_back(newStyle);
int pos = static_cast<int>(instances_.size() - 1);
@ -180,6 +182,10 @@ const std::wstring & style_instance::data_style_name() const
{
return data_style_name_;
}
const std::wstring & style_instance::style_class() const
{
return style_class_;
}
style_instance * styles_container::style_by_name(const std::wstring & Name, style_family::type Type, bool object_in_styles) const
{
@ -327,7 +333,7 @@ page_layout_instance::page_layout_instance(const style_page_layout * StylePageLa
const std::wstring & page_layout_instance::name() const
{
return style_page_layout_->attlist_.get_style_name();
return style_page_layout_->style_name_;
}
style_page_layout_properties * page_layout_instance::properties() const
@ -365,6 +371,11 @@ void page_layout_instance::docx_serialize(std::wostream & strm, oox::docx_conver
_CP_OPT(length) bottom = attr.fo_min_height_ ? attr.fo_min_height_ : attr.svg_height_;
Context.get_header_footer_context().set_footer(bottom);
}
if ( style_page_layout_->style_page_usage_.get_type() == page_usage::Mirrored )
{
Context.set_settings_property(odf_reader::_property(L"mirrorMargins",true));
}
style_page_layout_properties * props = properties();
if (props)

View File

@ -64,7 +64,8 @@ public:
bool IsDefault,
const std::wstring & ParentStyleName,
const std::wstring & NextStyleName,
const std::wstring & DataStyleName
const std::wstring & DataStyleName,
const std::wstring & StyleClass
);
@ -77,6 +78,7 @@ public:
const std::wstring & next_name() const;
const styles_container * container() const { return container_; }
const std::wstring & data_style_name() const;
const std::wstring & style_class() const;
bool is_automatic() const;
bool is_default() const;
@ -90,6 +92,7 @@ private:
bool is_automatic_;
bool is_default_;
std::wstring style_class_;
std::wstring parent_name_;
std::wstring next_name_;
mutable style_instance * parent_;
@ -145,7 +148,8 @@ public:
bool IsDefault,
const std::wstring & ParentStyleName,
const std::wstring & NextStyleName,
const std::wstring & DataStyleName);
const std::wstring & DataStyleName,
const std::wstring & StyleClass);
void add_master_page_name(const std::wstring & StyleName, const std::wstring & MasterPageName);

View File

@ -74,7 +74,9 @@ void office_document_base::add_child_element( xml::sax * Reader, const std::wstr
CP_CREATE_ELEMENT(office_scripts_);
else if CP_CHECK_NAME(L"office", L"settings")
CP_CREATE_ELEMENT(office_settings_);
else if CP_CHECK_NAME(L"manifest", L"file-entry")
else if CP_CHECK_NAME(L"office", L"meta")
CP_CREATE_ELEMENT(office_meta_);
else if CP_CHECK_NAME(L"manifest", L"file-entry")
CP_CREATE_ELEMENT(manifests_);
else
CP_NOT_APPLICABLE_ELM();

View File

@ -46,9 +46,15 @@ enum ElementType
typeTextBookmark,
typeTextBookmarkStart,
typeTextBookmarkEnd,
typeTextBookmarkRef,
typeTextReferenceMark,
typeTextReferenceMarkStart,
typeTextReferenceMarkEnd,
typeTextReferenceRef,
typeTextFieldFieldmarkStart,
typeTextFieldFieldmarkEnd,
typeTextSpan,
typeTextA,
typeTextNote,
@ -93,12 +99,19 @@ enum ElementType
typeTextSequenceDecls,
typeTextSequenceDecl,
typeTextSequence,
typeTextSequenceRef,
typeTextHiddenParagraph,
typeTextHiddenText,
typePresentationFooter,
typePresentationDateTime,
typeDcCreator,
typeDcDate,
typeDcDescription,
typeDcSubject,
typeDcTitle,
typeDrawA,
@ -117,27 +130,62 @@ enum ElementType
typeTextNumberedParagraph,
typeTextExpression,
typeTextCommonEntryTemplate,
typeTextTableOfContent,
typeTextTableOfContentSource,
typeTextTableOfContentEntryTemplate,
typeTextIndexEntryText,
typeTextIndexEntryTabStop,
typeTextIndexEntrySpan,
typeTextIndexEntryPageNumber,
typeTextIndexEntryLinkStart,
typeTextIndexEntryLinkEnd,
typeTextIndexEntryChapter,
typeTextIndexEntryBibliography,
typeTextIllustrationIndex,
typeTextIllustrationIndexSource,
typeTextIllustrationIndexEntryTemplate,
typeTextTableIndex,
typeTextTableIndexSource,
typeTextTableIndexEntryTemplate,
typeTextObjectIndex,
typeTextObjectIndexSource,
typeTextObjectIndexEntryTemplate,
typeTextUserIndex,
typeTextUserIndexSource,
typeTextUserIndexEntryTemplate,
typeTextAlphabeticalIndex,
typeTextAlphabeticalIndexSource,
typeTextAlphabeticalIndexEntryTemplate,
typeTextBibliography,
typeTextBibliographySource,
typeTextBibliographyEntryTemplate,
typeTextBibliographyMark,
typeTextBibliographySource,
typeTextAlphabeticalIndexAutoMarkFile,
typeTextAlphabeticalIndexMarkStart,
typeTextAlphabeticalIndexMarkEnd,
typeTextAlphabeticalIndexMark,
typeTextTocMarkStart,
typeTextTocMarkEnd,
typeTextTocMark,
typeTextUserIndexMarkStart,
typeTextUserIndexMarkEnd,
typeTextUserIndexMark,
typeTextIndexSourceStyles,
typeTextIndexSourceStyle,
typeTextVariableInput,
typeTextVariableGet,
@ -151,6 +199,8 @@ enum ElementType
typeTextUserFieldSet,
typeTextUserFieldInput,
typeTextUserDefined,
typeTextTrackedChanges,
typeTextChangedRegion,
typeTextChangeStart,
@ -229,6 +279,8 @@ enum ElementType
typeTableOddColumnsTemplate,
typeTableOddRowsTemplate,
typeTextIndexTitleTemplate,
typeTextNotesConfiguration,
typeStyleFontFace,
@ -369,6 +421,15 @@ enum ElementType
typeOfficeSettingsConfigItemMapNamed,
typeOfficeSettingsConfigItemMapEntry,
typeOfficeMeta,
typeOfficeMetaUserDefined,
typeOfficeMetaDocumentStatistic,
typeOfficeMetaGenerator,
typeOfficeMetaCreationDate,
typeOfficeMetaKeyword,
typeOfficeMetaEditingCycles,
typeOfficeMetaEditingDuration,
typeDrawG,
typeDrawFrame,
typeDrawImage,
@ -408,6 +469,36 @@ enum ElementType
typeDr3dRotate,
typeDr3dSphere,
typeOfficeForms,
typeFormForm,
typeFormProperties,
typeFormProperty,
typeFormListProperty,
typeFormListValue,
typeFormElement,
typeFormButton,
typeFormCheckbox,
typeFormText,
typeFormCombobox,
typeFormListbox,
typeFormConnectionResource,
typeFormDate,
typeFormFile,
typeFormFixedText,
typeFormFormattedText,
typeFormFrame,
typeFormGenericControl,
typeFormGrid,
typeFormHidden,
typeFormImage,
typeFormImageFrame,
typeFormNumber,
typeFormPassword,
typeFormRadio,
typeFormTextarea,
typeFormTime,
typeFormValueRange,
typeDrawPage,
typePresentationFooterDecl,
typePresentationDateTimeDecl,

View File

@ -73,7 +73,7 @@ void office_event_listeners::pptx_convert(oox::pptx_conversion_context & Context
void presentation_event_listener_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
CP_APPLY_ATTR(L"script:event-name", script_event_name_);
CP_APPLY_ATTR(L"presentation:action", presentation_action_);
@ -101,8 +101,8 @@ void presentation_event_listener::pptx_convert(oox::pptx_conversion_context & Co
{
Context.get_slide_context().start_action(attlist_.presentation_action_.get_value_or(L""));
if (attlist_.common_xlink_attlist_.href_)
Context.get_slide_context().set_link(*attlist_.common_xlink_attlist_.href_);
if (attlist_.xlink_attlist_.href_)
Context.get_slide_context().set_link(*attlist_.xlink_attlist_.href_);
if (presentation_sound_)
{

View File

@ -72,7 +72,7 @@ class presentation_event_listener_attlist
public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
_CP_OPT(std::wstring) script_event_name_;
_CP_OPT(std::wstring) presentation_action_;

View File

@ -0,0 +1,431 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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 "office_forms.h"
#include "draw_frame.h"
#include "text_content.h"
#include <cpdoccore/xml/xmlchar.h>
#include <cpdoccore/xml/attributes.h>
#include <cpdoccore/xml/utils.h>
#include "serialize_elements.h"
namespace cpdoccore {
namespace odf_reader {
// office:forms
//----------------------------------------------------------------------------------
const wchar_t * office_forms::ns = L"office";
const wchar_t * office_forms::name = L"forms";
void office_forms::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"form:apply-design-mode", apply_design_mode_);
CP_APPLY_ATTR(L"form:automatic-focus", automatic_focus_);
}
void office_forms::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(content_);
}
void office_forms::docx_convert(oox::docx_conversion_context & Context)
{
for (size_t i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);
}
}
// form:form
//----------------------------------------------------------------------------------
const wchar_t * form_form::ns = L"form";
const wchar_t * form_form::name = L"form";
void form_form::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"form:allow-deletes", allow_deletes_);
CP_APPLY_ATTR(L"form:allow-inserts", allow_inserts_);
CP_APPLY_ATTR(L"form:allow-updates", allow_updates_);
CP_APPLY_ATTR(L"form:apply-filter", apply_filter_);
CP_APPLY_ATTR(L"form:command", command_);
CP_APPLY_ATTR(L"form:command_type", command_type_);
CP_APPLY_ATTR(L"form:control-implementation", control_implementation_);
CP_APPLY_ATTR(L"form:datasource", datasource_);
CP_APPLY_ATTR(L"form:detail-fields", detail_fields_);
CP_APPLY_ATTR(L"form:enctype", enctype_);
CP_APPLY_ATTR(L"form:escape-processing",escape_processing_);
CP_APPLY_ATTR(L"form:filter", filter_);
CP_APPLY_ATTR(L"form:ignore-result", ignore_result_);
CP_APPLY_ATTR(L"form:master-fields", master_fields_);
CP_APPLY_ATTR(L"form:method", method_);
CP_APPLY_ATTR(L"form:name", name_);
CP_APPLY_ATTR(L"form:navigation-mode", navigation_mode_);
CP_APPLY_ATTR(L"form:order", order_);
CP_APPLY_ATTR(L"form:tabcycle", tabcycle_);
CP_APPLY_ATTR(L"office:target-frame", office_target_frame_);
xlink_attlist_.add_attributes(Attributes);
}
void form_form::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"form", L"properties")
{
CP_CREATE_ELEMENT(properties_);
}
else if CP_CHECK_NAME(L"office", L"event-listeners")
{
CP_CREATE_ELEMENT(office_event_listeners_);
}
else
CP_CREATE_ELEMENT(content_);
}
void form_form::docx_convert(oox::docx_conversion_context & Context)
{
for (size_t i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);
}
}
// form:properties
//----------------------------------------------------------------------------------
const wchar_t * form_properties::ns = L"form";
const wchar_t * form_properties::name = L"properties";
void form_properties::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(content_);
}
void form_properties::docx_convert(oox::docx_conversion_context & Context)
{
//for (size_t i = 0; i < content_.size(); i++)
// {
// content_[i]->docx_convert(Context);
// }
}
// form:property
//----------------------------------------------------------------------------------
const wchar_t * form_property::ns = L"form";
const wchar_t * form_property::name = L"property";
void form_property::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"form:property-name", property_name_);
value_and_type_.add_attributes(Attributes);
}
// form:list-property
//----------------------------------------------------------------------------------
const wchar_t * form_list_property::ns = L"form";
const wchar_t * form_list_property::name = L"list-property";
void form_list_property::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"form:property-name", property_name_);
CP_APPLY_ATTR(L"form:value-type", value_type_);
}
void form_list_property::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(content_);
}
void form_list_property::docx_convert(oox::docx_conversion_context & Context)
{
for (size_t i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);
}
}
// form:list-value
//----------------------------------------------------------------------------------
const wchar_t * form_list_value::ns = L"form";
const wchar_t * form_list_value::name = L"list-value";
void form_list_value::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
value_and_type_.add_attributes(Attributes);
}
//----------------------------------------------------------------------------------
const wchar_t * form_element::ns = L"form";
const wchar_t * form_element::name = L"element";
void form_element::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"form:control_implementation", control_implementation_);
CP_APPLY_ATTR(L"form:data-field", data_field_);
CP_APPLY_ATTR(L"form:linked-cell", linked_cell_);
CP_APPLY_ATTR(L"form:disabled", disabled_);
CP_APPLY_ATTR(L"form:id", id_);
CP_APPLY_ATTR(L"form:label", label_);
CP_APPLY_ATTR(L"form:name", name_);
CP_APPLY_ATTR(L"form:printable", printable_);
CP_APPLY_ATTR(L"form:tab-index", tab_index_);
CP_APPLY_ATTR(L"form:tab-stop", tab_stop_);
CP_APPLY_ATTR(L"form:title", title_);
CP_APPLY_ATTR(L"form:value", value_);
CP_APPLY_ATTR(L"form:current-value",current_value_);
CP_APPLY_ATTR(L"xml:id", xml_id_);
CP_APPLY_ATTR(L"xforms:bind", xforms_bind_);
}
void form_element::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"form", L"properties")
{
CP_CREATE_ELEMENT(properties_);
}
else if CP_CHECK_NAME(L"office", L"event-listeners")
{
CP_CREATE_ELEMENT(office_event_listeners_);
}
}
void form_element::docx_convert(oox::docx_conversion_context & Context)
{
std::wstring id = id_ ? *id_ : (xml_id_ ? *xml_id_ : L"");
Context.get_forms_context().set_id(id);
if (name_) Context.get_forms_context().set_name(*name_);
if (label_) Context.get_forms_context().set_label(*label_);
if (current_value_) Context.get_forms_context().set_value(*current_value_);
else if (value_) Context.get_forms_context().set_value(*value_);
if (control_implementation_) Context.get_forms_context().set_uuid(*control_implementation_);
Context.get_forms_context().end_element();
}
// form:button
//----------------------------------------------------------------------------------
const wchar_t * form_button::ns = L"form";
const wchar_t * form_button::name = L"button";
void form_button::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
form_element::add_attributes(Attributes);
}
void form_button::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(1);
form_element::docx_convert(Context);
}
// form:text
//----------------------------------------------------------------------------------
const wchar_t * form_text::ns = L"form";
const wchar_t * form_text::name = L"text";
void form_text::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
form_element::add_attributes(Attributes);
}
void form_text::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(2);
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::docx_convert(Context);
}
void form_text::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
Context.output_stream() << L"<w:sdt>";
Context.output_stream() << L"<w:sdtPr>";
{
if (name_)
{
Context.output_stream() << L"<w:alias w:val=\"" + xml::utils::replace_text_to_xml(*name_) + L"\"/>";
}
Context.output_stream() << L"<w:id w:val=\"" + std::to_wstring(Context.get_drawing_context().get_current_shape_id()) + L"\"/>";
//<w:lock w:val="sdtLocked"/>
//<w:placeholder>
// <w:docPart w:val="DefaultPlaceholder_-1854013440"/>
//</w:placeholder>
}
Context.output_stream() << L"</w:sdtPr>";
Context.output_stream() << L"<w:sdtContent>";
{
Context.add_new_run(L"");
if (current_value_)
{
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
Context.output_stream() << xml::utils::replace_text_to_xml(*current_value_ );
Context.output_stream() << L"</w:t>";
}
Context.finish_run();
}
Context.output_stream() << L"</w:sdtContent>";
Context.output_stream() << L"</w:sdt>";
}
void form_text::docx_convert_field(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
XmlUtils::replace_all( *name_, L" ", L"_");
Context.add_new_run(L"");
Context.output_stream() << L"<w:fldChar w:fldCharType=\"begin\"><w:ffData><w:name w:val=\"" << *name_ << L"\"/><w:enabled/>";
Context.output_stream() << L"</w:ffData></w:fldChar>";
Context.finish_run();
Context.add_new_run(L"");
Context.output_stream() << L"<w:instrText>FORMTEXT</w:instrText>";
Context.finish_run();
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>";
Context.add_new_run(L"");
Context.output_stream() << L"<w:t>" << *current_value_ << L"</w:t>";
Context.finish_run();
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
}
// form:checkbox
//----------------------------------------------------------------------------------
const wchar_t * form_checkbox::ns = L"form";
const wchar_t * form_checkbox::name = L"checkbox";
void form_checkbox::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
_CP_OPT(std::wstring) strVal;
CP_APPLY_ATTR(L"form:current-state", strVal);
if ((strVal) && (*strVal == L"checked"))
current_state_ = true;
else current_state_ = false;
form_element::add_attributes(Attributes);
}
void form_checkbox::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(3);
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
form_element::docx_convert(Context);
}
void form_checkbox::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
Context.output_stream() << L"<w:sdt>";
Context.output_stream() << L"<w:sdtPr>";
{
if (name_)
{
Context.output_stream() << L"<w:alias w:val=\"" + xml::utils::replace_text_to_xml(*name_) + L"\"/>";
}
Context.output_stream() << L"<w:id w:val=\"" + std::to_wstring(Context.get_drawing_context().get_current_shape_id()) + L"\"/>";
Context.output_stream() << L"<w14:checkbox>";
Context.output_stream() << L"<w14:checked w14:val=\"" + std::to_wstring(current_state_ ? 1 : 0) + L"\"/>";
//Context.output_stream() << L"<w14:checkedState w14:val=\"2612\" w14:font=\"MS Gothic\"/>";
//Context.output_stream() << L"<w14:uncheckedState w14:val=\"2610\" w14:font=\"MS Gothic\"/>";
Context.output_stream() << L"</w14:checkbox>";
}
Context.output_stream() << L"</w:sdtPr>";
Context.output_stream() << L"<w:sdtContent>";
{
Context.add_new_run(L"");
if (current_state_)
Context.output_stream() << L"<w:t>☒</w:t>";
else
Context.output_stream() << L"<w:t>☐</w:t>";
Context.finish_run();
}
Context.output_stream() << L"</w:sdtContent>";
Context.output_stream() << L"</w:sdt>";
if (label_)
{
Context.add_new_run(L"");
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
Context.output_stream() << xml::utils::replace_text_to_xml(*label_ );
Context.output_stream() << L"</w:t>";
Context.finish_run();
}
}
void form_checkbox::docx_convert_field(oox::docx_conversion_context & Context, draw_control *draw)
{
if (!draw) return;
XmlUtils::replace_all( *name_, L" ", L"_");
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"begin\"><w:ffData><w:name w:val=\"" << *name_ << L"\"/><w:enabled/>";
Context.output_stream() << L"<w:label w:val=\"" << xml::utils::replace_text_to_xml(*label_ ) << L"\"/>";
Context.output_stream() << L"<w:checkBox><w:default w:val=\"" << std::to_wstring(current_state_) << L"\"/></w:checkBox></w:ffData>";
Context.output_stream() << L"</w:fldChar></w:r>";
Context.output_stream() << L"<w:r><w:instrText>FORMCHECKBOX</w:instrText></w:r>";
//Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>";
//Context.output_stream() << L"<w:r><w:t>" << xml::utils::replace_text_to_xml(*label_ ) << L"</w:t></w:r>";
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
Context.add_new_run(L"");
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
Context.output_stream() << xml::utils::replace_text_to_xml(*label_ );
Context.output_stream() << L"</w:t>";
Context.finish_run();
}
// form:combobox
//----------------------------------------------------------------------------------
const wchar_t * form_combobox::ns = L"form";
const wchar_t * form_combobox::name = L"combobox";
void form_combobox::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
form_element::add_attributes(Attributes);
}
void form_combobox::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(4);
form_element::docx_convert(Context);
}
// form:listbox
//----------------------------------------------------------------------------------
const wchar_t * form_listbox::ns = L"form";
const wchar_t * form_listbox::name = L"listbox";
void form_listbox::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
form_element::add_attributes(Attributes);
}
void form_listbox::docx_convert(oox::docx_conversion_context & Context)
{
Context.get_forms_context().start_element(5);
form_element::docx_convert(Context);
}
}
}

View File

@ -0,0 +1,402 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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
*
*/
#pragma once
#include <iosfwd>
#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 "datatypes/commandtype.h"
namespace cpdoccore {
namespace odf_reader {
class draw_control;
// office:forms
class office_forms : public office_element_impl<office_forms>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeOfficeForms;
CPDOCCORE_DEFINE_VISITABLE();
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 docx_convert(oox::docx_conversion_context & Context) ;
public:
office_element_ptr_array content_;
_CP_OPT(odf_types::Bool) apply_design_mode_;
_CP_OPT(odf_types::Bool) automatic_focus_;
};
CP_REGISTER_OFFICE_ELEMENT2(office_forms);
// form:form
class form_form : public office_element_impl<form_form>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormForm;
CPDOCCORE_DEFINE_VISITABLE();
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 docx_convert(oox::docx_conversion_context & Context) ;
public:
office_element_ptr_array content_;
office_element_ptr office_event_listeners_;
office_element_ptr properties_;
_CP_OPT(odf_types::Bool) allow_deletes_;
_CP_OPT(odf_types::Bool) allow_inserts_;
_CP_OPT(odf_types::Bool) allow_updates_;
_CP_OPT(odf_types::Bool) apply_filter_;
_CP_OPT(std::wstring) command_;
_CP_OPT(odf_types::command_type) command_type_;
_CP_OPT(std::wstring) control_implementation_;
_CP_OPT(std::wstring) datasource_;
_CP_OPT(std::wstring) detail_fields_;
_CP_OPT(std::wstring) enctype_;
_CP_OPT(odf_types::Bool) escape_processing_;
_CP_OPT(std::wstring) filter_;
_CP_OPT(odf_types::Bool) ignore_result_;
_CP_OPT(std::wstring) master_fields_;
_CP_OPT(std::wstring) method_;
_CP_OPT(std::wstring) name_;
_CP_OPT(std::wstring) navigation_mode_;
_CP_OPT(std::wstring) order_;
_CP_OPT(std::wstring) tabcycle_;
odf_types::common_xlink_attlist xlink_attlist_;
_CP_OPT(std::wstring) office_target_frame_;
};
CP_REGISTER_OFFICE_ELEMENT2(form_form);
// form:properties
class form_properties : public office_element_impl<form_properties>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormProperties;
CPDOCCORE_DEFINE_VISITABLE();
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 docx_convert(oox::docx_conversion_context & Context) ;
public:
office_element_ptr_array content_; //form property && form list-property
};
CP_REGISTER_OFFICE_ELEMENT2(form_properties);
// form:property
class form_property : public office_element_impl<form_property>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormProperty;
CPDOCCORE_DEFINE_VISITABLE();
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:
_CP_OPT(std::wstring) property_name_;
odf_types::common_value_and_type_attlist value_and_type_;
};
CP_REGISTER_OFFICE_ELEMENT2(form_property);
// form:list-property
class form_list_property : public office_element_impl<form_list_property>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormListProperty;
CPDOCCORE_DEFINE_VISITABLE();
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 docx_convert(oox::docx_conversion_context & Context) ;
public:
_CP_OPT(std::wstring) property_name_;
_CP_OPT(odf_types::office_value_type) value_type_;
office_element_ptr_array content_; // form:list-value
};
CP_REGISTER_OFFICE_ELEMENT2(form_list_property);
// form:list-value
class form_list_value : public office_element_impl<form_list_value>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormListValue;
CPDOCCORE_DEFINE_VISITABLE();
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_value_and_type_attlist value_and_type_;
};
CP_REGISTER_OFFICE_ELEMENT2(form_list_value);
//-----------------------------------------------------------------------------------------------------
class form_element : public office_element_impl<form_element>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormElement;
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 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_sdt (oox::docx_conversion_context & Context, draw_control* draw) {}
virtual void docx_convert_field (oox::docx_conversion_context & Context, draw_control* draw) {}
form_element() {}
//CPDOCCORE_DEFINE_VISITABLE();
friend class odf_document;
//----------------------------------------------------------------------------------------------
office_element_ptr office_event_listeners_;
office_element_ptr properties_;
_CP_OPT(std::wstring) control_implementation_;
_CP_OPT(std::wstring) data_field_;
_CP_OPT(std::wstring) linked_cell_;//cell ref
_CP_OPT(odf_types::Bool) disabled_;
_CP_OPT(std::wstring) id_;
_CP_OPT(std::wstring) label_;
_CP_OPT(std::wstring) name_;
_CP_OPT(odf_types::Bool) printable_;
_CP_OPT(unsigned int) tab_index_;
_CP_OPT(odf_types::Bool) tab_stop_;
_CP_OPT(std::wstring) title_;
_CP_OPT(std::wstring) value_;
_CP_OPT(std::wstring) xml_id_;
_CP_OPT(std::wstring) xforms_bind_;
_CP_OPT(std::wstring) current_value_;
};
// form:button
class form_button : public form_element
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormButton;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert(oox::docx_conversion_context & Context) ;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
//form:image-align
//form:image-position
//form:button-type 19.255,
//form:default-button 19.265,
//form:delayfor-repeat
//form:focus-on-click
//form:image-data
//form:repeat
//form:toggle
//form:xforms-submission
//office:target-frame
//xlink:href
};
CP_REGISTER_OFFICE_ELEMENT2(form_button);
// form:text
class form_text : public form_element
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormText;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert (oox::docx_conversion_context & Context) ;
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control* draw);
virtual void docx_convert_field (oox::docx_conversion_context & Context, draw_control* draw);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
//form:convert-empty-to-null
//form:current-value
//form:readonly
//form:max-length
};
CP_REGISTER_OFFICE_ELEMENT2(form_text);
// form:checkbox
class form_checkbox : public form_text
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormCheckbox;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert (oox::docx_conversion_context & Context) ;
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control *draw);
virtual void docx_convert_field (oox::docx_conversion_context & Context, draw_control* draw);
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
bool current_state_;
//form:image-align
//form:image-position
//form:current-state
//form:is-tristate
//form:visual-effect
};
CP_REGISTER_OFFICE_ELEMENT2(form_checkbox);
// form:combobox
class form_combobox : public form_text
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormCombobox;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert (oox::docx_conversion_context & Context) ;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
//form:list-source-type
//form:size
//form:auto-complete
//form:list-source
//form:sourcecell-range
//form:dropdown
};
CP_REGISTER_OFFICE_ELEMENT2(form_combobox);
// form:listbox
class form_listbox : public form_element
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeFormListbox;
CPDOCCORE_DEFINE_VISITABLE();
virtual void docx_convert (oox::docx_conversion_context & Context) ;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
public:
//form:list-source-type
//form:size
//form:list-source
//form:source-cell-range
//form:dropdown
//form:bound-column
//form:xforms-list-source
//form:multiple
//form:listlinkage-type
};
CP_REGISTER_OFFICE_ELEMENT2(form_listbox);
}
}
//<form:connection-resource>7.6.2,
//<form:date> 13.5.8,
//<form:file> 13.5.5,
//<form:fixed-text> 13.5.10,
//<form:form> 13.3,
//<form:formatted-text> 13.5.6,
//<form:frame> 13.5.19,
//<form:generic-control> 13.5.25,
//<form:grid> 13.5.22,
//<form:hidden> 13.5.21,
//<form:image> 13.5.16,
//<form:image-frame> 13.5.20,
//<form:number> 13.5.7,
//<form:password> 13.5.4,
//<form:radio> 13.5.18,
//<form:textarea> 13.5.3,
//<form:time>
//<form:value-range> 13.5.24 and

View File

@ -0,0 +1,111 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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 "office_meta.h"
#include <cpdoccore/xml/xmlchar.h>
#include <cpdoccore/xml/attributes.h>
#include "serialize_elements.h"
namespace cpdoccore {
namespace odf_reader {
// office:meta
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * office_meta::ns = L"office";
const wchar_t * office_meta::name = L"meta";
void office_meta::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
}
void office_meta::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if (Ns==L"meta" && Name == L"generator")
{
CP_CREATE_ELEMENT(meta_generator_);
}
else if (Ns==L"meta" && Name == L"document-statistic")
{
CP_CREATE_ELEMENT(meta_document_statistic_);
}
else if (Ns==L"meta" && Name == L"user-defined")
{
CP_CREATE_ELEMENT(meta_user_defined_);
}
else
{
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * meta_generator::ns = L"meta";
const wchar_t * meta_generator::name = L"generator";
void meta_generator::add_text(const std::wstring & text)
{
content_ = text;
}
// config_item
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * meta_document_statistic::ns = L"meta";
const wchar_t * meta_document_statistic::name = L"document-statistic";
void meta_document_statistic::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"meta:table-count", meta_table_count_);
CP_APPLY_ATTR(L"meta:image-count", meta_image_count_);
CP_APPLY_ATTR(L"meta:object-count", meta_object_count_);
CP_APPLY_ATTR(L"meta:page-count", meta_page_count_);
CP_APPLY_ATTR(L"meta:paragraph-count", meta_paragraph_count_);
CP_APPLY_ATTR(L"meta:word-count", meta_word_count_);
CP_APPLY_ATTR(L"meta:character-count", meta_character_count_);
}
// meta_user_defined
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * meta_user_defined::ns = L"meta";
const wchar_t * meta_user_defined::name = L"user-defined";
void meta_user_defined::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"meta:name", meta_name_, std::wstring(L""));
}
void meta_user_defined::add_text(const std::wstring & text)
{
content_ = text;
}
}
}

View File

@ -0,0 +1,132 @@
/*
* (c) Copyright Ascensio System SIA 2010-2018
*
* 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
*
*/
#pragma once
#include <iosfwd>
#include <cpdoccore/CPOptional.h>
#include <cpdoccore/xml/xmlelement.h>
#include <cpdoccore/xml/nodetype.h>
#include "office_elements.h"
#include "office_elements_create.h"
namespace cpdoccore {
namespace odf_reader {
// office:meta
class office_meta : public office_element_impl<office_meta>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeOfficeMeta;
CPDOCCORE_DEFINE_VISITABLE();
office_element_ptr_array meta_user_defined_;
office_element_ptr meta_generator_;
office_element_ptr meta_document_statistic_;
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){}
};
CP_REGISTER_OFFICE_ELEMENT2(office_meta);
// meta:generator
class meta_generator : public office_element_impl<meta_generator>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeOfficeMetaGenerator;
CPDOCCORE_DEFINE_VISITABLE();
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(meta_generator);
// meta:document-statistic
class meta_document_statistic : public office_element_impl<meta_document_statistic>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeOfficeMetaDocumentStatistic;
CPDOCCORE_DEFINE_VISITABLE();
_CP_OPT(int) meta_table_count_;
_CP_OPT(int) meta_image_count_;
_CP_OPT(int) meta_object_count_;
_CP_OPT(int) meta_page_count_;
_CP_OPT(int) meta_paragraph_count_;
_CP_OPT(int) meta_word_count_;
_CP_OPT(int) meta_character_count_;
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){}
};
CP_REGISTER_OFFICE_ELEMENT2(meta_document_statistic);
// meta:user-defined
class meta_user_defined : public office_element_impl<meta_user_defined>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeOfficeMetaUserDefined;
CPDOCCORE_DEFINE_VISITABLE();
std::wstring meta_name_;
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(meta_user_defined);
}
}

View File

@ -52,7 +52,7 @@ void office_scripts::add_attributes( const xml::attributes_wc_ptr & Attributes )
void office_scripts::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"office", L"script")
CP_CREATE_ELEMENT(office_script_);
CP_CREATE_ELEMENT(content_);
else
CP_NOT_APPLICABLE_ELM();
}

View File

@ -58,7 +58,7 @@ private:
virtual void add_text(const std::wstring & Text);
private:
office_element_ptr_array office_script_;
office_element_ptr_array content_;
// office-event-listeners ?

View File

@ -100,7 +100,11 @@ bool is_text_content(const std::wstring & ns, const std::wstring & name)
void office_text::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if CP_CHECK_NAME(L"text", L"tracked-changes")
if CP_CHECK_NAME(L"office", L"forms")
{
CP_CREATE_ELEMENT(forms_);
}
else if CP_CHECK_NAME(L"text", L"tracked-changes")
{
CP_CREATE_ELEMENT(tracked_changes_);
}
@ -142,7 +146,10 @@ void office_text::docx_convert(oox::docx_conversion_context & Context)
if (tracked_changes_)
tracked_changes_->docx_convert(Context);
Context.start_office_text();
if (forms_)
forms_->docx_convert(Context);
Context.start_office_text();
for (size_t i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);

View File

@ -67,6 +67,7 @@ private:
office_element_ptr user_fields_;
office_element_ptr variables_;
office_element_ptr sequences_;
office_element_ptr forms_;
office_element_ptr_array content_;
};

View File

@ -91,7 +91,7 @@ void paragraph_content_element<ElementT>::docx_serialize_field(const std::wstrin
}
}
template <class ElementT>
void paragraph_content_element<ElementT>::docx_serialize_sdt(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context)
void paragraph_content_element<ElementT>::docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context)
{
std::wostream & strm = Context.output_stream();
Context.finish_run();
@ -101,11 +101,6 @@ void paragraph_content_element<ElementT>::docx_serialize_sdt(const std::wstring
strm << L"\"/><w:temporary/>";
strm << L"<w:showingPlcHdr/><w:text/></w:sdtPr><w:sdtContent>";
//if (!text)
//{
// text = text::create(L"Enter your text here") ;
//}
docx_serialize_run(text, Context);
strm << L"</w:sdtContent></w:sdt>";
@ -153,7 +148,13 @@ void text::docx_convert(oox::docx_conversion_context & Context)
Context.output_stream() << L"<w:del>";
}
}
if (Context.is_table_content())
{
int type = Context.get_table_content_context().get_type_current_level_index();
if (type == 6)
{
}
}
Context.add_element_to_run();
std::wstring textNode = L"w:t";
@ -287,13 +288,25 @@ std::wostream & line_break::text_to_stream(std::wostream & _Wostream) const
_Wostream << std::wstring(L"\r\n");
return _Wostream;
}
void line_break::docx_convert(oox::docx_conversion_context & Context)
{
Context.add_element_to_run();
Context.output_stream() << L"<w:br/>";
}
bool in_drawing = false;
if (Context.get_drawing_context().get_current_shape() || Context.get_drawing_context().get_current_frame())
{
in_drawing = true;
Context.finish_run();
Context.finish_paragraph();
Context.start_paragraph();
}
else
{
Context.add_element_to_run();
Context.output_stream() << L"<w:br/>";
}
}
void line_break::xlsx_convert(oox::xlsx_conversion_context & Context)
{
Context.get_text_context().add_text(L"\n");
@ -307,54 +320,78 @@ void line_break::pptx_convert(oox::pptx_conversion_context & Context)
const wchar_t * bookmark::ns = L"text";
const wchar_t * bookmark::name = L"bookmark";
std::wostream & bookmark::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
void bookmark::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_, std::wstring(L""));
}
std::wostream & bookmark::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * bookmark_start::ns = L"text";
const wchar_t * bookmark_start::name = L"bookmark-start";
void bookmark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", name_, std::wstring(L""));
}
void bookmark_start::docx_convert(oox::docx_conversion_context & Context)
{
Context.start_bookmark(name_);
}
std::wostream & bookmark_start::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
void bookmark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_, std::wstring(L""));
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * bookmark_end::ns = L"text";
const wchar_t * bookmark_end::name = L"bookmark-end";
void bookmark_end::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", name_, std::wstring(L""));
}
void bookmark_end::docx_convert(oox::docx_conversion_context & Context)
{
Context.end_bookmark(name_);
}
std::wostream & bookmark_end::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * bookmark_ref::ns = L"text";
const wchar_t * bookmark_ref::name = L"bookmark-ref";
void bookmark_end::add_attributes( const xml::attributes_wc_ptr & Attributes )
void bookmark_ref::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_, std::wstring(L""));
CP_APPLY_ATTR(L"text:ref-name", ref_name_, std::wstring(L""));
CP_APPLY_ATTR(L"text:reference-format", reference_format_);
}
void bookmark_ref::add_text(const std::wstring & Text)
{
content_ = Text;
}
// text:reference-ref
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * reference_ref::ns = L"text";
const wchar_t * reference_ref::name = L"reference-ref";
void reference_ref::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:ref-name", ref_name_, std::wstring(L""));
CP_APPLY_ATTR(L"text:reference-format", reference_format_);
}
void reference_ref::add_text(const std::wstring & Text)
{
content_ = Text;
}
// text:reference-mark
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * reference_mark::ns = L"text";
const wchar_t * reference_mark::name = L"reference-mark";
std::wostream & reference_mark::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
void reference_mark::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_, std::wstring(L""));
@ -365,11 +402,6 @@ void reference_mark::add_attributes( const xml::attributes_wc_ptr & Attributes )
const wchar_t * reference_mark_start::ns = L"text";
const wchar_t * reference_mark_start::name = L"reference-mark-start";
std::wostream & reference_mark_start::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
void reference_mark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_, std::wstring(L""));
@ -380,16 +412,43 @@ void reference_mark_start::add_attributes( const xml::attributes_wc_ptr & Attrib
const wchar_t * reference_mark_end::ns = L"text";
const wchar_t * reference_mark_end::name = L"reference-mark-end";
std::wostream & reference_mark_end::text_to_stream(std::wostream & _Wostream) const
{
return _Wostream;
}
void reference_mark_end::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_, std::wstring(L""));
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * hidden_paragraph::ns = L"text";
const wchar_t * hidden_paragraph::name = L"hidden-paragraph";
void hidden_paragraph::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:is-hidden", is_hidden_);
CP_APPLY_ATTR(L"text:condition", condition_);
}
void hidden_paragraph::add_text(const std::wstring & Text)
{
content_ = Text;
}
void hidden_paragraph::docx_convert(oox::docx_conversion_context & Context)
{
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * hidden_text::ns = L"text";
const wchar_t * hidden_text::name = L"hidden-text";
void hidden_text::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:is-hidden", is_hidden_);
CP_APPLY_ATTR(L"text:condition", condition_);
CP_APPLY_ATTR(L"text:string-value", string_value_);
}
void hidden_text::add_text(const std::wstring & Text)
{
content_ = Text;
}
void hidden_text::docx_convert(oox::docx_conversion_context & Context)
{
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * span::ns = L"text";
const wchar_t * span::name = L"span";
@ -518,7 +577,7 @@ std::wostream & a::text_to_stream(std::wostream & _Wostream) const
void a::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
CP_APPLY_ATTR(L"office:name", office_name_, std::wstring(L""));
CP_APPLY_ATTR(L"office:target-frame-name", office_target_frame_name_);
@ -539,25 +598,36 @@ void a::add_text(const std::wstring & Text)
void a::docx_convert(oox::docx_conversion_context & Context)
{
bool pushed = false;
bool addNewRun = false;
bool pushed_style = false;
bool addNewRun = false;
Context.finish_run();
style_text_properties_ptr tempStyleTextProp;
std::wostream & _Wostream = Context.output_stream();
std::wstring rId;
rId = Context.add_hyperlink(common_xlink_attlist_.href_.get_value_or(L""), false);
_Wostream << L"<w:hyperlink r:id=\"" << rId << L"\">";
std::wstring ref = xlink_attlist_.href_.get_value_or(L"");
if (Context.is_table_content())
{
_Wostream << L"<w:hyperlink w:anchor=\"" << ref.substr(1) << L"\" w:history=\"1\">"; //без #
int type = Context.get_table_content_context().get_type_current_level_index();
//type == 3 (LinkStart)
Context.get_table_content_context().next_level_index();
}
else
{
std::wstring rId;
rId = Context.add_hyperlink(ref, false);
_Wostream << L"<w:hyperlink r:id=\"" << rId << L"\">";
}
style_instance * styleInst = NULL;
style_text_properties_ptr tempStyleTextProp;
if (!text_style_name_.empty())
styleInst = Context.root()->odf_context().styleContainer().style_by_name(text_style_name_, style_family::Text,Context.process_headers_footers_);
else
styleInst = Context.root()->odf_context().styleContainer().style_by_name(text_style_name_, style_family::Text, Context.process_headers_footers_);
else if (false == Context.is_table_content())
styleInst = Context.root()->odf_context().styleContainer().hyperlink_style();
if (styleInst)
@ -567,7 +637,7 @@ void a::docx_convert(oox::docx_conversion_context & Context)
if (const style_content * styleContent = styleInst->content())
{
Context.push_text_properties(styleContent->get_style_text_properties());
pushed = true;
pushed_style = true;
Context.get_styles_context().start_process_style(styleInst);
Context.add_new_run();
Context.get_styles_context().end_process_style();
@ -576,16 +646,15 @@ void a::docx_convert(oox::docx_conversion_context & Context)
}
else
{
const std::wstring id = Context.styles_map_.get( styleInst->name(), styleInst->type() );
const std::wstring id = Context.styles_map_.get( styleInst->name(), styleInst->type() );
tempStyleTextProp = style_text_properties_ptr( new style_text_properties(id) );
Context.push_text_properties( tempStyleTextProp.get() );
pushed = true;
pushed_style = true;
Context.add_new_run();
addNewRun = true;
}
}
}
if (!addNewRun)
Context.add_new_run();
@ -593,11 +662,15 @@ void a::docx_convert(oox::docx_conversion_context & Context)
for (size_t i = 0; i < content_.size(); i++)
{
content_[i]->docx_convert(Context);
}
if (Context.is_table_content())
{
Context.get_table_content_context().next_level_index();
}
}
Context.finish_run();
if (pushed)
if (pushed_style)
Context.pop_text_properties();
_Wostream << L"</w:hyperlink>";
}
@ -609,7 +682,7 @@ void a::xlsx_convert(oox::xlsx_conversion_context & Context)
{
content_[i]->xlsx_convert(Context);
}
Context.end_hyperlink(common_xlink_attlist_.href_.get_value_or(L""));
Context.end_hyperlink(xlink_attlist_.href_.get_value_or(L""));
}
void a::pptx_convert(oox::pptx_conversion_context & Context)
{
@ -619,7 +692,7 @@ void a::pptx_convert(oox::pptx_conversion_context & Context)
content_[i]->pptx_convert(Context);
}
std::wstring hId = Context.get_slide_context().add_hyperlink(common_xlink_attlist_.href_.get_value_or(L""));
std::wstring hId = Context.get_slide_context().add_hyperlink(xlink_attlist_.href_.get_value_or(L""));
Context.get_text_context().end_hyperlink(hId);
}
@ -890,7 +963,7 @@ void text_placeholder::add_text(const std::wstring & Text)
void text_placeholder::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Click placeholder and overwrite", text_, Context);
docx_serialize_sdt_placeholder(L"Click placeholder and overwrite", text_, Context);
}
void text_placeholder::pptx_convert(oox::pptx_conversion_context & Context)
@ -1126,19 +1199,38 @@ void text_file_name::pptx_convert(oox::pptx_conversion_context & Context)
// Context.get_text_context().end_field();
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sequence_ref::ns = L"text";
const wchar_t * sequence_ref::name = L"sequence-ref";
void sequence_ref::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:ref-name", ref_name_);
CP_APPLY_ATTR(L"text:reference-format", reference_format_);
}
void sequence_ref::add_text(const std::wstring & Text)
{
content_ = Text;
}
void sequence_ref::docx_convert(oox::docx_conversion_context & Context)
{
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sequence::ns = L"text";
const wchar_t * sequence::name = L"sequence";
void sequence::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:num-format", style_num_format_);
CP_APPLY_ATTR(L"style:num-letter-sync", style_num_letter_sync_);
CP_APPLY_ATTR(L"text:formula", text_formula_);
CP_APPLY_ATTR(L"text:ref-name", text_ref_name_);
CP_APPLY_ATTR(L"text:name", text_name_);
}
std::wostream & sequence::text_to_stream(std::wostream & _Wostream) const
{
CP_SERIALIZE_TEXT(text_);
return _Wostream;
}
void sequence::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
}
void sequence::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
CP_CREATE_ELEMENT(text_);
@ -1152,10 +1244,75 @@ void sequence::add_text(const std::wstring & Text)
void sequence::docx_convert(oox::docx_conversion_context & Context)
{
for (size_t i = 0; i < text_.size(); i++)
{
text_[i]->docx_convert(Context);
}
std::wstring ref;
if (text_ref_name_ && text_name_)
{
size_t pos = text_ref_name_->find(L"ref" + *text_name_);
if (pos != std::wstring::npos)
{
ref = *text_name_ + L"!" + text_ref_name_->substr(pos + 3 + text_name_->length()) + L"|sequence";
}
}
if (!ref.empty())
{
Context.start_bookmark(ref);
}
Context.add_new_run();
Context.output_stream() << L"<w:t>" << template_ << L"</w:t>";
Context.finish_run();
std::wstring num_format = L"ARABIC";
if (style_num_format_)
{
switch(style_num_format_->get_type())
{
case odf_types::style_numformat::romanUc: num_format= L"ROMANUC"; break;
case odf_types::style_numformat::romanLc: num_format= L"ROMANLC"; break;
case odf_types::style_numformat::alphaUc: num_format= L"ALPHAUC"; break;
case odf_types::style_numformat::alphaLc: num_format= L"ALPHALC"; break;
case odf_types::style_numformat::arabic:
default:
num_format= L"ARABIC"; break;
}
}
Context.output_stream() << L"<w:fldSimple w:instr=\" SEQ " << template_ << L" \\* " << num_format << L" \">";
Context.add_new_run();
for (size_t i = 0; i < text_.size(); i++)
{
text_[i]->docx_convert(Context);
}
Context.finish_run();
if (!ref.empty())
{
Context.end_bookmark(ref);
}
Context.output_stream() << L"</w:fldSimple>";
//Context.add_new_run();
// Context.output_stream() << L"<w:fldChar w:fldCharType=\"begin\"/>";
//Context.finish_run();
//
//Context.add_new_run();
//Context.output_stream() << L"<w:instrText xml:space=\"preserve\"> SEQ " << template_ << L" \\* ARABIC </w:instrText>";
// Context.finish_run();
//Context.add_new_run();
// Context.output_stream() << L"<w:fldChar w:fldCharType=\"separate\"/>";
//Context.finish_run();
//
//for (size_t i = 0; i < text_.size(); i++)
//{
// text_[i]->docx_convert(Context);
//}
//Context.end_bookmark();
//
//Context.add_new_run();
// Context.output_stream() << L"<w:fldChar w:fldCharType=\"end\"/>";
//Context.finish_run();
}
void sequence::pptx_convert(oox::pptx_conversion_context & Context)
{
@ -1241,7 +1398,7 @@ void sheet_name::add_text(const std::wstring & Text)
}
void sheet_name::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"sheet name", text_, Context);
docx_serialize_sdt_placeholder(L"sheet name", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * author_name::ns = L"text";
@ -1287,7 +1444,7 @@ void sender_city::add_text(const std::wstring & Text)
}
void sender_city::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender city", text_, Context);
docx_serialize_sdt_placeholder(L"Sender city", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sender_email::ns = L"text";
@ -1302,7 +1459,7 @@ void sender_email::add_text(const std::wstring & Text)
}
void sender_email::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender email", text_, Context);
docx_serialize_sdt_placeholder(L"Sender email", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sender_lastname::ns = L"text";
@ -1317,7 +1474,7 @@ void sender_lastname::add_text(const std::wstring & Text)
}
void sender_lastname::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender last name", text_, Context);
docx_serialize_sdt_placeholder(L"Sender last name", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sender_firstname::ns = L"text";
@ -1332,7 +1489,7 @@ void sender_firstname::add_text(const std::wstring & Text)
}
void sender_firstname::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender first name", text_, Context);
docx_serialize_sdt_placeholder(L"Sender first name", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sender_company::ns = L"text";
@ -1347,7 +1504,7 @@ void sender_company::add_text(const std::wstring & Text)
}
void sender_company::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender company", text_, Context);
docx_serialize_sdt_placeholder(L"Sender company", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sender_postal_code::ns = L"text";
@ -1369,7 +1526,7 @@ void sender_postal_code::add_text(const std::wstring & Text)
}
void sender_postal_code::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender postal code", text_, Context);
docx_serialize_sdt_placeholder(L"Sender postal code", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * sender_street::ns = L"text";
@ -1384,7 +1541,7 @@ void sender_street::add_text(const std::wstring & Text)
}
void sender_street::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender street", text_, Context);
docx_serialize_sdt_placeholder(L"Sender street", text_, Context);
}
//------------------------------------------------------------------------------------------------------------
@ -1400,7 +1557,7 @@ void sender_state_or_province::add_text(const std::wstring & Text)
}
void sender_state_or_province::docx_convert(oox::docx_conversion_context & Context)
{
docx_serialize_sdt(L"Sender state or province", text_, Context);
docx_serialize_sdt_placeholder(L"Sender state or province", text_, Context);
}
//---------------------------------------------------------------------------------------------------
const wchar_t * text_user_field_get::ns = L"text";
@ -1423,11 +1580,237 @@ void text_user_field_get::docx_convert(oox::docx_conversion_context & Context)
if (!text_)
{
std::wstring value = Context.get_user_field(*text_name_);
text_ = text::create(value) ;
if (!value.empty())
text_ = text::create(value) ;
}
docx_serialize_run(text_, Context);
}
//---------------------------------------------------------------------------------------------------
const wchar_t * text_user_defined::ns = L"text";
const wchar_t * text_user_defined::name = L"user-defined";
void text_user_defined::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:data-style-name", style_data_style_name_);
CP_APPLY_ATTR(L"text:name", text_name_);
CP_APPLY_ATTR(L"text:fixed", text_fixed_);
office_value_.add_attributes(Attributes);
}
void text_user_defined::add_text(const std::wstring & Text)
{
text_ = text::create(Text) ;//cache
}
void text_user_defined::docx_convert(oox::docx_conversion_context & Context)
{
if (!text_name_) return;
odf_reader::odf_read_context & odfContext = Context.root()->odf_context();
std::wstring value = odfContext.Settings().get_user_defined(*text_name_);
if (!value.empty())
text_ = text::create(value) ;
docx_serialize_run(text_, Context);
}
//-----------------------------------------------------------------------------------------------
// text:bibliography-mark
//-----------------------------------------------------------------------------------------------
const wchar_t * bibliography_mark::ns = L"text";
const wchar_t * bibliography_mark::name = L"bibliography-mark";
void bibliography_mark::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:identifier", identifier_, std::wstring(L""));
CP_APPLY_ATTR(L"text:bibliography-type", bibliography_type_, std::wstring(L""));
CP_APPLY_ATTR(L"text:author", author_);
CP_APPLY_ATTR(L"text:url", url_);
CP_APPLY_ATTR(L"text:title", title_);
CP_APPLY_ATTR(L"text:year", year_);
}
void bibliography_mark::add_text(const std::wstring & Text)
{
office_element_ptr elm = text::create(Text) ;
content_ = elm;
}
std::wostream & bibliography_mark::text_to_stream(std::wostream & _Wostream) const
{
CP_SERIALIZE_TEXT(content_);
return _Wostream;
}
void bibliography_mark::docx_convert(oox::docx_conversion_context & Context)
{
if (content_)
content_->docx_convert(Context);
}
void bibliography_mark::pptx_convert(oox::pptx_conversion_context & Context)
{
if (content_)
content_->pptx_convert(Context);
}
//-----------------------------------------------------------------------------------------------
// text:alphabetical-index-auto-mark-file
//-----------------------------------------------------------------------------------------------
const wchar_t * alphabetical_index_auto_mark_file::ns = L"text";
const wchar_t * alphabetical_index_auto_mark_file::name = L"alphabetical-index-auto-mark-file";
void alphabetical_index_auto_mark_file::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
xlink_attlist_.add_attributes(Attributes);
}
void alphabetical_index_auto_mark_file::docx_convert(oox::docx_conversion_context & Context)
{
}
//-----------------------------------------------------------------------------------------------
// text:alphabetical-index-mark
//-----------------------------------------------------------------------------------------------
const wchar_t * alphabetical_index_mark::ns = L"text";
const wchar_t * alphabetical_index_mark::name = L"alphabetical-index-mark";
void alphabetical_index_mark::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:key1", key1_);
CP_APPLY_ATTR(L"text:key1-phonetic", key1_phonetic_);
CP_APPLY_ATTR(L"text:key2", key2_);
CP_APPLY_ATTR(L"text:key2-phonetic", key2_phonetic_);
CP_APPLY_ATTR(L"text:main-entry", main_entry_);
CP_APPLY_ATTR(L"text:string-value", string_value_);
CP_APPLY_ATTR(L"text:string-value-phonetic", string_value_phonetic_);
}
void alphabetical_index_mark::docx_convert(oox::docx_conversion_context & Context)
{
if (!string_value_) return;
Context.finish_run();
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>";
Context.output_stream() << L"<w:r><w:instrText> XE \"" << *string_value_ << L"\"</w:instrText></w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
}
//-----------------------------------------------------------------------------------------------
// text:alphabetical-index-mark-start
//-----------------------------------------------------------------------------------------------
const wchar_t * alphabetical_index_mark_start::ns = L"text";
const wchar_t * alphabetical_index_mark_start::name = L"alphabetical-index-mark-start";
void alphabetical_index_mark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:id", id_, std::wstring(L""));
CP_APPLY_ATTR(L"text:key1", key1_);
CP_APPLY_ATTR(L"text:key1-phonetic", key1_phonetic_);
CP_APPLY_ATTR(L"text:key2", key2_);
CP_APPLY_ATTR(L"text:key2-phonetic", key2_phonetic_);
CP_APPLY_ATTR(L"text:main-entry", main_entry_);
CP_APPLY_ATTR(L"text:string-value-phonetic", string_value_phonetic_);
}
void alphabetical_index_mark_start::docx_convert(oox::docx_conversion_context & Context)
{
Context.start_alphabetical_index(id_);
}
//-----------------------------------------------------------------------------------------------
// text:alphabetical-index-mark-end
//-----------------------------------------------------------------------------------------------
const wchar_t * alphabetical_index_mark_end::ns = L"text";
const wchar_t * alphabetical_index_mark_end::name = L"alphabetical-index-mark-end";
void alphabetical_index_mark_end::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:id", id_, std::wstring(L""));
}
void alphabetical_index_mark_end::docx_convert(oox::docx_conversion_context & Context)
{
Context.end_alphabetical_index(id_);
}
//-----------------------------------------------------------------------------------------------
// text:user-index-mark
//-----------------------------------------------------------------------------------------------
const wchar_t * user_index_mark::ns = L"text";
const wchar_t * user_index_mark::name = L"user-index-mark";
void user_index_mark::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:index-name", index_name_);
CP_APPLY_ATTR(L"text:outline-level", outline_level_);
CP_APPLY_ATTR(L"text:string-value", string_value_);
}
void user_index_mark::docx_convert(oox::docx_conversion_context & Context)
{
}
//-----------------------------------------------------------------------------------------------
// text:user-index-mark-start
//-----------------------------------------------------------------------------------------------
const wchar_t * user_index_mark_start::ns = L"text";
const wchar_t * user_index_mark_start::name = L"user-index-mark-start";
void user_index_mark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:id", id_, std::wstring(L""));
CP_APPLY_ATTR(L"text:index-name", index_name_);
CP_APPLY_ATTR(L"text:outline-level", outline_level_);
}
void user_index_mark_start::docx_convert(oox::docx_conversion_context & Context)
{
}
//-----------------------------------------------------------------------------------------------
// text:user-index-mark-end
//-----------------------------------------------------------------------------------------------
const wchar_t * user_index_mark_end::ns = L"text";
const wchar_t * user_index_mark_end::name = L"user-index-mark-end";
void user_index_mark_end::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:id", id_, std::wstring(L""));
}
void user_index_mark_end::docx_convert(oox::docx_conversion_context & Context)
{
}
//-----------------------------------------------------------------------------------------------
// text:toc-mark
//-----------------------------------------------------------------------------------------------
const wchar_t * toc_mark::ns = L"text";
const wchar_t * toc_mark::name = L"toc-mark";
void toc_mark::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:outline-level", outline_level_);
CP_APPLY_ATTR(L"text:string-value", string_value_);
}
void toc_mark::docx_convert(oox::docx_conversion_context & Context)
{
}
//-----------------------------------------------------------------------------------------------
// text:toc-mark-start
//-----------------------------------------------------------------------------------------------
const wchar_t * toc_mark_start::ns = L"text";
const wchar_t * toc_mark_start::name = L"toc-mark-start";
void toc_mark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:id", id_, std::wstring(L""));
CP_APPLY_ATTR(L"text:outline-level", outline_level_);
}
void toc_mark_start::docx_convert(oox::docx_conversion_context & Context)
{
}
//-----------------------------------------------------------------------------------------------
// text:toc-mark-end
//-----------------------------------------------------------------------------------------------
const wchar_t * toc_mark_end::ns = L"text";
const wchar_t * toc_mark_end::name = L"toc-mark-end";
void toc_mark_end::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:id", id_, std::wstring(L""));
}
void toc_mark_end::docx_convert(oox::docx_conversion_context & Context)
{
}
//------------------------------------------------------------------------------------------------------------
}//namespace text
//------------------------------------------------------------------------------------------------------------
@ -1446,6 +1829,17 @@ void presentation_date_time::pptx_convert(oox::pptx_conversion_context & Context
{
Context.get_text_context().start_field(oox::date, L"");
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * field_fieldmark_start::ns = L"field";
const wchar_t * field_fieldmark_start::name = L"fieldmark-start";
void field_fieldmark_start::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"text:name", text_name_);
CP_APPLY_ATTR(L"field:type", field_type_);
}
//------------------------------------------------------------------------------------------------------------
const wchar_t * field_fieldmark_end::ns = L"field";
const wchar_t * field_fieldmark_end::name = L"fieldmark-end";
}
}

View File

@ -56,7 +56,7 @@ template <class ElementT>
class paragraph_content_element : public office_element_impl<ElementT>
{
public:
void docx_serialize_sdt(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context);
void docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context);
void docx_serialize_field(const std::wstring & field_name, office_element_ptr & text, oox::docx_conversion_context & Context, bool bLock = false);
void docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context);
};
@ -175,8 +175,6 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
line_break() {};
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) {}
@ -199,17 +197,13 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
bookmark() {}
bookmark(const std::wstring & Name) : text_name_(Name){};
const std::wstring & attr_name() const { return text_name_; }
std::wstring text_name_;
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) {}
std::wstring text_name_;
};
CP_REGISTER_OFFICE_ELEMENT2(bookmark);
@ -226,11 +220,9 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
virtual void docx_convert(oox::docx_conversion_context & Context);
bookmark_start() {}
bookmark_start(const std::wstring & Name) : text_name_(Name){};
std::wstring text_name_;
std::wstring name_;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
@ -238,7 +230,6 @@ private:
virtual void add_text(const std::wstring & Text) {}
};
CP_REGISTER_OFFICE_ELEMENT2(bookmark_start);
//-------------------------------------------------------------------------------------------------------------------
// text:bookmark-end
@ -253,11 +244,9 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
virtual void docx_convert(oox::docx_conversion_context & Context);
bookmark_end() {} ;
bookmark_end(const std::wstring & Name) : text_name_(Name){};
std::wstring text_name_;
std::wstring name_;
private:
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
@ -265,8 +254,53 @@ private:
virtual void add_text(const std::wstring & Text) {}
};
CP_REGISTER_OFFICE_ELEMENT2(bookmark_end);
//-------------------------------------------------------------------------------------------------------------------
// text:bookmark-ref
//-------------------------------------------------------------------------------------------------------------------
class bookmark_ref : public paragraph_content_element<bookmark_ref>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextBookmarkRef;
CPDOCCORE_DEFINE_VISITABLE();
std::wstring ref_name_;
_CP_OPT(std::wstring) reference_format_;
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(bookmark_ref);
//-------------------------------------------------------------------------------------------------------------------
// text:reference-ref
//-------------------------------------------------------------------------------------------------------------------
class reference_ref : public paragraph_content_element<reference_ref>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextReferenceRef;
CPDOCCORE_DEFINE_VISITABLE();
std::wstring ref_name_;
_CP_OPT(std::wstring) reference_format_;
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(reference_ref);
//-------------------------------------------------------------------------------------------------------------------
// text:reference-mark
//-------------------------------------------------------------------------------------------------------------------
@ -279,10 +313,6 @@ public:
static const ElementType type = typeTextReferenceMark;
CPDOCCORE_DEFINE_VISITABLE();
reference_mark() {};
reference_mark(const std::wstring & Name) : text_name_(Name){};
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
std::wstring text_name_;
private:
@ -291,7 +321,6 @@ private:
virtual void add_text(const std::wstring & Text) {}
};
CP_REGISTER_OFFICE_ELEMENT2(reference_mark);
//-------------------------------------------------------------------------------------------------------------------
// text:reference-mark-start
@ -305,10 +334,6 @@ public:
static const ElementType type = typeTextReferenceMarkStart;
CPDOCCORE_DEFINE_VISITABLE();
reference_mark_start() {}
reference_mark_start(const std::wstring & Name) : text_name_(Name){};
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
std::wstring text_name_;
private:
@ -330,11 +355,6 @@ public:
static const ElementType type = typeTextReferenceMarkEnd;
CPDOCCORE_DEFINE_VISITABLE();
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
reference_mark_end() {};
reference_mark_end(const std::wstring & Name) : text_name_(Name){};
std::wstring text_name_;
private:
@ -402,7 +422,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);
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
std::wstring office_name_;
_CP_OPT(odf_types::target_frame_name) office_target_frame_name_;
@ -597,13 +617,13 @@ 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);
_CP_OPT(std::wstring) style_num_format_;
_CP_OPT(odf_types::Bool) style_num_letter_sync_;
_CP_OPT(odf_types::Bool) text_fixed_;
_CP_OPT(int) text_page_adjust_;
_CP_OPT(std::wstring) text_select_page_; //todooo to type
_CP_OPT(odf_types::style_numformat) style_num_format_;
_CP_OPT(odf_types::Bool) style_num_letter_sync_;
_CP_OPT(odf_types::Bool) text_fixed_;
_CP_OPT(int) text_page_adjust_;
_CP_OPT(std::wstring) text_select_page_; //todooo to type
office_element_ptr text_;
office_element_ptr text_;
};
CP_REGISTER_OFFICE_ELEMENT2(text_page_number);
@ -624,8 +644,8 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
_CP_OPT(std::wstring) style_num_format_;
_CP_OPT(odf_types::Bool) style_num_letter_sync_;
_CP_OPT(odf_types::style_numformat) style_num_format_;
_CP_OPT(odf_types::Bool) style_num_letter_sync_;
office_element_ptr text_;
private:
@ -773,7 +793,55 @@ private:
//text:display
};
CP_REGISTER_OFFICE_ELEMENT2(text_file_name);
//-------------------------------------------------------------------------------------------------------------------
// text:hidden-paragraph
//-------------------------------------------------------------------------------------------------------------------
class hidden_paragraph : public paragraph_content_element<hidden_paragraph>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextHiddenParagraph;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(odf_types::Bool) is_hidden_;
_CP_OPT(std::wstring) condition_;
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(hidden_paragraph);
//-------------------------------------------------------------------------------------------------------------------
// text:hidden-text
//-------------------------------------------------------------------------------------------------------------------
class hidden_text : public paragraph_content_element<hidden_text>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextHiddenText;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(odf_types::Bool) is_hidden_;
_CP_OPT(std::wstring) condition_;
_CP_OPT(std::wstring) string_value_;
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(hidden_text);
//-------------------------------------------------------------------------------------------------------------------
// text:sequence
//-------------------------------------------------------------------------------------------------------------------
@ -791,17 +859,46 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
_CP_OPT(odf_types::style_numformat) style_num_format_;
_CP_OPT(std::wstring) style_num_letter_sync_;
_CP_OPT(std::wstring) text_formula_;
_CP_OPT(std::wstring) text_name_;
_CP_OPT(std::wstring) text_ref_name_;
_CP_OPT(std::wstring) template_;
office_element_ptr_array text_;
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);
// todooo attributes
office_element_ptr_array text_;
};
CP_REGISTER_OFFICE_ELEMENT2(sequence);
//-------------------------------------------------------------------------------------------------------------------
// text:sequence_ref
//-------------------------------------------------------------------------------------------------------------------
class sequence_ref : public paragraph_content_element<sequence_ref>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextSequenceRef;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(std::wstring) reference_format_;//caption, category-and-value, value, chapter, direction, page, text, number, number-all-superior, number-no-superior
_CP_OPT(std::wstring) ref_name_;
std::wstring 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);
};
CP_REGISTER_OFFICE_ELEMENT2(sequence_ref);
//-------------------------------------------------------------------------------------------------------------------
//text:drop-down
//-------------------------------------------------------------------------------------------------------------------
class text_drop_down : public paragraph_content_element<text_drop_down>
@ -1120,6 +1217,297 @@ private:
office_element_ptr text_;
};
CP_REGISTER_OFFICE_ELEMENT2(text_user_field_get);
//-------------------------------------------------------------------------------------------------------------------
//text:user-defined
//---------------------------------------------------------------------------------------------------
class text_user_defined : public paragraph_content_element<text_user_defined>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextUserDefined;
CPDOCCORE_DEFINE_VISITABLE()
virtual void docx_convert(oox::docx_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){}
virtual void add_text(const std::wstring & Text);
_CP_OPT(std::wstring) style_data_style_name_;
_CP_OPT(std::wstring) text_name_;
_CP_OPT(odf_types::Bool) text_fixed_;
odf_types::common_value_and_type_attlist office_value_;
office_element_ptr text_;
};
CP_REGISTER_OFFICE_ELEMENT2(text_user_defined);
//---------------------------------------------------------------------------------------------------
//text:bibliography-mark
//---------------------------------------------------------------------------------------------------
class bibliography_mark : public paragraph_content_element<bibliography_mark>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextBibliographyMark;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context) ;
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
std::wstring identifier_;
std::wstring bibliography_type_; // todoooo in datatype
_CP_OPT(std::wstring) url_;
_CP_OPT(std::wstring) author_;
_CP_OPT(std::wstring) title_;
_CP_OPT(std::wstring) year_;
_CP_OPT(std::wstring) isbn_;
_CP_OPT(std::wstring) chapter_;
office_element_ptr 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);
};
CP_REGISTER_OFFICE_ELEMENT2(bibliography_mark);
//---------------------------------------------------------------------------------------------------
//text:alphabetical-index-auto-mark-file
//---------------------------------------------------------------------------------------------------
class alphabetical_index_auto_mark_file : public paragraph_content_element<alphabetical_index_auto_mark_file>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextAlphabeticalIndexAutoMarkFile;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
odf_types::common_xlink_attlist 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){}
};
CP_REGISTER_OFFICE_ELEMENT2(alphabetical_index_auto_mark_file);
//---------------------------------------------------------------------------------------------------
//text:alphabetical-index-mark-start
//---------------------------------------------------------------------------------------------------
class alphabetical_index_mark_start : public paragraph_content_element<alphabetical_index_mark_start>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextAlphabeticalIndexMarkStart;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
std::wstring id_;
_CP_OPT(std::wstring) key1_;
_CP_OPT(std::wstring) key1_phonetic_;
_CP_OPT(std::wstring) key2_;
_CP_OPT(std::wstring) key2_phonetic_;
_CP_OPT(odf_types::Bool) main_entry_;
_CP_OPT(std::wstring) string_value_phonetic_;
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(alphabetical_index_mark_start);
//---------------------------------------------------------------------------------------------------
//text:alphabetical-index-mark-end
//---------------------------------------------------------------------------------------------------
class alphabetical_index_mark_end : public paragraph_content_element<alphabetical_index_mark_end>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextAlphabeticalIndexMarkEnd;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
std::wstring 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){}
};
CP_REGISTER_OFFICE_ELEMENT2(alphabetical_index_mark_end);
//---------------------------------------------------------------------------------------------------
//text:alphabetical-index-mark
//---------------------------------------------------------------------------------------------------
class alphabetical_index_mark : public paragraph_content_element<alphabetical_index_mark>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextAlphabeticalIndexMark;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(std::wstring) key1_;
_CP_OPT(std::wstring) key1_phonetic_;
_CP_OPT(std::wstring) key2_;
_CP_OPT(std::wstring) key2_phonetic_;
_CP_OPT(odf_types::Bool) main_entry_;
_CP_OPT(std::wstring) string_value_;
_CP_OPT(std::wstring) string_value_phonetic_;
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(alphabetical_index_mark);
//---------------------------------------------------------------------------------------------------
//text:user-index-mark-start
//---------------------------------------------------------------------------------------------------
class user_index_mark_start : public paragraph_content_element<user_index_mark_start>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextUserIndexMarkStart;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
std::wstring id_;
_CP_OPT(std::wstring) index_name_;
_CP_OPT(int) outline_level_;
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(user_index_mark_start);
//---------------------------------------------------------------------------------------------------
//text:user-index-mark-end
//---------------------------------------------------------------------------------------------------
class user_index_mark_end : public paragraph_content_element<user_index_mark_end>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextUserIndexMarkEnd;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
std::wstring 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){}
};
CP_REGISTER_OFFICE_ELEMENT2(user_index_mark_end);
//---------------------------------------------------------------------------------------------------
//text:user-index-mark
//---------------------------------------------------------------------------------------------------
class user_index_mark : public paragraph_content_element<user_index_mark>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextUserIndexMark;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(std::wstring) index_name_;
_CP_OPT(int) outline_level_;
_CP_OPT(std::wstring) string_value_;
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(user_index_mark);
//---------------------------------------------------------------------------------------------------
//text:toc-mark-start
//---------------------------------------------------------------------------------------------------
class toc_mark_start : public paragraph_content_element<toc_mark_start>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextTocMarkStart;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(int) outline_level_;
std::wstring 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){}
};
CP_REGISTER_OFFICE_ELEMENT2(toc_mark_start);
//---------------------------------------------------------------------------------------------------
//text:toc-mark-end
//---------------------------------------------------------------------------------------------------
class toc_mark_end : public paragraph_content_element<toc_mark_end>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextTocMarkEnd;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
std::wstring 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){}
};
CP_REGISTER_OFFICE_ELEMENT2(toc_mark_end);
//---------------------------------------------------------------------------------------------------
//text:toc-mark
//---------------------------------------------------------------------------------------------------
class toc_mark : public paragraph_content_element<toc_mark>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextTocMark;
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
_CP_OPT(std::wstring) string_value_;
_CP_OPT(int) outline_level_;
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(toc_mark);
//-------------------------------------------------------------------------------------------------------------------
} // namespace text
//-------------------------------------------------------------------------------------------------------------------
//presentation:footer
@ -1165,5 +1553,44 @@ private:
};
CP_REGISTER_OFFICE_ELEMENT2(presentation_date_time);
//-------------------------------------------------------------------------------------------------------------------
// field:fieldmark-start
//-------------------------------------------------------------------------------------------------------------------
class field_fieldmark_start : public text::paragraph_content_element<field_fieldmark_start>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextFieldFieldmarkStart;
CPDOCCORE_DEFINE_VISITABLE();
_CP_OPT(std::wstring) text_name_;
_CP_OPT(std::wstring) field_type_;
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(field_fieldmark_start);
//-------------------------------------------------------------------------------------------------------------------
// field:fieldmark-end
//-------------------------------------------------------------------------------------------------------------------
class field_fieldmark_end : public text::paragraph_content_element<field_fieldmark_end>
{
public:
static const wchar_t * ns;
static const wchar_t * name;
static const xml::NodeType xml_type = xml::typeElement;
static const ElementType type = typeTextFieldFieldmarkStart;
CPDOCCORE_DEFINE_VISITABLE();
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(field_fieldmark_end);
} // namespace odf_reader
} // namespace cpdoccore

View File

@ -89,22 +89,16 @@ std::wostream & style_tab_stops::text_to_stream(std::wostream & _Wostream) const
return _Wostream;
}
void style_tab_stops::add_attributes( const xml::attributes_wc_ptr & Attributes )
{}
void style_tab_stops::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if (L"style" == Ns && L"tab-stop" == Name)
CP_CREATE_ELEMENT(style_tab_stops_);
CP_CREATE_ELEMENT(content_);
else
{
CP_NOT_APPLICABLE_ELM();
}
}
void style_tab_stops::add_text(const std::wstring & Text)
{}
// style:drop-cap
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * style_drop_cap::ns = L"style";
@ -150,7 +144,7 @@ void style_background_image::add_attributes( const xml::attributes_wc_ptr & Attr
common_xlink_attlist tmp;
if (tmp.add_attributes(Attributes))
{
common_xlink_attlist_ = _CP_OPT(common_xlink_attlist)(tmp);
xlink_attlist_ = _CP_OPT(common_xlink_attlist)(tmp);
}
}
@ -382,12 +376,12 @@ std::wostream & style_paragraph_properties::text_to_stream(std::wostream & _Wost
void style_paragraph_properties::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
style_paragraph_properties_content_.add_attributes(Attributes);
content_.add_attributes(Attributes);
}
void style_paragraph_properties::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
if (!style_paragraph_properties_content_.add_child_element(Reader, Ns, Name, getContext()))
if (!content_.add_child_element(Reader, Ns, Name, getContext()))
CP_NOT_APPLICABLE_ELM();
}
@ -408,14 +402,12 @@ void paragraph_format_properties::apply_from(const paragraph_format_properties &
_CP_APPLY_PROP(fo_widows_, Other.fo_widows_);
_CP_APPLY_PROP(fo_orphans_, Other.fo_orphans_);
// TODO
_CP_APPLY_PROP(style_tab_stops_, Other.style_tab_stops_);
//style_tab_stops_ calc in context
_CP_APPLY_PROP(style_tab_stop_distance_, Other.style_tab_stop_distance_);
_CP_APPLY_PROP(fo_hyphenation_keep_, Other.fo_hyphenation_keep_);
_CP_APPLY_PROP(fo_hyphenation_ladder_count_, Other.fo_hyphenation_ladder_count_);
// TODO
_CP_APPLY_PROP(style_drop_cap_, Other.style_drop_cap_);
_CP_APPLY_PROP(style_register_true_, Other.style_register_true_);

View File

@ -88,6 +88,8 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
void docx_convert(oox::docx_conversion_context & Context);
void docx_convert(oox::docx_conversion_context & Context, bool clear = false);
void pptx_convert(oox::pptx_conversion_context & Context);
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
@ -96,8 +98,8 @@ 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:
odf_types::length style_position_;
public:
odf_types::length style_position_;
_CP_OPT(odf_types::style_type) style_type_;
_CP_OPT(wchar_t) style_char_;
@ -124,20 +126,17 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
size_t size() const { return style_tab_stops_.size(); }
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context);
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
office_element_ptr_array content_;
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);
virtual void add_text(const std::wstring & Text);
virtual void add_text(const std::wstring & Text){}
private:
office_element_ptr_array style_tab_stops_;
};
CP_REGISTER_OFFICE_ELEMENT2(style_tab_stops);
@ -164,7 +163,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);
_CP_OPT(odf_types::common_xlink_attlist) common_xlink_attlist_;
_CP_OPT(odf_types::common_xlink_attlist) xlink_attlist_;
};
@ -191,7 +190,7 @@ public:
_CP_OPT(std::wstring) filter_name_;
_CP_OPT(odf_types::percent) draw_opacity_;
_CP_OPT(odf_types::common_xlink_attlist) common_xlink_attlist_;
_CP_OPT(odf_types::common_xlink_attlist) xlink_attlist_;
office_element_ptr office_binary_data_;
};
@ -212,52 +211,53 @@ public:
void xlsx_convert(std::wostream & strm, bool in_draw);
_CP_OPT(odf_types::line_width) fo_line_height_; // +
_CP_OPT(odf_types::length) style_line_height_at_least_; // +
_CP_OPT(odf_types::length) style_line_spacing_; // +
_CP_OPT(bool) style_font_independent_line_spacing_; // ???
_CP_OPT(odf_types::text_align) fo_text_align_; // +
_CP_OPT(odf_types::text_align) fo_text_align_last_;
_CP_OPT(bool) style_justify_single_word_;
_CP_OPT(odf_types::keep_together) fo_keep_together_; // +
_CP_OPT(unsigned int) fo_widows_; // +
_CP_OPT(unsigned int) fo_orphans_;
office_element_ptr style_tab_stops_; // +
_CP_OPT(odf_types::length) style_tab_stop_distance_;
_CP_OPT(odf_types::hyphenation_keep) fo_hyphenation_keep_;
_CP_OPT(odf_types::integer_or_nolimit) fo_hyphenation_ladder_count_;
office_element_ptr style_drop_cap_;
_CP_OPT(bool) style_register_true_;
_CP_OPT(odf_types::length_or_percent) fo_margin_left_; // +
_CP_OPT(odf_types::length_or_percent) fo_margin_right_; // +
_CP_OPT(odf_types::length_or_percent) fo_text_indent_; // +
_CP_OPT(bool) style_auto_text_indent_; // ???
_CP_OPT(odf_types::length_or_percent) fo_margin_top_; // +
_CP_OPT(odf_types::length_or_percent) fo_margin_bottom_; // +
_CP_OPT(odf_types::length_or_percent) fo_margin_;
_CP_OPT(odf_types::fo_break) fo_break_before_; // +
_CP_OPT(odf_types::fo_break) fo_break_after_;
_CP_OPT(odf_types::background_color) fo_background_color_;
office_element_ptr style_background_image_;
_CP_OPT(odf_types::border_style) fo_border_; // +
_CP_OPT(odf_types::border_style) fo_border_top_; // +
_CP_OPT(odf_types::border_style) fo_border_bottom_; // +
_CP_OPT(odf_types::border_style) fo_border_left_; // +
_CP_OPT(odf_types::border_style) fo_border_right_; // +
_CP_OPT( odf_types::border_widths ) style_border_line_width_; // +
_CP_OPT(odf_types::line_width) fo_line_height_;
_CP_OPT(odf_types::length) style_line_height_at_least_;
_CP_OPT(odf_types::length) style_line_spacing_;
_CP_OPT(bool) style_font_independent_line_spacing_; // ???
_CP_OPT(odf_types::text_align) fo_text_align_;
_CP_OPT(odf_types::text_align) fo_text_align_last_;
_CP_OPT(bool) style_justify_single_word_;
_CP_OPT(odf_types::keep_together) fo_keep_together_;
_CP_OPT(unsigned int) fo_widows_;
_CP_OPT(unsigned int) fo_orphans_;
_CP_OPT(odf_types::length) style_tab_stop_distance_;
_CP_OPT(odf_types::hyphenation_keep) fo_hyphenation_keep_;
_CP_OPT(odf_types::integer_or_nolimit) fo_hyphenation_ladder_count_;
_CP_OPT(bool) style_register_true_;
_CP_OPT(odf_types::length_or_percent) fo_margin_left_;
_CP_OPT(odf_types::length_or_percent) fo_margin_right_;
_CP_OPT(odf_types::length_or_percent) fo_text_indent_;
_CP_OPT(bool) style_auto_text_indent_; // ???
_CP_OPT(odf_types::length_or_percent) fo_margin_top_;
_CP_OPT(odf_types::length_or_percent) fo_margin_bottom_;
_CP_OPT(odf_types::length_or_percent) fo_margin_;
_CP_OPT(odf_types::fo_break) fo_break_before_;
_CP_OPT(odf_types::fo_break) fo_break_after_;
_CP_OPT(odf_types::background_color) fo_background_color_;
_CP_OPT( odf_types::border_widths ) style_border_line_width_top_; // +
_CP_OPT( odf_types::border_widths ) style_border_line_width_bottom_;// +
_CP_OPT( odf_types::border_widths ) style_border_line_width_left_; // +
_CP_OPT( odf_types::border_widths ) style_border_line_width_right_; // +
office_element_ptr style_background_image_;
office_element_ptr style_drop_cap_;
office_element_ptr style_tab_stops_;
_CP_OPT(odf_types::length) fo_padding_; // +
_CP_OPT(odf_types::length) fo_padding_top_; // +
_CP_OPT(odf_types::length) fo_padding_bottom_; // +
_CP_OPT(odf_types::length) fo_padding_left_; // +
_CP_OPT(odf_types::length) fo_padding_right_; // +
_CP_OPT(odf_types::border_style) fo_border_;
_CP_OPT(odf_types::border_style) fo_border_top_;
_CP_OPT(odf_types::border_style) fo_border_bottom_;
_CP_OPT(odf_types::border_style) fo_border_left_;
_CP_OPT(odf_types::border_style) fo_border_right_;
_CP_OPT( odf_types::border_widths ) style_border_line_width_;
_CP_OPT( odf_types::border_widths ) style_border_line_width_top_;
_CP_OPT( odf_types::border_widths ) style_border_line_width_bottom_;
_CP_OPT( odf_types::border_widths ) style_border_line_width_left_;
_CP_OPT( odf_types::border_widths ) style_border_line_width_right_;
_CP_OPT(odf_types::length) fo_padding_;
_CP_OPT(odf_types::length) fo_padding_top_;
_CP_OPT(odf_types::length) fo_padding_bottom_;
_CP_OPT(odf_types::length) fo_padding_left_;
_CP_OPT(odf_types::length) fo_padding_right_;
_CP_OPT(odf_types::shadow_type) style_shadow_;
_CP_OPT(odf_types::keep_together) fo_keep_with_next_;
_CP_OPT(bool) text_number_lines_;
@ -289,7 +289,7 @@ public:
void docx_convert(oox::docx_conversion_context & Context);
void pptx_convert(oox::pptx_conversion_context & Context);
const paragraph_format_properties & content() const { return style_paragraph_properties_content_; }
paragraph_format_properties content_;
public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
@ -301,7 +301,6 @@ private:
private:
paragraph_format_properties style_paragraph_properties_content_;
};

View File

@ -415,131 +415,106 @@ void paragraph_format_properties::docx_convert(oox::docx_conversion_context & Co
Context.set_page_break_after(true);
}
}
if (style_tab_stops_)
style_tab_stops_->docx_convert(Context);
Context.get_tabs_context().docx_convert(Context);
//if (style_tab_stops_)
//{
// style_tab_stops_->docx_convert(Context);
//}
}
void style_tab_stops::docx_convert(oox::docx_conversion_context & Context)
{
if (style_tab_stops_.size()<1)return;
if (content_.empty()) return;
std::wstringstream & _pPr = Context.get_styles_context().paragraph_nodes();
_pPr << L"<w:tabs>";
if (style_tab_stops_.size() > 0)
{
for (size_t i = 0; i < style_tab_stops_.size(); i++)
for (size_t i = 0; i < content_.size(); i++)
{
style_tab_stops_[i]->docx_convert(Context);
content_[i]->docx_convert(Context);
}
}
_pPr << L"</w:tabs>";
}
void style_tab_stop::docx_convert(oox::docx_conversion_context & Context)
void style_tab_stop::docx_convert(oox::docx_conversion_context & Context, bool clear)
{
std::wstringstream & _pPr = Context.get_styles_context().paragraph_nodes();
_pPr << L"<w:tab ";
_pPr << L"<w:tab";
length def_tab = length(1.0, length::cm);// в ms значение 0.8 не корректно оО
int tab_pos = (int)( 20.0 * style_position_.get_value_unit(length::pt) ) ;
int min_tab_pos = (int)( 20.0 * def_tab.get_value_unit(length::pt) ) ;
int margin_left_pos = Context.get_margin_left();
if ((style_type_) && (style_type_->get_type() == style_type::Right))
{
tab_pos += margin_left_pos;
}
tab_pos += margin_left_pos;
if (tab_pos < min_tab_pos)
tab_pos = min_tab_pos;
_pPr << L"w:pos=\"" << tab_pos << "\" ";
{
std::wstring val = L"left"; //????
if (style_type_)
{
switch(style_type_->get_type())
{
case style_type::Left:
val = L"left";
break;
case style_type::Center:
val = L"center";
break;
case style_type::Right:
val = L"right";
break;
case style_type::Char:
val = L"decimal";
break;
}
}
if (!val.empty())
_pPr << L"w:val=\"" << val << "\" ";
}
{
std::wstring leader;
std::wstring val = clear ? L"clear" : L"left"; //????
if (style_type_ && !clear)
{
switch(style_type_->get_type())
{
case style_type::Left: val = L"left"; break;
case style_type::Center:val = L"center"; break;
case style_type::Right: val = L"right"; break;
case style_type::Char: val = L"decimal"; break;
}
}
_pPr << L" w:val=\"" << val << "\"";
_pPr << L" w:pos=\"" << tab_pos << "\"";
std::wstring leader;
if ((style_leader_type_ && style_leader_type_->get_type() == line_type::None) ||
(style_leader_style_ && style_leader_style_->get_type() == line_style::None))
{
leader = L"none";
}
else if (!style_leader_type_ || style_leader_type_ && style_leader_type_->get_type() != line_type::None)
{
if (style_leader_style_)
{
switch(style_leader_style_->get_type())
{
case line_style::None:
leader = L"";
break;
case line_style::Solid:
if (style_leader_text_)
{
if (*style_leader_text_ == L"-")
leader = L"hyphen";
else if (*style_leader_text_ == L"_")
leader = L"underscore";
}
break;
case line_style::Dotted:
leader = L"dot";
break;
case line_style::Dash:
leader = L"hyphen";
break;
case line_style::LongDash:
leader = L"middleDot";
break;
case line_style::DotDash:
leader = L"middleDot";
break;
case line_style::DotDotDash:
leader = L"middleDot";
break;
case line_style::Wave:
leader = L"middleDot";
break;
}
}
}
if (!leader.empty())
_pPr << L"w:leader=\"" << leader << "\" ";
}
_pPr << L" />";
if ((style_leader_type_ && style_leader_type_->get_type() == line_type::None) ||
(style_leader_style_ && style_leader_style_->get_type() == line_style::None))
{
leader = L"none";
}
else if (!style_leader_type_ || style_leader_type_ && style_leader_type_->get_type() != line_type::None)
{
if (style_leader_style_)
{
switch(style_leader_style_->get_type())
{
case line_style::None: leader.clear(); break;
case line_style::Solid:
{
if (style_leader_text_)
{
if (*style_leader_text_ == L"-")
leader = L"hyphen";
else if (*style_leader_text_ == L"_")
leader = L"underscore";
}
}break;
case line_style::Dotted: leader = L"dot"; break;
case line_style::Dash: leader = L"hyphen"; break;
case line_style::LongDash: leader = L"middleDot"; break;
case line_style::DotDash: leader = L"middleDot"; break;
case line_style::DotDotDash: leader = L"middleDot"; break;
case line_style::Wave: leader = L"middleDot"; break;
}
}
}
if (!clear && !leader.empty())
{
_pPr << L" w:leader=\"" << leader << "\"";
}
_pPr << L"/>";
}
void style_tab_stop::docx_convert(oox::docx_conversion_context & Context)
{
docx_convert(Context, false);
}
void style_paragraph_properties::docx_convert(oox::docx_conversion_context & Context)
{
style_paragraph_properties_content_.docx_convert(Context);
content_.docx_convert(Context);
}

View File

@ -635,7 +635,7 @@ void style_tab_stop::pptx_convert(oox::pptx_conversion_context & Context)
void style_paragraph_properties::pptx_convert(oox::pptx_conversion_context & Context)
{
style_paragraph_properties_content_.pptx_convert(Context);
content_.pptx_convert(Context);
}

View File

@ -90,7 +90,7 @@ const wchar_t * presentation_sound::name = L"sound";
void presentation_sound::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
void presentation_sound::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
@ -100,7 +100,7 @@ void presentation_sound::add_child_element( xml::sax * Reader, const std::wstrin
void presentation_sound::pptx_convert(oox::pptx_conversion_context & Context)
{
Context.get_slide_context().set_link(common_xlink_attlist_.href_.get_value_or(L""), oox::typeAudio);
Context.get_slide_context().set_link(xlink_attlist_.href_.get_value_or(L""), oox::typeAudio);
}
//-------------------------------------------------------------------------------------------------
const wchar_t * style_drawing_page_properties::ns = L"style";

View File

@ -87,7 +87,7 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist 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);

View File

@ -207,10 +207,9 @@ void style_table_column_properties::docx_convert(oox::docx_conversion_context &
{
std::wostream & strm = Context.output_stream();
if (attlist_.style_column_width_)
{
double kf_max_width_ms =1.;
double kf_max_width_ms = 1.;
const page_layout_instance * pp = Context.root()->odf_context().pageLayoutContainer().page_layout_first();//
if ((pp) && (pp->properties()))
@ -226,17 +225,15 @@ void style_table_column_properties::docx_convert(oox::docx_conversion_context &
int val = attlist_.style_column_width_->get_value_unit(length::pt);
double width = 0.5 + 20.0 * val * kf_max_width_ms;
//_CP_OPT(int) iUnormalWidth;
//if (odf_reader::GetProperty(Context.get_settings_properties(),L"UnormalWidthPage",iUnormalWidth))
{
//kf_max_width_ms = 31680./iUnormalWidth.get();//эквивалент 22"
}
strm << L"<w:gridCol w:w=\"" <<
(int)(0.5 + 20.0 * val * kf_max_width_ms) << "\"/>";
Context.get_table_context().add_column_width(width);
strm << L"<w:gridCol w:w=\"" << (int)(width) << "\"/>";
}
else
{
Context.get_table_context().add_column_width(0);
}
}
@ -244,7 +241,6 @@ void style_table_column_properties::pptx_convert(oox::pptx_conversion_context &
{
std::wostream & strm = Context.get_table_context().tableData();
if (attlist_.style_column_width_)
{
int val = attlist_.style_column_width_->get_value_unit(length::emu);

View File

@ -303,7 +303,7 @@ void default_style::add_attributes( const xml::attributes_wc_ptr & Attributes )
void default_style::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
{
style_content_.add_child_element(Reader, Ns, Name, getContext());
content_.add_child_element(Reader, Ns, Name, getContext());
}
void default_style::add_text(const std::wstring & Text)
@ -433,7 +433,7 @@ void style::add_child_element( xml::sax * Reader, const std::wstring & Ns, const
CP_CREATE_ELEMENT(style_map_);
}
else
style_content_.add_child_element(Reader, Ns, Name, getContext());
content_.add_child_element(Reader, Ns, Name, getContext());
}
void style::add_text(const std::wstring & Text)
@ -853,11 +853,6 @@ void style_footer_style::add_child_element( xml::sax * Reader, const std::wstrin
}
}
void style_page_layout_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
CP_APPLY_ATTR(L"style:name", style_name_, std::wstring(L""));
CP_APPLY_ATTR(L"style:page-usage", style_page_usage_, page_usage(page_usage::All));
}
//////////////////////////////////////////////////////////////////////////////////////////////////
const wchar_t * style_page_layout::ns = L"style";
@ -870,7 +865,8 @@ std::wostream & style_page_layout::text_to_stream(std::wostream & _Wostream) con
void style_page_layout::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
attlist_.add_attributes(Attributes);
CP_APPLY_ATTR(L"style:name", style_name_, std::wstring(L""));
CP_APPLY_ATTR(L"style:page-usage", style_page_usage_, page_usage(page_usage::All));
}
void style_page_layout::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)

View File

@ -136,7 +136,7 @@ public:
odf_types::style_family style_family_;
style_content style_content_;
style_content content_;
friend class odf_document;
@ -251,6 +251,7 @@ private:
};
CP_REGISTER_OFFICE_ELEMENT2(draw_opacity);
// style_draw_fill_image
class draw_fill_image : public office_element_impl<draw_fill_image>
{
@ -281,7 +282,6 @@ typedef weak_ptr<style>::Type style_weak_ptr;
typedef std::vector< style_weak_ptr > style_weak_ptr_array;
typedef std::vector< style_ptr > style_ptr_array;
// style
/// style:style
class style : public office_element_impl<style>
{
@ -302,7 +302,6 @@ private:
virtual void add_text(const std::wstring & Text);
public:
// attr
std::wstring style_name_;
bool style_auto_update_; // default = false
@ -317,7 +316,7 @@ public:
_CP_OPT( std::wstring ) style_class_;
_CP_OPT( std::wstring ) style_default_outline_level_;
style_content style_content_;
style_content content_;
office_element_ptr_array style_map_;
friend class odf_document;
@ -776,18 +775,6 @@ public:
CP_REGISTER_OFFICE_ELEMENT2(style_section_properties);
/// style-page-layout-attlist
class style_page_layout_attlist
{
public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
const std::wstring & get_style_name() const { return style_name_; }
std::wstring style_name_;
odf_types::page_usage style_page_usage_; // default All
};
/// style:header-style
class style_header_style : public office_element_impl<style_header_style>
{
@ -842,7 +829,8 @@ public:
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const;
style_page_layout_attlist attlist_;
std::wstring style_name_;
odf_types::page_usage style_page_usage_; // default All
office_element_ptr style_page_layout_properties_;
office_element_ptr style_header_style_;

View File

@ -117,7 +117,7 @@ void text_list_level_style_bullet_attr::add_attributes( const xml::attributes_wc
void text_list_level_style_image_attr::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
}
@ -244,22 +244,6 @@ void text_list_level_style_bullet::add_child_element( xml::sax * Reader, const s
namespace {
std::wstring GetNumFormat(const std::wstring & Format)
{
if (L"1" == Format)
return L"decimal";
else if (L"i" == Format)
return L"lowerRoman";
else if (L"I" == Format)
return L"upperRoman";
else if (L"a" == Format)
return L"lowerLetter";
else if (L"A" == Format)
return L"upperLetter";
else
return L"decimal";
}
std::wstring GetLevelText(unsigned int displayLevels,
unsigned int textLevel,
oox::docx_conversion_context & Context)
@ -356,7 +340,21 @@ void text_list_level_style_number::docx_convert(oox::docx_conversion_context & C
}
CP_XML_NODE(L"w:numFmt")
{
CP_XML_ATTR(L"w:val",GetNumFormat( text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_.get_value_or(L"") ));
std::wstring num_format = L"arabic";
if (text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_)
{
switch(text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_->get_type())
{
case odf_types::style_numformat::romanUc: num_format= L"upperRoman"; break;
case odf_types::style_numformat::romanLc: num_format= L"lowerRoman"; break;
case odf_types::style_numformat::alphaUc: num_format= L"upperLetter"; break;
case odf_types::style_numformat::alphaLc: num_format= L"lowerLetter"; break;
case odf_types::style_numformat::arabic:
default:
num_format= L"decimal"; break;
}
}
CP_XML_ATTR(L"w:val", num_format);
}
CP_XML_NODE(L"w:suff")
{
@ -477,19 +475,17 @@ void text_list_level_style_number::pptx_convert(oox::pptx_conversion_context & C
if (text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_)
{
if (*text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_ == L"1")
num_format= L"arabic";
else if (*text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_ == L"I")
num_format= L"romanUc";
else if (*text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_ == L"i")
num_format= L"romanLc";
else if (*text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_ == L"A")
num_format= L"alphaUc";
else if (*text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_ == L"a")
num_format= L"alphaLc";
else
num_format= L"arabic";
}else num_format= L"arabic";
switch(text_list_level_style_number_attr_.common_num_format_attlist_.style_num_format_->get_type())
{
case odf_types::style_numformat::romanUc: num_format= L"romanUc"; break;
case odf_types::style_numformat::romanLc: num_format= L"romanLc"; break;
case odf_types::style_numformat::alphaUc: num_format= L"alphaUc"; break;
case odf_types::style_numformat::alphaLc: num_format= L"alphaLc"; break;
case odf_types::style_numformat::arabic:
default:
num_format= L"arabic"; break;
}
}
if (text_list_level_style_number_attr_.common_num_format_prefix_suffix_attlist_.style_num_prefix_)
{

View File

@ -256,7 +256,7 @@ public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
private:
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
friend class text_list_level_style_image;

View File

@ -113,6 +113,8 @@ public:
bool inViewTable;
bool inView;
std::map<std::wstring, std::wstring> map_user_defineds;
};
settings_container::settings_container(): impl_(new settings_container::Impl() )
@ -264,6 +266,16 @@ _CP_OPT(std::wstring) settings_container::find_view_by_name(const std::wstring &
}
return value;
}
void settings_container::add_user_defined(const std::wstring & name, const std::wstring & value)
{
impl_->map_user_defineds.insert(std::make_pair(name, value));
}
std::wstring settings_container::get_user_defined(const std::wstring & name)
{
std::map<std::wstring, std::wstring>::iterator pFind = impl_->map_user_defineds.find(name);
return pFind != impl_->map_user_defineds.end() ? pFind->second : L"";
}
}
}

View File

@ -79,6 +79,9 @@ public:
void end_table_view ();
void add_view (const std::wstring & name, const std::wstring & value);
void add_user_defined(const std::wstring & name, const std::wstring & value);
std::wstring get_user_defined(const std::wstring & name);
private:
class Impl;
_CP_SCOPED_PTR(Impl) impl_;

View File

@ -112,7 +112,7 @@ void table_table_source_attlist::add_attributes( const xml::attributes_wc_ptr &
void table_linked_source_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes )
{
common_xlink_attlist_.add_attributes(Attributes);
xlink_attlist_.add_attributes(Attributes);
CP_APPLY_ATTR(L"table:filter-name", table_filter_name_);
CP_APPLY_ATTR(L"table:filter-options", table_filter_options_);
@ -162,7 +162,8 @@ void table_table::add_child_element( xml::sax * Reader, const std::wstring & Ns,
else if ((L"table" == Ns && L"table-row-group" == Name) ||
(L"table" == Ns && L"table-rows" == Name) ||
(L"table" == Ns && L"table-row" == Name) ||
(L"table" == Ns && L"table-header-rows" == Name))
(L"table" == Ns && L"table-header-rows" == Name)||
(L"text" == Ns && L"soft-page-break" == Name))
{
table_rows_and_groups_.add_child_element(Reader, Ns, Name, getContext());
}
@ -533,7 +534,8 @@ void table_rows::add_child_element( xml::sax * Reader, const std::wstring & Ns,
{
CP_CREATE_ELEMENT_SIMPLE(table_table_rows_);
}
else if CP_CHECK_NAME(L"table", L"table-row")
else if (CP_CHECK_NAME(L"table", L"table-row") || CP_CHECK_NAME(L"text", L"soft-page-break"))
{
CP_CREATE_ELEMENT_SIMPLE(table_table_row_);
}
@ -605,7 +607,8 @@ void table_rows_no_group::add_child_element( xml::sax * Reader, const std::wstri
}
void table_rows_no_group::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name, document_context * Context)
{
if (CP_CHECK_NAME(L"table", L"table-rows") || CP_CHECK_NAME(L"table", L"table-row"))
if (CP_CHECK_NAME(L"table", L"table-rows") || CP_CHECK_NAME(L"table", L"table-row") ||
CP_CHECK_NAME(L"text", L"soft-page-break"))
{
if (!was_header_)
table_rows_1_.add_child_element(Reader, Ns, Name, Context);
@ -639,7 +642,8 @@ void table_rows_and_groups::add_child_element( xml::sax * Reader, const std::wst
{
CP_CREATE_ELEMENT_SIMPLE(content_);
}
else if (L"table" == Ns && (L"table-rows" == Name || L"table-row" == Name || L"table-header-rows" == Name) )
else if ((L"table" == Ns && (L"table-rows" == Name || L"table-row" == Name || L"table-header-rows" == Name)) ||
(L"text" == Ns && L"soft-page-break" == Name))
{
bool add_new_no_group = false;
if (content_.empty()) add_new_no_group = true;

View File

@ -130,7 +130,7 @@ class table_linked_source_attlist
public:
void add_attributes( const xml::attributes_wc_ptr & Attributes );
odf_types::common_xlink_attlist common_xlink_attlist_;
odf_types::common_xlink_attlist xlink_attlist_;
_CP_OPT(std::wstring) table_filter_name_;
_CP_OPT(std::wstring) table_filter_options_;

View File

@ -238,16 +238,24 @@ void table_table_column::docx_convert(oox::docx_conversion_context & Context)
for (unsigned int i = 0; i < columnsRepeated; ++i)
{
bool bAddWidth = false;
if (table_table_column_attlist_.table_style_name_)
{
const std::wstring colStyleName = table_table_column_attlist_.table_style_name_.get();
if (style_instance * inst =
Context.root()->odf_context().styleContainer().style_by_name( colStyleName , style_family::TableColumn,Context.process_headers_footers_ ))
Context.root()->odf_context().styleContainer().style_by_name( colStyleName , style_family::TableColumn, Context.process_headers_footers_ ))
{
if (inst->content())
{
inst->content()->docx_convert(Context);
bAddWidth = true;
}
}
}
if (false == bAddWidth)
{
Context.get_table_context().add_column_width(0);
}
}
}
@ -266,22 +274,27 @@ void table_table_cell::docx_convert(oox::docx_conversion_context & Context)
_Wostream << L"<w:tcPr>";
const std::wstring styleName = attlist_.table_style_name_.get_value_or(L"");
//_Wostream << L"<w:tcW w:w=\"0\" w:type=\"auto\" />";
if (attlist_extra_.table_number_rows_spanned_ > 1)
{
_Wostream << L"<w:vMerge w:val=\"restart\" />";
_Wostream << L"<w:vMerge w:val=\"restart\"/>";
Context.get_table_context().set_rows_spanned(Context.get_table_context().current_column(),
attlist_extra_.table_number_rows_spanned_ - 1,
attlist_extra_.table_number_columns_spanned_ - 1,
styleName
);
}
double width = Context.get_table_context().get_current_cell_width();
if (width > 0.01)
{
_Wostream << L"<w:tcW w:w=\"" << (int)width << L"\" w:type=\"dxa\"/>";
}
if (attlist_extra_.table_number_columns_spanned_ > 1)
{
_Wostream << L"<w:gridSpan w:val=\"" << attlist_extra_.table_number_columns_spanned_ << "\" />";
_Wostream << L"<w:gridSpan w:val=\"" << attlist_extra_.table_number_columns_spanned_ << "\"/>";
Context.get_table_context().set_columns_spanned(attlist_extra_.table_number_columns_spanned_ - 1);
}
@ -324,8 +337,7 @@ void table_table_cell::docx_convert(oox::docx_conversion_context & Context)
/// Стиль по умолчанию для данной строки
{
const std::wstring & defaultCellStyle =
Context.get_table_context().get_default_cell_style_row();
const std::wstring & defaultCellStyle = Context.get_table_context().get_default_cell_style_row();
if (const style_instance * inst =
Context.root()->odf_context().styleContainer().style_by_name(defaultCellStyle, style_family::TableCell,Context.process_headers_footers_))

View File

@ -328,7 +328,7 @@ void table_table::xlsx_convert(oox::xlsx_conversion_context & Context)
table_table_source* table_source = dynamic_cast<table_table_source*>( table_table_source_.get() );
if ( table_source)
{
if (table_source->table_linked_source_attlist_.common_xlink_attlist_.href_)return;
if (table_source->table_linked_source_attlist_.xlink_attlist_.href_)return;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -99,6 +99,7 @@ namespace
case XmlUtils::XmlNodeType_DocumentType:
return typeDocumentType;
case XmlUtils::XmlNodeType_Whitespace:
case XmlUtils::XmlNodeType_SIGNIFICANT_WHITESPACE:
return typeWhitespace;
case XmlUtils::XmlNodeType_EndElement:
return typeEndElement;

View File

@ -353,6 +353,10 @@
RelativePath="..\src\odf\datatypes\calcext_type.cpp"
>
</File>
<File
RelativePath="..\src\odf\datatypes\calcext_type.h"
>
</File>
<File
RelativePath="..\src\odf\datatypes\chartdatalabelnumber.cpp"
>
@ -441,6 +445,14 @@
RelativePath="..\src\odf\datatypes\color.h"
>
</File>
<File
RelativePath="..\src\odf\datatypes\commandtype.cpp"
>
</File>
<File
RelativePath="..\src\odf\datatypes\commandtype.h"
>
</File>
<File
RelativePath="..\src\odf\datatypes\common_attlists.cpp"
>
@ -853,6 +865,14 @@
RelativePath="..\src\odf\datatypes\styleleadercolor.h"
>
</File>
<File
RelativePath="..\src\odf\datatypes\stylenumformat.cpp"
>
</File>
<File
RelativePath="..\src\odf\datatypes\stylenumformat.h"
>
</File>
<File
RelativePath="..\src\odf\datatypes\styleposition.cpp"
>

View File

@ -1583,6 +1583,22 @@
RelativePath="..\src\odf\office_event_listeners.h"
>
</File>
<File
RelativePath="..\src\odf\office_forms.cpp"
>
</File>
<File
RelativePath="..\src\odf\office_forms.h"
>
</File>
<File
RelativePath="..\src\odf\office_meta.cpp"
>
</File>
<File
RelativePath="..\src\odf\office_meta.h"
>
</File>
<File
RelativePath="..\src\odf\office_presentation.cpp"
>

View File

@ -250,13 +250,13 @@ int odf_lists_styles_context::start_style_level(int level, int type)
int odf_type =1;
int format_type = -1;
std::wstring num_format = L"1";
style_numformat num_format;
bool sync_letter = false;
switch(type)
{
case 0: //numberformatAiueo :
case 1: //numberformatAiueoFullWidth :
num_format = L"ア, イ, ウ, ...";
num_format = style_numformat(style_numformat::aiueo);
break;
case 2: //numberformatArabicAbjad :
break;
@ -272,19 +272,19 @@ int odf_lists_styles_context::start_style_level(int level, int type)
case 7: //numberformatChicago :
break;
case 8: //numberformatChineseCounting :
num_format = L"イ, ロ, ハ, ...";
num_format = style_numformat(style_numformat::chineseCounting);
break;
case 9: //numberformatChineseCountingThousand :
break;
case 10: //numberformatChineseLegalSimplified :
num_format = L"一, 二, 三, ...";
num_format = style_numformat(style_numformat::chineseLegal);
break;
case 11: //numberformatChosung :
break;
case 12: //numberformatCustom :
break;
case 13: //numberformatDecimal :
num_format = L"1";
num_format = style_numformat(style_numformat::arabic);
break;
case 14: //numberformatDecimalEnclosedCircle :
break;
@ -326,19 +326,19 @@ int odf_lists_styles_context::start_style_level(int level, int type)
case 32: //numberformatIdeographEnclosedCircle :
break;
case 33: //numberformatIdeographLegalTraditional :
num_format = L"壹, 貳, 參, ...";
num_format = style_numformat(style_numformat::ideographLegal);
break;
case 34: //numberformatIdeographTraditional :
num_format = L"甲, 乙, 丙, ...";
num_format = style_numformat(style_numformat::ideographTraditional);
break;
case 35: //numberformatIdeographZodiac :
num_format = L"子, 丑, 寅, ...";
num_format = style_numformat(style_numformat::ideographZodiac);
break;
case 36: //numberformatIdeographZodiacTraditional :
num_format = L"甲子, 乙丑, 丙寅, ...";
num_format = style_numformat(style_numformat::ideographZodiacTraditional);
break;
case 37: //numberformatIroha :
num_format = L"イ, ロ, ハ, ...";
num_format = style_numformat(style_numformat::iroha);
break;
case 38: //numberformatIrohaFullWidth :
break;
@ -350,21 +350,21 @@ int odf_lists_styles_context::start_style_level(int level, int type)
break;
case 42: //numberformatKoreanCounting :
case 43: //numberformatKoreanDigital :
num_format = L"일, 이, 삼, ...";
num_format = style_numformat(style_numformat::koreanDigital);
break;
case 44: //numberformatKoreanDigital2 :
break;
case 45: //numberformatKoreanLegal :
break;
case 46: //numberformatLowerLetter
num_format = L"a";
num_format = style_numformat(style_numformat::alphaLc);
sync_letter = true;
break;
case 47: //numberformatLowerRoman :
num_format = L"i";
num_format = style_numformat(style_numformat::romanLc);
break;
case 48: //numberformatNone :
num_format = L"";
//num_format = L"";
break;
case 49: //numberformatNumberInDash : //??
//suffix -
@ -375,11 +375,11 @@ int odf_lists_styles_context::start_style_level(int level, int type)
case 51: //numberformatOrdinalText :
break;
case 52: //numberformatRussianLower :
num_format = L"А, Б, .., Аа, Аб, ... (ru)";
num_format = style_numformat(style_numformat::russianLo);
sync_letter = true;
break;
case 53: //numberformatRussianUpper :
num_format = L"А, Б, .., Аа, Аб, ... (ru)";
num_format = style_numformat(style_numformat::russianUp);
sync_letter = true;
break;
case 54: //numberformatTaiwaneseCounting :
@ -395,11 +395,11 @@ int odf_lists_styles_context::start_style_level(int level, int type)
case 59: //numberformatThaiNumbers :
break;
case 60: //numberformatUpperLetter :
num_format = L"A";
num_format = style_numformat(style_numformat::alphaUc);
sync_letter = true;
break;
case 61: //numberformatUpperRoman :
num_format = L"I";
num_format = style_numformat(style_numformat::romanUc);
break;
case 62: //numberformatVietnameseCounting :
break;

View File

@ -537,7 +537,7 @@ void odf_page_layout_context::set_page_number_format(_CP_OPT(int) & type, _CP_OP
case 34: break; //numberformatIdeographTraditional = 34,
case 35: break; //numberformatIdeographZodiac = 35,
case 36: break; //numberformatIdeographZodiacTraditional = 36,
case 37: break; //numberformatIroha = 37,
case 37: layout_state_list_.back().page_number_format = style_numformat(style_numformat::iroha); break;
case 38: break; //numberformatIrohaFullWidth = 38,
case 39: break; //numberformatJapaneseCounting = 39,
case 40: break; //numberformatJapaneseDigitalTenThousand = 40,
@ -546,26 +546,27 @@ void odf_page_layout_context::set_page_number_format(_CP_OPT(int) & type, _CP_OP
case 43: break; //numberformatKoreanDigital = 43,
case 44: break; //numberformatKoreanDigital2 = 44,
case 45: break; //numberformatKoreanLegal = 45,
case 46: layout_state_list_.back().page_number_format = L"a"; break; //numberformatLowerLetter = 46,
case 47: layout_state_list_.back().page_number_format = L"i"; break; //numberformatLowerRoman = 47,
case 46: layout_state_list_.back().page_number_format = style_numformat(style_numformat::alphaLc); break; //numberformatLowerLetter = 46,
case 47: layout_state_list_.back().page_number_format = style_numformat(style_numformat::romanLc); break; //numberformatLowerRoman = 47,
case 48: break; //numberformatNone = 48,
case 49: break; //numberformatnumberInDash = 49,
case 50: break; //numberformatOrdinal = 50,
case 51: break; //numberformatOrdinalText = 51,
case 52: break; //numberformatRussianLower = 52,
case 53: break; //numberformatRussianUpper = 53,
case 52: layout_state_list_.back().page_number_format = style_numformat(style_numformat::russianUp); break;
case 53: layout_state_list_.back().page_number_format = style_numformat(style_numformat::russianLo); break;
case 54: break; //numberformatTaiwaneseCounting = 54,
case 55: break; //numberformatTaiwaneseCountingThousand = 55,
case 56: break; //numberformatTaiwaneseDigital = 56,
case 57: break; //numberformatThaiCounting = 57,
case 58: break; //numberformatThaiLetters = 58,
case 59: break; //numberformatThainumbers = 59,
case 60: layout_state_list_.back().page_number_format = L"A"; break; //numberformatUpperLetter = 60,
case 61: layout_state_list_.back().page_number_format = L"I"; break; //numberformatUpperRoman = 61,
case 60: layout_state_list_.back().page_number_format = style_numformat(style_numformat::alphaUc); break; //numberformatUpperLetter = 60,
case 61: layout_state_list_.back().page_number_format = style_numformat(style_numformat::romanUc); break; //numberformatUpperRoman = 61,
case 62: break; //numberformatVietnameseCounting = 62
default:
break;
}
}//todooo
}
}

View File

@ -37,6 +37,7 @@
#include "office_elements_create.h"
#include "length.h"
#include "stylenumformat.h"
namespace cpdoccore {
namespace odf_writer {
@ -106,7 +107,7 @@ public:
_CP_OPT(odf_types::length) header_size_;
_CP_OPT(odf_types::length) footer_size_;
_CP_OPT(std::wstring) page_number_format;
_CP_OPT(odf_types::style_numformat) page_number_format;
private:
std::wstring style_oox_name_;

View File

@ -3590,28 +3590,28 @@ void DocxConverter::convert_comment(int oox_comm_id)
{
if (!docx_document->m_pComments)return;
for (size_t comm = 0 ; comm < docx_document->m_pComments->m_arrComments.size(); comm++)
{
OOX::CComment* oox_comment = docx_document->m_pComments->m_arrComments[comm];
if (oox_comment == NULL) continue;
if (oox_comment->m_oId.IsInit() == false) continue;
if (oox_comment->m_oId->GetValue() == oox_comm_id)
{
odt_context->start_comment_content();
{
if (oox_comment->m_oAuthor.IsInit()) odt_context->comment_context()->set_author (*oox_comment->m_oAuthor);
if (oox_comment->m_oDate.IsInit()) odt_context->comment_context()->set_date (oox_comment->m_oDate->GetValue());
if (oox_comment->m_oInitials.IsInit()) {}
std::map<int, int>::iterator pFind = docx_document->m_pComments->m_mapComments.find(oox_comm_id);
for (std::vector<OOX::WritingElement*>::iterator it = oox_comment->m_arrItems.begin(); it != oox_comment->m_arrItems.end(); ++it)
{
convert(*it);
}
if (pFind == docx_document->m_pComments->m_mapComments.end()) return;
if ( pFind->second < docx_document->m_pComments->m_arrComments.size() && pFind->second >= 0)
{
OOX::CComment* oox_comment = docx_document->m_pComments->m_arrComments[pFind->second];
if (oox_comment == NULL) return;
odt_context->start_comment_content();
{
if (oox_comment->m_oAuthor.IsInit()) odt_context->comment_context()->set_author (*oox_comment->m_oAuthor);
if (oox_comment->m_oDate.IsInit()) odt_context->comment_context()->set_date (oox_comment->m_oDate->GetValue());
if (oox_comment->m_oInitials.IsInit()) {}
for (std::vector<OOX::WritingElement*>::iterator it = oox_comment->m_arrItems.begin(); it != oox_comment->m_arrItems.end(); ++it)
{
convert(*it);
}
odt_context->end_comment_content();
}
odt_context->end_comment_content();
}
}
void DocxConverter::convert_footnote(int oox_ref_id)

View File

@ -1144,7 +1144,7 @@ namespace NSBinPptxRW
CRelsGenerator::CRelsGenerator(CImageManager2* pManager) : m_lNextRelsID(1), m_mapImages()
{
m_pManager = pManager;
m_pWriter = new CStringWriter();
m_pWriter = new NSStringUtils::CStringBuilder();
}
CRelsGenerator::~CRelsGenerator()
{

View File

@ -62,6 +62,10 @@ namespace NSCommon
class nullable_double;
class nullable_sizet;
}
namespace NSStringUtils
{
class CStringBuilder;
}
namespace PPTX
{
class Theme;
@ -85,7 +89,6 @@ namespace NSFontCutter
namespace NSBinPptxRW
{
class CStringWriter;
class CCommonWriter;
class CSeekTableEntry;
@ -400,7 +403,7 @@ namespace NSBinPptxRW
class CRelsGenerator
{
private:
CStringWriter* m_pWriter;
NSStringUtils::CStringBuilder* m_pWriter;
std::map<std::wstring, _relsGeneratorInfo> m_mapImages;
std::map<std::wstring, int> m_mapLinks;
public:

View File

@ -163,78 +163,64 @@ namespace PPTX
COfficeFileFormatChecker office_checker;
office_checker.isOOXFormatFile(oox_file.GetPath());
//if ( std::wstring::npos != sProgID.find(L"Word.Document"))
//-----------------------------------------------------------------------------------------
DocWrapper::FontProcessor oFontProcessor;
NSBinPptxRW::CDrawingConverter oDrawingConverter;
NSCommon::smart_ptr<OOX::IFileContainer> old_rels = *pWriter->m_pCurrentContainer;
NSCommon::smart_ptr<PPTX::Theme> old_theme = *pWriter->m_pTheme;
NSShapeImageGen::CMediaManager* old_manager = oDrawingConverter.m_pBinaryWriter->m_pCommon->m_pMediaManager;
oDrawingConverter.m_pBinaryWriter->m_pCommon->m_pMediaManager = pWriter->m_pCommon->m_pMediaManager;
oDrawingConverter.SetFontPicker(pWriter->m_pCommon->m_pFontPicker);
int type = 0;
if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX ||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM )
{
pWriter->StartRecord(1);
pWriter->WriteBYTE(1);
pWriter->EndRecord();
DocWrapper::FontProcessor oFontProcessor;
NSBinPptxRW::CDrawingConverter oDrawingConverter;
BinDocxRW::CDocxSerializer oDocxSerializer;
NSBinPptxRW::CBinaryFileWriter* old_writer = oDrawingConverter.m_pBinaryWriter;
NSCommon::smart_ptr<OOX::IFileContainer> old_rels = *pWriter->m_pCurrentContainer;
BinDocxRW::CDocxSerializer* old_serial = pWriter->m_pMainDocument;
NSCommon::smart_ptr<PPTX::Theme> old_theme = *pWriter->m_pTheme;
oDrawingConverter.m_pBinaryWriter = pWriter;
oDocxSerializer.m_pParamsWriter = new BinDocxRW::ParamsWriter(pWriter, &oFontProcessor, &oDrawingConverter, NULL);
pWriter->m_pMainDocument = &oDocxSerializer;
type = 1;
BinDocxRW::CDocxSerializer* old_serializer = pWriter->m_pMainDocument;
BinDocxRW::CDocxSerializer oDocxSerializer;
oDrawingConverter.m_pBinaryWriter->m_pMainDocument = &oDocxSerializer;
oDocxSerializer.m_pParamsWriter = new BinDocxRW::ParamsWriter(oDrawingConverter.m_pBinaryWriter, &oFontProcessor, &oDrawingConverter, NULL);
BinDocxRW::BinaryFileWriter oBinaryFileWriter(*oDocxSerializer.m_pParamsWriter);
pWriter->StartRecord(2);
oBinaryFileWriter.intoBindoc(oox_unpacked.GetPath());
pWriter->EndRecord();
oDrawingConverter.m_pBinaryWriter = old_writer;
*pWriter->m_pCurrentContainer = old_rels;
pWriter->m_pMainDocument = old_serial;
*pWriter->m_pTheme = old_theme;
oBinaryFileWriter.intoBindoc(oox_unpacked.GetPath());
pWriter->m_pMainDocument = old_serializer;
}
else if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX ||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM)
//if ( std::wstring::npos != sProgID.find(L"Excel.Sheet")) //"ET.Xlsx.6" !!!
{
pWriter->StartRecord(1);
pWriter->WriteBYTE(2);
pWriter->EndRecord();
DocWrapper::FontProcessor fp;
NSBinPptxRW::CDrawingConverter oDrawingConverter;
type = 2;
NSBinPptxRW::CBinaryFileWriter* old_writer = oDrawingConverter.m_pBinaryWriter;
NSCommon::smart_ptr<OOX::IFileContainer> old_rels = *pWriter->m_pCurrentContainer;
NSCommon::smart_ptr<PPTX::Theme> old_theme = *pWriter->m_pTheme;
oDrawingConverter.m_pBinaryWriter = pWriter;
BinXlsxRW::BinaryFileWriter xlsxBinaryWriter(fp);
BinXlsxRW::BinaryFileWriter xlsxBinaryWriter(oFontProcessor);
OOX::Spreadsheet::CXlsx oXlsxEmbedded(oox_unpacked);
pWriter->StartRecord(2);
xlsxBinaryWriter.intoBindoc(oXlsxEmbedded, *pWriter , NULL, &oDrawingConverter);
pWriter->EndRecord();
oDrawingConverter.m_pBinaryWriter = old_writer;
*pWriter->m_pCurrentContainer = old_rels;
*pWriter->m_pTheme = old_theme;
xlsxBinaryWriter.intoBindoc(oXlsxEmbedded, *oDrawingConverter.m_pBinaryWriter , NULL, &oDrawingConverter);
}
//else if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX)
//{
//}
else
{//unknown ms package
pWriter->StartRecord(1);
pWriter->WriteBYTE(0);
pWriter->EndRecord();
pWriter->WriteString1(2, ole_file->filename().GetFilename());
oDrawingConverter.m_pBinaryWriter->WriteString1(2, ole_file->filename().GetFilename());
}
*pWriter->m_pCurrentContainer = old_rels;
*pWriter->m_pTheme = old_theme;
oDrawingConverter.m_pBinaryWriter->m_pCommon->m_pMediaManager = old_manager;
//---------------------------------------------------------------------------------------------------------------------
pWriter->StartRecord(1);
pWriter->WriteBYTE(type);
pWriter->EndRecord();
pWriter->StartRecord(2);
pWriter->WriteBYTEArray(oDrawingConverter.m_pBinaryWriter->GetBuffer(), oDrawingConverter.m_pBinaryWriter->GetPosition());
pWriter->EndRecord();
NSDirectory::DeleteDirectory(oox_unpacked.GetPath());
}
else if ( std::wstring::npos != sProgID.find(L"Equation"))
@ -359,14 +345,8 @@ namespace PPTX
std::wstring sThemePath, sMediaPath, sEmbedPath;
oDocxSerializer.CreateDocxFolders (sDstEmbeddedTemp, sThemePath, sMediaPath, sEmbedPath);
NSBinPptxRW::CBinaryFileReader* old_reader = oDrawingConverter.m_pReader;
NSBinPptxRW::CRelsGenerator* old_rels = pReader->m_pRels;
//m_mapEnumeratedGlobal.clear();
oDrawingConverter.m_pReader = pReader;
pReader->m_pRels = new NSBinPptxRW::CRelsGenerator();
oDrawingConverter.m_pReader->Init(pReader->GetData() + pReader->GetPos(), 0, _embed_data_size);
oDrawingConverter.SetMainDocument(&oDocxSerializer);
@ -390,46 +370,24 @@ namespace PPTX
OOX::CContentTypes *pContentTypes = oDrawingConverter.GetContentTypes();
//docProps
OOX::CPath pathDocProps = sDstEmbeddedTemp + FILE_SEPARATOR_STR + _T("docProps");
OOX::CPath pathDocProps = sDstEmbeddedTemp + FILE_SEPARATOR_STR + L"docProps";
NSDirectory::CreateDirectory(pathDocProps.GetPath());
OOX::CPath DocProps = std::wstring(_T("docProps"));
OOX::CPath DocProps = std::wstring(L"docProps");
OOX::CApp oApp(NULL);
oApp.SetDefaults();
oApp.write(pathDocProps + FILE_SEPARATOR_STR + _T("app.xml"), DocProps, *pContentTypes);
OOX::CCore oCore(NULL);
oCore.SetDefaults();
oCore.write(pathDocProps + FILE_SEPARATOR_STR + _T("core.xml"), DocProps, *pContentTypes);
OOX::CApp* pApp = new OOX::CApp(NULL);
if (pApp)
{
pApp->SetApplication(L"ONLYOFFICE");
#if defined(INTVER)
pApp->SetAppVersion(VALUE2STR(INTVER));
#endif
pApp->SetDocSecurity(0);
pApp->SetScaleCrop(false);
pApp->SetLinksUpToDate(false);
pApp->SetSharedDoc(false);
pApp->SetHyperlinksChanged(false);
pApp->write(pathDocProps + FILE_SEPARATOR_STR + _T("app.xml"), DocProps, *pContentTypes);
delete pApp;
}
OOX::CCore* pCore = new OOX::CCore(NULL);
if (pCore)
{
pCore->SetCreator(_T(""));
pCore->SetLastModifiedBy(_T(""));
pCore->write(pathDocProps + FILE_SEPARATOR_STR + _T("core.xml"), DocProps, *pContentTypes);
delete pCore;
}
oDocxSerializer.m_pCurFileWriter->Write();
pContentTypes->Write(sDstEmbeddedTemp);
COfficeUtils oOfficeUtils(NULL);
oOfficeUtils.CompressFileOrDirectory(sDstEmbeddedTemp, sDstEmbedded + FILE_SEPARATOR_STR + sDocxFilename, true);
pReader->m_pRels->CloseRels();
delete pReader->m_pRels;
pReader->m_pRels = old_rels;
oDrawingConverter.m_pReader = old_reader;
//------------------------------------------------------------------
//std::wstring sEmbWorksheetRelsName = L"embeddings/" + sDocxFilename;
//std::wstring sEmbWorksheetRelType = OOX::FileTypes::MicrosoftOfficeWordDocument.RelationType();
@ -455,13 +413,9 @@ namespace PPTX
boost::unordered_map<std::wstring, size_t> old_enum_map = oXlsx.m_mapEnumeratedGlobal;
NSBinPptxRW::CBinaryFileReader* old_reader = oDrawingConverter.m_pReader;
NSBinPptxRW::CRelsGenerator* old_rels = pReader->m_pRels;
oXlsx.m_mapEnumeratedGlobal.clear();
oDrawingConverter.m_pReader = pReader;
pReader->m_pRels = new NSBinPptxRW::CRelsGenerator();
oDrawingConverter.m_pReader->Init(pReader->GetData() + pReader->GetPos(), 0, _embed_data_size);
oDrawingConverter.SetDstPath(sDstEmbeddedTemp + FILE_SEPARATOR_STR + L"xl");
oDrawingConverter.SetSrcPath(pReader->m_strFolder, 2);
@ -470,7 +424,7 @@ namespace PPTX
oDrawingConverter.SetEmbedDstPath(sEmbedPath);
std::wstring sXlsxFilename = L"Microsoft_Excel_Worksheet" + std::to_wstring( id ) + L".xlsx";
oEmbeddedReader.ReadMainTable(oXlsx, *pReader, pReader->m_strFolder, sDstEmbeddedTemp, oSaveParams, &oDrawingConverter);
oEmbeddedReader.ReadMainTable(oXlsx, *oDrawingConverter.m_pReader, pReader->m_strFolder, sDstEmbeddedTemp, oSaveParams, &oDrawingConverter);
oXlsx.PrepareToWrite();
@ -479,11 +433,6 @@ namespace PPTX
COfficeUtils oOfficeUtils(NULL);
oOfficeUtils.CompressFileOrDirectory(sDstEmbeddedTemp, sDstEmbedded + FILE_SEPARATOR_STR + sXlsxFilename, true);
pReader->m_pRels->CloseRels();
delete pReader->m_pRels;
pReader->m_pRels = old_rels;
oDrawingConverter.m_pReader = old_reader;
oXlsx.m_mapEnumeratedGlobal = old_enum_map;
//------------------------------------------------------------------
//std::wstring sEmbWorksheetRelsName = L"embeddings/" + sXlsxFilename;

View File

@ -567,6 +567,10 @@
<Filter
Name="___"
>
<File
RelativePath="..\source\Writer\OOXCommentsWriter.h"
>
</File>
<File
RelativePath="..\source\Writer\OOXContentTypesWriter.h"
>

View File

@ -1007,32 +1007,32 @@ bool RtfCharPropsCommand::ExecuteCommand(RtfDocument& oDocument, RtfReader& oRea
//COMMAND_RTF_BOOL( "ul", charProps->m_bUnderline, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "ulc", charProps->m_nUnderlineColor, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "uld", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dotted)
COMMAND_RTF_INT ( "uld", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dotted)
COMMAND_RTF_INT ( "uldash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dashed)
COMMAND_RTF_INT ( "uldashd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dash_dotted)
COMMAND_RTF_INT ( "uldashdd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dash_dot_dotted)
COMMAND_RTF_INT ( "uldb", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Double)
COMMAND_RTF_INT ( "ulhwave", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Heavy_wave)
COMMAND_RTF_INT ( "ulldash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Long_dashe)
COMMAND_RTF_INT ( "uldashd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dash_dotted)
COMMAND_RTF_INT ( "uldashdd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Dash_dot_dotted)
COMMAND_RTF_INT ( "uldb", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Double)
COMMAND_RTF_INT ( "ulhwave", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Heavy_wave)
COMMAND_RTF_INT ( "ulldash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Long_dashe)
COMMAND_RTF_INT ( "ulnone", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_none)
COMMAND_RTF_INT ( "ulth", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick)
COMMAND_RTF_INT ( "ulthd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dotted)
COMMAND_RTF_INT ( "ulthdash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dashed)
COMMAND_RTF_INT ( "ulthdashd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dash_dotted)
COMMAND_RTF_INT ( "ulth", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick)
COMMAND_RTF_INT ( "ulthd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dotted)
COMMAND_RTF_INT ( "ulthdash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dashed)
COMMAND_RTF_INT ( "ulthdashd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dash_dotted)
COMMAND_RTF_INT ( "ulthdashdd", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_dash_dot_dotted)
COMMAND_RTF_INT ( "ulthldash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_long_dashed)
COMMAND_RTF_INT ( "ulthldash", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Thick_long_dashed)
COMMAND_RTF_INT ( "ululdbwave", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Double_wave)
COMMAND_RTF_INT ( "ulw", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Word)
COMMAND_RTF_INT ( "ulw", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Word)
COMMAND_RTF_INT ( "ulwave", charProps->m_eUnderStyle, sCommand, true, RtfCharProperty::uls_Wave)
COMMAND_RTF_INT ( "up", charProps->m_nUp, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "crauth", charProps->m_nCrAuth, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "crdate", charProps->m_nCrDate, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "insrsid", charProps->m_nInsrsid, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "insrsid", charProps->m_nInsrsid, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "revauth", charProps->m_nRevauth, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "revdttm", charProps->m_nRevdttm, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "revauth", charProps->m_nRevauth, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "revdttm", charProps->m_nRevdttm, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "revauthdel", charProps->m_nRevauthDel, sCommand, hasParameter, parameter)
COMMAND_RTF_INT ( "revdttmdel", charProps->m_nRevdttmDel, sCommand, hasParameter, parameter)
@ -2814,7 +2814,69 @@ bool RtfParagraphPropDestination::ExecuteCommand(RtfDocument& oDocument, RtfRead
if ( pNewBookmarkEnd->IsValid() )
m_oCurParagraph->AddItem( pNewBookmarkEnd );
}
else if ( "footnote" == sCommand )
else if ( "atrfstart" == sCommand )
{
RtfAnnotElemPtr pNewAnnotElem ( new RtfAnnotElem(1) );
RtfAnnotElemReader oAnnotElemReader ( *pNewAnnotElem );
oAbstrReader.StartSubReader( oAnnotElemReader, oDocument, oReader );
if ( pNewAnnotElem->IsValid() )
m_oCurParagraph->AddItem( pNewAnnotElem );
}
else if ( "atrfend" == sCommand )
{
RtfAnnotElemPtr pNewAnnotElem ( new RtfAnnotElem(2) );
RtfAnnotElemReader oAnnotElemReader ( *pNewAnnotElem );
oAbstrReader.StartSubReader( oAnnotElemReader, oDocument, oReader );
if ( pNewAnnotElem->IsValid() )
m_oCurParagraph->AddItem( pNewAnnotElem );
}
else if ( "annotation" == sCommand )
{
RtfAnnotationPtr pNewAnnot ( new RtfAnnotation() );
RtfAnnotationReader oAnnotReader ( *pNewAnnot );
oAbstrReader.StartSubReader( oAnnotReader, oDocument, oReader );
if ( pNewAnnot->IsValid() )
m_oCurParagraph->AddItem( pNewAnnot );
}
else if ( "atnid" == sCommand )
{
RtfAnnotElemPtr pNewAnnotElem ( new RtfAnnotElem(5) );
RtfAnnotElemReader oAnnotElemReader( *pNewAnnotElem );
oAbstrReader.StartSubReader( oAnnotElemReader, oDocument, oReader );
if ( pNewAnnotElem->IsValid() )
m_oCurParagraph->AddItem( pNewAnnotElem );
}
else if ( "atnauthor" == sCommand )
{
RtfAnnotElemPtr pNewAnnotElem ( new RtfAnnotElem(4) );
RtfAnnotElemReader oAnnotElemReader( *pNewAnnotElem );
oAbstrReader.StartSubReader( oAnnotElemReader, oDocument, oReader );
if ( pNewAnnotElem->IsValid() )
m_oCurParagraph->AddItem( pNewAnnotElem );
}
else if ( "atnref" == sCommand )
{
RtfAnnotElemPtr pNewAnnotElem ( new RtfAnnotElem(3) );
RtfAnnotElemReader oAnnotElemReader ( *pNewAnnotElem );
oAbstrReader.StartSubReader( oAnnotElemReader, oDocument, oReader );
if ( pNewAnnotElem->IsValid() )
m_oCurParagraph->AddItem( pNewAnnotElem );
}
else if ( "footnote" == sCommand )
{
RtfFootnotePtr pNewFootnote ( new RtfFootnote() );
pNewFootnote->m_oCharProp = oReader.m_oState->m_oCharProp;
@ -2825,6 +2887,14 @@ bool RtfParagraphPropDestination::ExecuteCommand(RtfDocument& oDocument, RtfRead
if ( pNewFootnote->IsValid() )
m_oCurParagraph->AddItem( pNewFootnote );
}
//else if ( "chatn" == sCommand )
//{
// RtfCharSpecialPtr pNewChar ( new RtfCharSpecial() );
//
// pNewChar->m_oProperty = oReader.m_oState->m_oCharProp;
// pNewChar->m_eType = RtfCharSpecial::rsc_chatn;
// m_oCurParagraph->AddItem( pNewChar );
//}
else if ( "chftn" == sCommand )
{
if ( 1 == oReader.m_nFootnote )

View File

@ -1513,6 +1513,40 @@ private:
m_oField.m_bTextOnly = true;
}
};
class RtfAnnotElemReader: public RtfAbstractReader
{
public:
RtfAnnotElem& m_oAnnot;
RtfAnnotElemReader( RtfAnnotElem& oAnnot ) : m_oAnnot(oAnnot)
{
}
bool ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter)
{
if( "atrfstart" == sCommand )
;
else if( "atrfend" == sCommand )
;
else if( "atnref" == sCommand )
;
else if( "atndate" == sCommand )
;
else if( "atnid" == sCommand )
;
else if( "atnauthor" == sCommand )
;
else if ( "atnparent" == sCommand )
;
else
return false;
return true;
}
void ExecuteText(RtfDocument& oDocument, RtfReader& oReader, std::wstring sText)
{
m_oAnnot.m_sValue += sText ;
}
};
class RtfBookmarkStartReader: public RtfAbstractReader
{
@ -1679,6 +1713,60 @@ public:
oReader.m_nFootnote = PROP_DEF;
}
};
class RtfAnnotationReader: public RtfAbstractReader
{
private:
RtfParagraphPropDestination m_oParPropDest;
public:
RtfAnnotation& m_oRtfAnnotation;
RtfAnnotationReader( RtfAnnotation& oRtfAnnotation ) : m_oRtfAnnotation(oRtfAnnotation)
{
}
bool ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter)
{
if( "annotation" == sCommand )
{
return true;
}
else if( "atnref" == sCommand )
{
m_oRtfAnnotation.m_oRef = RtfAnnotElemPtr ( new RtfAnnotElem(3) );
RtfAnnotElemReader oAnnotReader ( *m_oRtfAnnotation.m_oRef );
StartSubReader( oAnnotReader, oDocument, oReader );
}
else if( "atndate" == sCommand )
{
m_oRtfAnnotation.m_oDate = RtfAnnotElemPtr ( new RtfAnnotElem(6) );
RtfAnnotElemReader oAnnotReader ( *m_oRtfAnnotation.m_oDate );
StartSubReader( oAnnotReader, oDocument, oReader );
}
else if( "atnparent" == sCommand )
{
m_oRtfAnnotation.m_oParent = RtfAnnotElemPtr ( new RtfAnnotElem(7) );
RtfAnnotElemReader oAnnotReader ( *m_oRtfAnnotation.m_oParent );
StartSubReader( oAnnotReader, oDocument, oReader );
}
else
return m_oParPropDest.ExecuteCommand( oDocument, oReader, (*this), sCommand, hasParameter, parameter );
return true;
}
void ExecuteText( RtfDocument& oDocument, RtfReader& oReader, std::wstring sText )
{
m_oParPropDest.ExecuteText( oDocument, oReader, sText );
}
void ExitReader( RtfDocument& oDocument, RtfReader& oReader )
{
m_oParPropDest.Finalize( oReader );
m_oRtfAnnotation.m_oContent = m_oParPropDest.m_oTextItems;
}
};
class RtfDefParPropReader: public RtfAbstractReader
{
private:

View File

@ -135,14 +135,14 @@ public:
int nId = ooxFtnEdn->m_oId->GetValue();
OOXTextItemReader oTextItemReader;
for (std::vector<OOX::WritingElement*>::iterator it = ooxFtnEdn->m_arrItems.begin(); it != ooxFtnEdn->m_arrItems.end(); ++it)
for (size_t i = 0; i < ooxFtnEdn->m_arrItems.size(); ++i)
{
if( nSeparatorId == nId )
{
TextItemContainerPtr oNewTextItem ( new TextItemContainer() );
oTextItemReader.m_oTextItems = oNewTextItem;
if( true == oTextItemReader.Parse( *it, oParam ) )
if( true == oTextItemReader.Parse( ooxFtnEdn->m_arrItems[i], oParam ) )
{
if( true == bFootnote )
oParam.oRtf->m_oFootnoteSep = oNewTextItem;
@ -155,7 +155,7 @@ public:
TextItemContainerPtr oNewTextItem ( new TextItemContainer() );
oTextItemReader.m_oTextItems = oNewTextItem;
if( true == oTextItemReader.Parse( *it, oParam ) )
if( true == oTextItemReader.Parse( ooxFtnEdn->m_arrItems[i], oParam ) )
{
if( true == bFootnote )
oParam.oRtf->m_oFootnoteCon = oNewTextItem;
@ -168,7 +168,7 @@ public:
TextItemContainerPtr oNewTextItem ( new TextItemContainer() );
oTextItemReader.m_oTextItems = oNewTextItem;
if( true == oTextItemReader.Parse( *it, oParam ) )
if( true == oTextItemReader.Parse( ooxFtnEdn->m_arrItems[i], oParam ) )
{
if( true == bFootnote )
oParam.oReader->m_mapFootnotes[ nId] = oNewTextItem;

View File

@ -32,9 +32,9 @@
#include "OOXParagraphReader.h"
#include "OOXTextItemReader.h"
#include "OOXpPrFrameReader.h"
#include "OOXpPrTabReader.h"
#include "OOXTableReader.h"
#include "../RtfOle.h"
@ -457,6 +457,117 @@ bool OOXParagraphReader::Parse3( ReaderParameter oParam , RtfParagraph& oOutputP
}
}
}break;
case OOX::et_w_commentRangeStart:
case OOX::et_w_commentReference:
{
OOX::Logic::CCommentRangeStart * pCommentStart = dynamic_cast<OOX::Logic::CCommentRangeStart*>(m_ooxElement);
if(pCommentStart->m_oId.IsInit())
{
int nId = pCommentStart->m_oId->GetValue();
std::map<int, OOXReader::_comment>::iterator pFind = oParam.oReader->m_mapComments.find( nId );
if( pFind == oParam.oReader->m_mapComments.end())
{
RtfAnnotElemPtr oNewAnnotElem ( new RtfAnnotElem(1) );
oNewAnnotElem->m_sValue = std::to_wstring(0x7700000 + nId);
OOXReader::_comment comment;
comment.ref = oNewAnnotElem->m_sValue;
comment.index = oParam.oReader->m_mapComments.size();
oParam.oReader->m_mapComments.insert(std::make_pair( nId, comment));
oOutputParagraph.AddItem( oNewAnnotElem );
}
}
}break;
case OOX::et_w_commentRangeEnd:
{
OOX::Logic::CCommentRangeEnd * pCommentEnd = dynamic_cast<OOX::Logic::CCommentRangeEnd*>(m_ooxElement);
int nId = pCommentEnd->m_oId->GetValue();
std::map<int, OOXReader::_comment>::iterator pFindRef = oParam.oReader->m_mapComments.find( nId );
if( pFindRef != oParam.oReader->m_mapComments.end())
{
RtfAnnotElemPtr oNewAnnotElem ( new RtfAnnotElem(2) );
oNewAnnotElem->m_sValue = pFindRef->second.ref;
oOutputParagraph.AddItem( oNewAnnotElem );
//find comment and add info
std::map<int, int>::iterator pFindComment = oParam.oDocx->m_pComments->m_mapComments.find(nId);
if (pFindComment != oParam.oDocx->m_pComments->m_mapComments.end())
{
if ( pFindComment->second < oParam.oDocx->m_pComments->m_arrComments.size() && pFindComment->second >= 0)
{
OOX::CComment* oox_comment = oParam.oDocx->m_pComments->m_arrComments[pFindComment->second];
if (oox_comment)
{
if (oox_comment->m_oAuthor.IsInit())
{
RtfAnnotElemPtr oNewAnnotAuthor ( new RtfAnnotElem(4) );
oNewAnnotAuthor->m_sValue = *oox_comment->m_oAuthor;
oOutputParagraph.AddItem( oNewAnnotAuthor );
}
if (oox_comment->m_oInitials.IsInit())
{
RtfAnnotElemPtr oNewAnnotAuthorId ( new RtfAnnotElem(5) );
oNewAnnotAuthorId->m_sValue = *oox_comment->m_oInitials;
oOutputParagraph.AddItem( oNewAnnotAuthorId );
}
RtfAnnotationPtr oNewAnnotContent(new RtfAnnotation());
oNewAnnotContent->m_oRef = RtfAnnotElemPtr ( new RtfAnnotElem(3) );
oNewAnnotContent->m_oRef->m_sValue = pFindRef->second.ref;
if (oox_comment->m_oDate.IsInit())
{
oNewAnnotContent->m_oDate = RtfAnnotElemPtr ( new RtfAnnotElem(6) );
int nDate = RtfUtility::convertDateTime(oox_comment->m_oDate->GetValue());
oNewAnnotContent->m_oDate->m_sValue = std::to_wstring(nDate);
}
OOXTextItemReader oTextItemReader;
oTextItemReader.m_oTextItems = oNewAnnotContent->m_oContent;
for (size_t i = 0; i < oox_comment->m_arrItems.size(); ++i)
{
if (oParam.oDocx->m_pCommentsExt)
{
OOX::Logic::CParagraph *pParagraph = dynamic_cast<OOX::Logic::CParagraph*>(oox_comment->m_arrItems[i]);
if ((pParagraph) && (pParagraph->m_oParaId.IsInit()))
{
std::map<int, int>::iterator pFindPara = oParam.oDocx->m_pCommentsExt->m_mapComments.find(pParagraph->m_oParaId->GetValue());
if (pFindPara != oParam.oDocx->m_pCommentsExt->m_mapComments.end())
{
oParam.oReader->m_mapCommentsPara.insert(std::make_pair( pParagraph->m_oParaId->GetValue(), pFindRef->second.index));
if (oParam.oDocx->m_pCommentsExt->m_arrComments[pFindPara->second]->m_oParaIdParent.IsInit())
{
std::map<int, int>::iterator pFindParent = oParam.oReader->m_mapCommentsPara.find(oParam.oDocx->m_pCommentsExt->m_arrComments[pFindPara->second]->m_oParaIdParent->GetValue());
if (pFindParent != oParam.oReader->m_mapCommentsPara.end())
{
oNewAnnotContent->m_oParent = RtfAnnotElemPtr ( new RtfAnnotElem(7) );
oNewAnnotContent->m_oParent->m_sValue = std::to_wstring( pFindParent->second - pFindRef->second.index);
}
}
}
}
}
oTextItemReader.Parse(oox_comment->m_arrItems[i], oParam);
}
oOutputParagraph.AddItem( oNewAnnotContent );
}
}
}
}
}break;
default:
break;
}

View File

@ -66,8 +66,17 @@ public:
int m_nCurOleChartId;
int m_nCurFittextId;
std::map<int, std::wstring> m_aBookmarks;
struct _comment
{
std::wstring ref;
int index;
};
std::map<int, _comment> m_mapComments; //nId, ref & index added
std::map<int, int> m_mapCommentsPara; //paraId, index added
std::map<int, int> m_mapPictureBullet;
std::map<int, TextItemContainerPtr> m_mapFootnotes;
std::map<int, TextItemContainerPtr> m_mapEndnotes;

View File

@ -34,6 +34,7 @@
#include "Writer/OOXWriter.h"
#include "Writer/OOXFootnoteWriter.h"
#include "Writer/OOXCommentsWriter.h"
#include "Utils.h"
@ -56,11 +57,10 @@ std::wstring RtfBookmarkStart::RenderToRtf(RenderParameter oRenderParameter)
std::wstring RtfBookmarkStart::RenderToOOX(RenderParameter oRenderParameter)
{
std::wstring sResult;
//ATLASSERT( false == m_sName.empty() );
sResult += L"<w:bookmarkStart";
OOXWriter * poOOXWriter = static_cast<OOXWriter*> ( oRenderParameter.poWriter );
RtfDocument * poDocument = static_cast<RtfDocument*> (oRenderParameter.poDocument);
RtfDocument * poDocument = static_cast<RtfDocument*> ( oRenderParameter.poDocument );
std::map<std::wstring, int>::iterator pPair = poOOXWriter->m_aBookmarksId.find( m_sName );
@ -118,6 +118,131 @@ std::wstring RtfBookmarkEnd::RenderToOOX(RenderParameter oRenderParameter)
sResult += L"/>";
return sResult;
}
std::wstring RtfAnnotElem::RenderToRtf(RenderParameter oRenderParameter)
{
std::wstring sResult;
if (m_nType == 1) sResult += L"{\\*\\atrfstart " + m_sValue + L"}";
else if (m_nType == 2) sResult += L"{\\*\\atrfend " + m_sValue + L"}";
else if (m_nType == 3) sResult += L"{\\*\\atnref " + m_sValue + L"}";
else if (m_nType == 4) sResult += L"{\\*\\atnauthor " + m_sValue + L"}";
else if (m_nType == 5) sResult += L"{\\*\\atnid " + m_sValue + L"}";
else if (m_nType == 6) sResult += L"{\\*\\atndate " + m_sValue + L"}";
else if (m_nType == 7) sResult += L"{\\*\\atnparent " + m_sValue + L"}";
return sResult;
}
std::wstring RtfAnnotElem::RenderToOOX(RenderParameter oRenderParameter)
{
if (m_nType > 8 || m_nType < 1) return L"";
std::wstring sResult;
OOXWriter* poOOXWriter = static_cast<OOXWriter*> (oRenderParameter.poWriter);
OOXCommentsWriter* poCommentsWriter = static_cast<OOXCommentsWriter*>( poOOXWriter->m_poCommentsWriter );
if (m_nType == 4)
{
poCommentsWriter->AddCommentAuthor(m_sValue);
}
else if (m_nType == 5)
{
poCommentsWriter->AddCommentID(m_sValue);
}
else
{
std::map<std::wstring,OOXCommentsWriter::_comment>::iterator pFind = poCommentsWriter->m_mapComments.find(m_sValue);
int id = -1;
if (pFind == poCommentsWriter->m_mapComments.end())
{
id = poCommentsWriter->m_mapComments.size() ;//+ 1;
poCommentsWriter->AddComment(m_sValue, id);
}
else
{
id = pFind->second.nID;
}
if (m_nType == 1)
{
sResult += L"<w:commentRangeStart w:id=\"" + std::to_wstring(id) + L"\"/>";
}
else if (m_nType == 3)
{
sResult += L"<w:commentReference w:id=\"" + std::to_wstring(id) + L"\"/>";
}
else if (m_nType == 2)
{
poCommentsWriter->SetCommentEnd(m_sValue);
sResult += L"<w:commentRangeEnd w:id=\"" + std::to_wstring(id) + L"\"/>";
sResult += L"<w:r><w:commentReference w:id=\"" + std::to_wstring(id) + L"\"/></w:r>";
}
}
return sResult;
}
std::wstring RtfAnnotation::RenderToRtf(RenderParameter oRenderParameter)
{
std::wstring sResult;
sResult += L"\\chatn{\\*\\annotation";
if (m_oRef)
{
sResult += m_oRef->RenderToRtf(oRenderParameter);
}
if (m_oDate)
{
sResult += m_oDate->RenderToRtf(oRenderParameter);
}
if (m_oParent)
{
sResult += m_oParent->RenderToRtf(oRenderParameter);
}
if (m_oContent)
{
sResult += m_oContent->RenderToRtf(oRenderParameter);
}
sResult += L"}";
return sResult;
}
std::wstring RtfAnnotation::RenderToOOX(RenderParameter oRenderParameter)
{
OOXWriter* poOOXWriter = static_cast<OOXWriter*> (oRenderParameter.poWriter);
OOXCommentsWriter* poCommentsWriter = static_cast<OOXCommentsWriter*>( poOOXWriter->m_poCommentsWriter );
if (!m_oRef) return L"";
if (m_oDate)
{
int nValue = boost::lexical_cast<int>(m_oDate->m_sValue);
poCommentsWriter->AddCommentDate(m_oRef->m_sValue, RtfUtility::convertDateTime(nValue));
}
if (m_oContent)
{
RenderParameter oNewParameter = oRenderParameter;
oNewParameter.nType = RENDER_TO_OOX_PARAM_COMMENT;
oNewParameter.poRels = poCommentsWriter->m_oRelsWriter.get();
std::wstring content = m_oContent->RenderToOOX(oNewParameter);
std::wstring sParaId = XmlUtils::IntToString(poOOXWriter->m_nextParaId, L"%08X");//last para id in comment
poCommentsWriter->AddCommentContent(m_oRef->m_sValue, sParaId, content);
}
if (m_oParent)
{
poCommentsWriter->AddCommentParent(m_oRef->m_sValue, m_oParent->m_sValue);
}
return L"";
}
std::wstring RtfFootnote::RenderToRtf(RenderParameter oRenderParameter)
{
std::wstring sResult;
@ -147,9 +272,11 @@ std::wstring RtfFootnote::RenderToOOX(RenderParameter oRenderParameter)
{
int nID = poDocument->m_oIdGenerator.Generate_EndnoteNumber();
OOXEndnoteWriter* poEndnoteWriter = static_cast<OOXEndnoteWriter*>( poOOXWriter->m_poEndnoteWriter );
RenderParameter oNewParameter = oRenderParameter;
oNewParameter.nType = RENDER_TO_OOX_PARAM_UNKNOWN;
oNewParameter.poRels = poEndnoteWriter->m_oRelsWriter.get();
poEndnoteWriter->AddEndnote( L"", nID, m_oContent->RenderToOOX(oNewParameter) );
sResult += L"<w:r>";

View File

@ -64,6 +64,48 @@ public:
std::wstring RenderToRtf(RenderParameter oRenderParameter);
std::wstring RenderToOOX(RenderParameter oRenderParameter);
};
class RtfAnnotElem : public IDocumentElement
{
public:
std::wstring m_sValue;
int m_nType;
RtfAnnotElem(int type = 0) : m_nType (type)
{
}
int GetType()
{
return TYPE_RTF_ANNOTVALUE;
}
std::wstring RenderToRtf(RenderParameter oRenderParameter);
std::wstring RenderToOOX(RenderParameter oRenderParameter);
};
typedef boost::shared_ptr<RtfAnnotElem> RtfAnnotElemPtr;
class RtfAnnotation : public IDocumentElement
{
public:
RtfAnnotElemPtr m_oRef;
RtfAnnotElemPtr m_oDate;
RtfAnnotElemPtr m_oParent;
TextItemContainerPtr m_oContent;
RtfCharProperty m_oCharProp;
RtfAnnotation()
{
m_oContent = TextItemContainerPtr( new TextItemContainer() );
}
int GetType()
{
return TYPE_RTF_ANNOTATION;
}
std::wstring RenderToRtf(RenderParameter oRenderParameter);
std::wstring RenderToOOX(RenderParameter oRenderParameter);
};
typedef boost::shared_ptr<RtfAnnotation> RtfAnnotationPtr;
class RtfFootnote : public IDocumentElement
{
public:

View File

@ -40,7 +40,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter)
OOXWriter* poOOXWriter = static_cast<OOXWriter*> (oRenderParameter.poWriter);
std::wstring sResult;
if (RENDER_TO_OOX_PARAM_RUN == oRenderParameter.nType)
if (RENDER_TO_OOX_PARAM_RUN == oRenderParameter.nType)
{
bool bInsert = false;
bool bDelete = false;
@ -69,6 +69,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter)
sResult += L"<w:rPr>";
sResult += m_oProperty.RenderToOOX(oRenderParameter);
sResult += L"</w:rPr>";
sResult += renderTextToXML(L"Text", bDelete );
sResult += L"</w:r>";

View File

@ -82,6 +82,11 @@ const long g_cdMaxPercent = 1000000;
#define TYPE_RTF_FOOTNOTE 30
#define TYPE_RTF_ANNOTSTART 31
#define TYPE_RTF_ANNOTEND 32
#define TYPE_RTF_ANNOTVALUE 33
#define TYPE_RTF_ANNOTATION 34
#define RENDER_TO_OOX_PARAM_UNKNOWN 0
#define RENDER_TO_OOX_PARAM_LAST 1
#define RENDER_TO_OOX_PARAM_RUN 2
@ -107,6 +112,7 @@ const long g_cdMaxPercent = 1000000;
#define RENDER_TO_OOX_PARAM_OLE_ONLY 25
#define RENDER_TO_OOX_PARAM_OLDLIST_ABS 26
#define RENDER_TO_OOX_PARAM_OLDLIST_OVR 27
#define RENDER_TO_OOX_PARAM_COMMENT 28
#define RENDER_TO_RTF_PARAM_UNKNOWN 0
#define RENDER_TO_RTF_PARAM_CHAR 1

View File

@ -32,6 +32,8 @@
#include "RtfParagraph.h"
#include "RtfWriter.h"
#include "Writer/OOXWriter.h"
int RtfParagraph::AddItem( IDocumentElementPtr piRend )
{
if( TYPE_RTF_CHAR == piRend->GetType() )
@ -85,7 +87,10 @@ std::wstring RtfParagraph::RenderToRtf(RenderParameter oRenderParameter)
std::wstring RtfParagraph::RenderToOOX(RenderParameter oRenderParameter)
{
std::wstring sResult ;
OOXWriter* poOOXWriter = static_cast<OOXWriter*>(oRenderParameter.poWriter);
std::wstring sResult ;
if( RENDER_TO_OOX_PARAM_PLAIN == oRenderParameter.nType )
{
for (size_t i = 0; i < m_aArray.size(); i++ )
@ -125,8 +130,13 @@ std::wstring RtfParagraph::RenderToOOX(RenderParameter oRenderParameter)
if( NULL != m_oOldList )
bCanConvertToNumbering = m_oOldList->CanConvertToNumbering();
sResult += L"<w:p>";
sResult += L"<w:pPr>";
sResult += L"<w:p";
if (oRenderParameter.nType == RENDER_TO_OOX_PARAM_COMMENT)
{
std::wstring sParaId = XmlUtils::IntToString(++poOOXWriter->m_nextParaId, L"%08X");
sResult += L" w14:paraId=\"" + sParaId + L"\" w14:textId=\"" + sParaId + L"\"";
}
sResult += L"><w:pPr>";
m_oProperty.m_bOldList = (NULL != m_oOldList);
sResult += m_oProperty.RenderToOOX(oRenderParameter);
@ -162,7 +172,15 @@ std::wstring RtfParagraph::RenderToOOX(RenderParameter oRenderParameter)
}
}
}
if (oRenderParameter.nType == RENDER_TO_OOX_PARAM_COMMENT)
{
sResult += L"<w:r>";
sResult += L"<w:rPr>";
sResult += m_oProperty.m_oCharProperty.RenderToOOX(oRenderParameter);
sResult += L"</w:rPr>";
sResult += L"<w:annotationRef/>";
sResult += L"</w:r>";
}
oNewParam.nType = RENDER_TO_OOX_PARAM_RUN;
std::wstring ParagraphContent;

View File

@ -379,7 +379,7 @@ public:
return date_str;
}
static int convertDateTime (std::wstring & dt_)
static int convertDateTime (const std::wstring & dt_)
{
int result = 0;

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