/* * (c) Copyright Ascensio System SIA 2010-2023 * * 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 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * 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 "ReaderClasses.h" namespace BinDocxRW { docRGB::docRGB() { R = 255; G = 255; B = 255; } std::wstring docRGB::ToString() { return XmlUtils::ToString(R, L"%02X") + XmlUtils::ToString(G, L"%02X") + XmlUtils::ToString(B, L"%02X"); } CThemeColor::CThemeColor() { Reset(); } void CThemeColor::Reset() { bShade = false; bTint = false; bColor = false; Auto = false; } bool CThemeColor::IsNoEmpty() { return bShade || bTint || bColor || Auto; } std::wstring CThemeColor::ToStringColor() { std::wstring sRes; if (bColor) { switch(Color) { case 0: sRes = _T("accent1");break; case 1: sRes = _T("accent2");break; case 2: sRes = _T("accent3");break; case 3: sRes = _T("accent4");break; case 4: sRes = _T("accent5");break; case 5: sRes = _T("accent6");break; case 6: sRes = _T("background1");break; case 7: sRes = _T("background2");break; case 8: sRes = _T("dark1");break; case 9: sRes = _T("dark2");break; case 10: sRes = _T("followedHyperlink");break; case 11: sRes = _T("hyperlink");break; case 12: sRes = _T("light1");break; case 13: sRes = _T("light2");break; case 14: sRes = _T("none");break; case 15: sRes = _T("text1");break; case 16: sRes = _T("text2");break; default : sRes = _T("none");break; } } return sRes; } std::wstring CThemeColor::ToStringTint() { std::wstring sRes; if (bTint) { sRes = XmlUtils::ToString(Tint, L"%02X"); } return sRes; } std::wstring CThemeColor::ToStringShade() { std::wstring sRes; if (bShade) { sRes = XmlUtils::ToString(Shade, L"%02X"); } return sRes; } void CThemeColor::ToCThemeColor( nullable& oColor, nullable& oThemeColor, nullable& oThemeTint, nullable& oThemeShade) { if (Auto) { if (!oColor.IsInit()) oColor.Init(); oColor->SetValue(SimpleTypes::hexcolorAuto); } if (bColor) { oThemeColor.Init(); oThemeColor->SetValue((SimpleTypes::EThemeColor)Color); } if (bTint) { oThemeTint.Init(); oThemeTint->SetValue(Tint); } if (bShade) { oThemeShade.Init(); oThemeShade->SetValue(Shade); } } Background::Background() : bColor (false), bThemeColor(false) {} std::wstring Background::Write() { std::wstring sBackground = L""; sBackground += sObject; sBackground += L""; return sBackground; } docStyle::docStyle() { byteType = styletype_Paragraph; bDefault = false; bCustom = false; bqFormat = false; buiPriority = false; bhidden = false; bsemiHidden = false; bunhideWhenUsed = false; bautoRedefine = false; blocked = false; bpersonal = false; bpersonalCompose = false; bpersonalReply = false; } void docStyle::Write(NSStringUtils::CStringBuilder* pCStringWriter) { std::wstring sType; switch(byteType) { case styletype_Character: sType = _T("character");break; case styletype_Numbering: sType = _T("numbering");break; case styletype_Table: sType = _T("table");break; default: sType = _T("paragraph");break; } if (!Id.empty()) { std::wstring sStyle = L""; pCStringWriter->WriteString(sStyle); if (!Name.empty()) { pCStringWriter->WriteString(L""); } if (!Aliases.empty()) { pCStringWriter->WriteString(L"WriteEncodeXmlString(Aliases); pCStringWriter->WriteString(L"\"/>"); } if (!BasedOn.empty()) { pCStringWriter->WriteString(L""); } if (!NextId.empty()) { pCStringWriter->WriteString(L""); } if (!Link.empty()) { pCStringWriter->WriteString(L"WriteEncodeXmlString(Link); pCStringWriter->WriteString(L"\"/>"); } if (bautoRedefine) { if (autoRedefine) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bhidden) { if (hidden) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (buiPriority) { pCStringWriter->WriteString(L""); } if (bsemiHidden) { if (semiHidden) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bunhideWhenUsed) { if (unhideWhenUsed) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bqFormat) { if (qFormat) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (blocked) { if (locked) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bpersonal) { if (personal) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bpersonalCompose) { if (personalCompose) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (bpersonalReply) { if (personalReply) pCStringWriter->WriteString(L""); else pCStringWriter->WriteString(L""); } if (!ParaPr.empty()) { pCStringWriter->WriteString(ParaPr); } if (!TextPr.empty()) { pCStringWriter->WriteString(TextPr); } if (!TablePr.empty()) { pCStringWriter->WriteString(TablePr); } if (!RowPr.empty()) { pCStringWriter->WriteString(L""); pCStringWriter->WriteString(RowPr); pCStringWriter->WriteString(L""); } if (!CellPr.empty()) { pCStringWriter->WriteString(L""); pCStringWriter->WriteString(CellPr); pCStringWriter->WriteString(L""); } for(_INT32 i = 0, length = (_INT32)TblStylePr.size(); i < length; ++i) { pCStringWriter->WriteString(TblStylePr[i]); } pCStringWriter->WriteString(L""); } } tblStylePr::tblStylePr() { bType = false; } PaddingsToWrite::PaddingsToWrite() { bLeft = false; bTop = false; bRight = false; bBottom = false; } PaddingsToWriteMM::PaddingsToWriteMM() { bLeft = false; bTop = false; bRight = false; bBottom = false; } docImg::docImg(_INT32 nDocPr) { m_nDocPr = nDocPr; bMediaId = false; bType = false; bX = false; bY = false; bWidth = false; bHeight = false; bPaddings = false; } void docImg::Write(NSStringUtils::CStringBuilder* pCStringWriter) { if (bType) { if (c_oAscWrapStyle::Inline == Type) { if (bWidth && bHeight) { _INT64 nWidth = (_INT64)(g_dKoef_mm_to_emu * Width); _INT64 nHeight = (_INT64)(g_dKoef_mm_to_emu * Height); std::wstring sDrawing = L""; pCStringWriter->WriteString(sDrawing); } } else if (c_oAscWrapStyle::Flow == Type) { if (bX && bY && bWidth && bHeight) { _INT64 nX = (_INT64)(g_dKoef_mm_to_emu * X); _INT64 nY = (_INT64)(g_dKoef_mm_to_emu * Y); _INT64 nWidth = (_INT64)(g_dKoef_mm_to_emu * Width); _INT64 nHeight = (_INT64)(g_dKoef_mm_to_emu * Height); _UINT32 nPaddingLeft = 0; _UINT32 nPaddingTop = 0; _UINT32 nPaddingRight = 0; _UINT32 nPaddingBottom = 0; if (bPaddings) { if (Paddings.bLeft) nPaddingLeft = (_UINT32)(g_dKoef_mm_to_emu * Paddings.Left); if (Paddings.bTop) nPaddingTop = (_UINT32)(g_dKoef_mm_to_emu * Paddings.Top); if (Paddings.bRight) nPaddingRight = (_UINT32)(g_dKoef_mm_to_emu * Paddings.Right); if (Paddings.bBottom) nPaddingBottom = (_UINT32)(g_dKoef_mm_to_emu * Paddings.Bottom); } std::wstring sDrawing = L"" + std::to_wstring(nX) + L"" + std::to_wstring(nY) + L"\ \ "; pCStringWriter->WriteString(sDrawing); } } } } docW::docW() { bType = false; bW = false; bWDocx = false; } void docW::Write(NSStringUtils::CStringBuilder& pCStringWriter, const std::wstring& sName) { pCStringWriter.WriteString(Write(sName)); } std::wstring docW::Write(const std::wstring& sName) { std::wstring sXml; if (bW || (bType && bWDocx)) { std::wstring sType; _INT32 nVal; if (bW) { sType = _T("dxa"); nVal = SerializeCommon::Round( g_dKoef_mm_to_twips * W); } else { switch(Type) { case 0: sType = _T("auto"); break; case 1: sType = _T("dxa"); break; case 2: sType = _T("nil"); break; case 3: sType = _T("pct"); break; } nVal = WDocx; } sXml = L"<" + sName + L" w:w=\"" + std::to_wstring(nVal) + L"\" w:type=\"" + sType + L"\"/>"; } return sXml; } rowPrAfterBefore::rowPrAfterBefore(std::wstring name) { sName = name; bGridAfter = false; } void rowPrAfterBefore::Write(NSStringUtils::CStringBuilder& writer) { if (bGridAfter && nGridAfter > 0) { writer.WriteString(L""); } if (oAfterWidth.bW) oAfterWidth.Write(writer, _T("w:w") + sName); } WriteHyperlink* WriteHyperlink::Parse(std::wstring fld) { WriteHyperlink* res = NULL; if (-1 != fld.find(L"HYPERLINK")) { std::wstring sLink; std::wstring sTooltip; bool bNextLink = false; bool bNextTooltip = false; //разбиваем по пробелам, но с учетом кавычек std::vector aItems; std::wstring sCurItem; bool bDQuot = false; for(size_t i = 0, length = fld.length(); i < length; ++i) { wchar_t sCurLetter = fld[i]; if ('\"' == sCurLetter) bDQuot = !bDQuot; else if ('\\' == sCurLetter && true == bDQuot && i + 1 < length && '\"' == fld[i + 1]) { i++; sCurItem += fld[i]; } else if (' ' == sCurLetter && false == bDQuot) { if (sCurItem.length() > 0) { aItems.push_back(sCurItem); sCurItem = _T(""); } } else sCurItem += sCurLetter; } if (sCurItem.length() > 0) aItems.push_back(sCurItem); for(size_t i = 0, length = aItems.size(); i < length; ++i) { std::wstring item = aItems[i]; if (bNextLink) { bNextLink = false; sLink = item; } if (bNextTooltip) { bNextTooltip = false; sTooltip = item; } if (L"HYPERLINK" == item) bNextLink = true; else if (L"\\o" == item) bNextTooltip = true; } if (false == sLink.empty()) { res = new WriteHyperlink(); boost::algorithm::trim(sLink); _INT32 nAnchorIndex = (_INT32)sLink.find(L"#"); if (-1 != nAnchorIndex) { res->href = sLink.substr(0, nAnchorIndex); res->anchor = sLink.substr(nAnchorIndex); } else res->href = sLink; if (false == sTooltip.empty()) { res->tooltip = boost::algorithm::trim_copy(sTooltip); } } } return res; } void WriteHyperlink::Write(NSStringUtils::CStringBuilder& wr) { if (false == rId.empty()) { std::wstring sCorrect_rId = XmlUtils::EncodeXmlString(rId); std::wstring sCorrect_tooltip = XmlUtils::EncodeXmlString(tooltip); std::wstring sCorrect_anchor = XmlUtils::EncodeXmlString(anchor); std::wstring sStart = L""; wr.WriteString(sStart); wr.Write(writer); wr.WriteString(L""); } } IdCounter::IdCounter(_INT32 nStart) { m_nId = nStart; } _INT32 IdCounter::getNextId(_INT32 nCount) { _INT32 nRes = m_nId; m_nId += nCount; return nRes; } _INT32 IdCounter::getCurrentId() { return m_nId; } CComment::CComment(IdCounter& oParaIdCounter, IdCounter& oFormatIdCounter) : m_oParaIdCounter(oParaIdCounter),m_oFormatIdCounter(oFormatIdCounter) { bIdOpen = false; bIdFormat = false; bSolved = false; bDurableId = false; } CComment::~CComment() { for(size_t i = 0; i bIdFormat = true; pComment->IdFormat = (_INT32)(IdFormatStart + i + 1); } } std::wstring CComment::writeRef(const std::wstring& sBefore, const std::wstring& sRef, const std::wstring& sAfter) { std::wstring sRes; sRes += (writeRef(this, sBefore, sRef, sAfter)); for(size_t i = 0; i< replies.size(); ++i) { sRes += (writeRef(replies[i], sBefore, sRef, sAfter)); } return sRes; } std::wstring CComment::writeRef(CComment* pComment, const std::wstring& sBefore, const std::wstring& sRef, const std::wstring& sAfter) { std::wstring sRes; if (!pComment->bIdFormat) { pComment->bIdFormat = true; pComment->IdFormat = pComment->m_oFormatIdCounter.getNextId(); } sRes += (sBefore); sRes += L"<" + sRef + L" w:id=\"" + std::to_wstring(pComment->IdFormat) + L"\"/>"; sRes += (sAfter); return sRes; } void CComment::writeContentWritePart(CComment* pComment, std::wstring& sText, _INT32 nPrevIndex, _INT32 nCurIndex, std::wstring& sRes) { std::wstring sPart; if (nPrevIndex < nCurIndex) sPart = XmlUtils::EncodeXmlString(sText.substr(nPrevIndex, nCurIndex - nPrevIndex)); _INT32 nId = pComment->m_oParaIdCounter.getNextId(); pComment->sParaId = XmlUtils::ToString(nId, L"%08X"); sRes += L"sParaId + L"\" w14:textId=\"" + pComment->sParaId + L"\">"; sRes += L""; sRes += sPart; sRes += L""; } std::wstring CComment::writeContent(CComment* pComment) { std::wstring sRes; if (!pComment->bIdFormat) { pComment->bIdFormat = true; pComment->IdFormat = pComment->m_oFormatIdCounter.getNextId(); } sRes += L"IdFormat) + L"\""; if (false == pComment->UserName.empty()) { std::wstring sUserName = XmlUtils::EncodeXmlString(pComment->UserName); sRes += L" w:author=\""; sRes += XmlUtils::EncodeXmlString(sUserName); sRes += L"\""; } if (false == pComment->Date.empty()) { std::wstring sDate = XmlUtils::EncodeXmlString(pComment->Date); sRes += L" w:date=\""; sRes += sDate; sRes += L"\""; } if (false == pComment->Initials.empty()) { sRes += L" w:initials=\""; sRes += XmlUtils::EncodeXmlString(pComment->Initials); sRes += L"\""; } sRes += L">"; if (false == pComment->sContent.empty()) { sRes += pComment->sContent; } else { //old comments std::wstring sText = pComment->Text; XmlUtils::replace_all(sText, L"\r", L""); _INT32 nPrevIndex = 0; for (size_t i = 0; i < sText.length(); i++) { wchar_t cToken = sText[i]; if ('\n' == cToken) { writeContentWritePart(pComment, sText, nPrevIndex, i, sRes); nPrevIndex = i + 1; } } writeContentWritePart(pComment, sText, nPrevIndex, (_INT32)sText.length(), sRes); } sRes += L""; return sRes; } std::wstring CComment::writeContentExt(CComment* pComment) { std::wstring sRes; if (false == pComment->sParaId.empty()) { std::wstring sDone(L"0"); if (pComment->bSolved && pComment->Solved) sDone = _T("1"); if (!pComment->sParaIdParent.empty()) sRes += L"sParaId + L"\" \ w15:paraIdParent=\"" + pComment->sParaIdParent + L"\" w15:done=\"" + sDone + L"\"/>"; else sRes += L"sParaId + L"\" w15:done=\"" + sDone + L"\"/>"; //расставляем paraIdParent for(size_t i = 0; i < pComment->replies.size(); i++) pComment->replies[i]->sParaIdParent = pComment->sParaId; } return sRes; } std::wstring CComment::writeContentExtensible(CComment* pComment) { std::wstring sRes; if (pComment->bDurableId && !pComment->DateUtc.empty()) { sRes += L"DurableId, L"%08X") + L"\" w16cex:dateUtc=\"" + pComment->DateUtc + L"\"/>"; } return sRes; } std::wstring CComment::writeContentUserData(CComment* pComment) { std::wstring sRes; if (pComment->bDurableId && !pComment->UserData.empty()) { sRes += L"DurableId, L"%08X") + L"\">"; sRes += L"UserData); sRes += L"\" providerId=\"AD\"/>"; } return sRes; } std::wstring CComment::writeContentsIds(CComment* pComment) { std::wstring sRes; if (!pComment->sParaId.empty() && pComment->bDurableId) { sRes += L"sParaId + L"\" w16cid:durableId=\"" + XmlUtils::ToString(pComment->DurableId, L"%08X") + L"\"/>"; } return sRes; } std::wstring CComment::writePeople(CComment* pComment) { std::wstring sRes; if (false == pComment->UserName.empty()) { sRes += L"UserName); sRes += L"\">"; if (!pComment->ProviderId.empty() && !pComment->UserId.empty()) { sRes += L"ProviderId); sRes += L"\" w15:userId=\""; sRes += XmlUtils::EncodeXmlString(pComment->UserId); sRes += L"\"/>"; } sRes += L""; } return sRes; } CComments::CComments() : m_oParaIdCounter(1) { } CComments::~CComments() { for (boost::unordered_map<_INT32, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { delete it->second; } m_mapComments.clear(); } void CComments::add(CComment* pComment) { if (pComment->bIdOpen) { m_mapComments[pComment->IdOpen] = pComment; addAuthor(pComment); for(size_t i = 0; i < pComment->replies.size(); i++) addAuthor(pComment->replies[i]); } } void CComments::addAuthor(CComment* pComment) { if (false == pComment->UserName.empty() && false == pComment->UserId.empty()) m_mapAuthors[pComment->UserName] = pComment; } CComment* CComments::get(_INT32 nInd) { CComment* pRes = NULL; boost::unordered_map<_INT32, CComment*>::const_iterator pair = m_mapComments.find(nInd); if (m_mapComments.end() != pair) pRes = pair->second; return pRes; } _INT32 CComments::getNextId(_INT32 nCount) { return m_oFormatIdCounter.getNextId(nCount); } std::wstring CComments::writeContent() { std::wstring sRes; for (boost::unordered_map<_INT32, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContent(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContent(it->second->replies[i]); } return sRes; } std::wstring CComments::writeContentExt() { std::wstring sRes; for (boost::unordered_map<_INT32, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentExt(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentExt(it->second->replies[i]); } return sRes; } std::wstring CComments::writeContentExtensible() { std::wstring sRes; for (boost::unordered_map<_INT32, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentExtensible(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentExtensible(it->second->replies[i]); } return sRes; } std::wstring CComments::writeContentUserData() { std::wstring sRes; for (boost::unordered_map<_INT32, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentUserData(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentUserData(it->second->replies[i]); } return sRes; } std::wstring CComments::writeContentsIds() { std::wstring sRes; for (boost::unordered_map<_INT32, CComment*>::const_iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sRes += CComment::writeContentsIds(it->second); for(size_t i = 0; i < it->second->replies.size(); ++i) sRes += CComment::writeContentsIds(it->second->replies[i]); } return sRes; } std::wstring CComments::writePeople() { std::wstring sRes; for (boost::unordered_map::const_iterator it = m_mapAuthors.begin(); it != m_mapAuthors.end(); ++it) { sRes += (it->second->writePeople(it->second)); } return sRes; } CDrawingPropertyWrapPoint::CDrawingPropertyWrapPoint() { bX = false; bY = false; } CDrawingPropertyWrap::CDrawingPropertyWrap() { bWrappingType = false; bEdited = false; bStart = false; } CDrawingPropertyWrap::~CDrawingPropertyWrap() { for(size_t i = 0; i < Points.size(); ++i) delete Points[i]; Points.clear(); } CDrawingProperty::CDrawingProperty(_INT32 nDocPr) { m_nDocPr = nDocPr; bObject = false; nObjectType = 0; nObjectId = 0; bDataPos = false; bDataLength = false; bType = false; bBehindDoc = false; bDistL = false; bDistT = false; bDistR = false; bDistB = false; bLayoutInCell = false; bRelativeHeight = false; bBSimplePos = false; bEffectExtentL = false; bEffectExtentT = false; bEffectExtentR = false; bEffectExtentB = false; bWidth = false; bHeight = false; bPositionHRelativeFrom = false; bPositionHAlign = false; bPositionHPosOffset = false; bPositionHPctOffset = false; bPositionVRelativeFrom = false; bPositionVAlign = false; bPositionVPosOffset = false; bPositionVPctOffset = false; bSimplePosX = false; bSimplePosY = false; bDrawingPropertyWrap = false; } bool CDrawingProperty::IsGraphicFrameContent() { return false == sGraphicFrameContent.empty(); } std::wstring CDrawingProperty::Write() { if (!bType) return L""; std::wstring sXml; bool bGraphicFrameContent = IsGraphicFrameContent(); if (c_oAscWrapStyle::Inline == Type) { if (bWidth && bHeight) { if (bGraphicFrameContent) { sXml += L"\ "; } else { sXml += L""; } if (bEffectExtentL && bEffectExtentT && bEffectExtentR && bEffectExtentB) { sXml += L""; } if (!sDocPr.empty()) { sXml += sDocPr; } else { sXml += L""; } if (!sGraphicFramePr.empty()) { sXml += sGraphicFramePr; } else { sXml += L""; } if (bGraphicFrameContent) { sXml += sGraphicFrameContent + L""; } else { sXml += L""; } } } else { if (bWidth && bHeight && ((bPositionHRelativeFrom && (bPositionHAlign || bPositionHPosOffset || bPositionHPctOffset) && bPositionVRelativeFrom && (bPositionVAlign || bPositionVPosOffset || bPositionVPctOffset)) || (bBSimplePos && bSimplePosX && bSimplePosY))) { _INT64 emuDistL = 0; _INT64 emuDistT = 0; _INT64 emuDistR = 0; _INT64 emuDistB = 0; if (bDistL) emuDistL = DistL; if (bDistT) emuDistT = DistT; if (bDistR) emuDistR = DistR; if (bDistB) emuDistB = DistB; _INT32 nSimplePos = 0; if (bBSimplePos && BSimplePos) nSimplePos = 1; _UINT32 nRelativeHeight = 0; if (bRelativeHeight) nRelativeHeight = RelativeHeight; _INT32 nBehindDoc = 0; if (bBehindDoc && BehindDoc) nBehindDoc = 1; _INT32 nLayoutInCell = 1; if (bLayoutInCell && false == LayoutInCell) nLayoutInCell = 0; if (bGraphicFrameContent) { sXml += L""; } sXml += L""; _INT64 emuX = 0; if (bSimplePosX) emuX = SimplePosX; _INT64 emuY = 0; if (bSimplePosY) emuY = SimplePosY; sXml += L""; if (bPositionHRelativeFrom && (bPositionHAlign || bPositionHPosOffset || bPositionHPctOffset)) { std::wstring sRelativeFrom; switch(PositionHRelativeFrom) { case 0: sRelativeFrom = _T("character");break; case 1: sRelativeFrom = _T("column");break; case 2: sRelativeFrom = _T("insideMargin");break; case 3: sRelativeFrom = _T("leftMargin");break; case 4: sRelativeFrom = _T("margin");break; case 5: sRelativeFrom = _T("outsideMargin");break; case 6: sRelativeFrom = _T("page");break; case 7: sRelativeFrom = _T("rightMargin");break; } std::wstring sContent; if (bPositionHAlign) { switch(PositionHAlign) { case 0: sContent = _T("center"); break; case 1: sContent = _T("inside"); break; case 2: sContent = _T("left"); break; case 3: sContent = _T("outside"); break; case 4: sContent = _T("right"); break; } } else if (bPositionHPosOffset) { sContent = L"" + std::to_wstring(PositionHPosOffset) + L""; } else if (bPositionHPctOffset) { _INT32 pctOffset = (_INT32)(1000 * PositionHPctOffset); sContent = L"" + std::to_wstring(pctOffset) + L""; } sXml += L"" + sContent + L""; } if (bPositionVRelativeFrom && (bPositionVAlign || bPositionVPosOffset || bPositionVPctOffset)) { std::wstring sRelativeFrom; switch(PositionVRelativeFrom) { case 0: sRelativeFrom = _T("bottomMargin");break; case 1: sRelativeFrom = _T("insideMargin");break; case 2: sRelativeFrom = _T("line");break; case 3: sRelativeFrom = _T("margin");break; case 4: sRelativeFrom = _T("outsideMargin");break; case 5: sRelativeFrom = _T("page");break; case 6: sRelativeFrom = _T("paragraph");break; case 7: sRelativeFrom = _T("topMargin");break; } std::wstring sContent; if (bPositionVAlign) { switch(PositionVAlign) { case 0: sContent = _T("bottom");break; case 1: sContent = _T("center");break; case 2: sContent = _T("inside");break; case 3: sContent = _T("outside");break; case 4: sContent = _T("top");break; } } else if (bPositionVPosOffset) { sContent = L"" + std::to_wstring(PositionVPosOffset) + L""; } else if (bPositionVPctOffset) { _INT32 pctOffset = (_INT32)(1000 * PositionVPctOffset); sContent = L"" + std::to_wstring(pctOffset) + L""; } sXml += L"" + sContent + L""; } sXml += L""; if (bEffectExtentL && bEffectExtentT && bEffectExtentR && bEffectExtentB) { sXml += L""; } if (bDrawingPropertyWrap && DrawingPropertyWrap.bWrappingType) { std::wstring sTagName; switch(DrawingPropertyWrap.WrappingType) { case c_oSerImageType2::WrapNone:sTagName = _T("wrapNone"); break; case c_oSerImageType2::WrapSquare:sTagName = _T("wrapSquare"); break; case c_oSerImageType2::WrapThrough:sTagName = _T("wrapThrough"); break; case c_oSerImageType2::WrapTight:sTagName = _T("wrapTight"); break; case c_oSerImageType2::WrapTopAndBottom:sTagName = _T("wrapTopAndBottom"); break; } if (DrawingPropertyWrap.bStart || DrawingPropertyWrap.Points.size() > 0) { if ( c_oSerImageType2::WrapSquare == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapThrough == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapTight == DrawingPropertyWrap.WrappingType) { sXml += L""; } else sXml += L""; _INT32 nEdited = 0; if (DrawingPropertyWrap.bEdited && DrawingPropertyWrap.Edited) nEdited = 1; sXml += L""; if (DrawingPropertyWrap.bStart && DrawingPropertyWrap.Start.bX && DrawingPropertyWrap.Start.bY) { sXml += L""; } for(size_t i = 0; i < DrawingPropertyWrap.Points.size(); ++i) { CDrawingPropertyWrapPoint* pWrapPoint = DrawingPropertyWrap.Points[i]; if (pWrapPoint->bX && pWrapPoint->bY) { sXml += L"X) + L"\" y=\"" + std::to_wstring(pWrapPoint->Y) + L"\"/>"; } } sXml += L""; sXml += L""; } else { //для wrapThrough и wrapTight wrapPolygon обязательное поле, если его нет - меняем тип. if ( c_oSerImageType2::WrapSquare == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapThrough == DrawingPropertyWrap.WrappingType || c_oSerImageType2::WrapTight == DrawingPropertyWrap.WrappingType) { sXml += L""; } else sXml += L""; } } else sXml += L""; if (!sDocPr.empty()) { sXml += sDocPr; } else { sXml += L""; } if (!sGraphicFramePr.empty()) { sXml += sGraphicFramePr; } else { sXml += L""; } if (bGraphicFrameContent) { sXml += sGraphicFrameContent; } if (!sSizeRelH.empty()) { sXml += sSizeRelH; } if (!sSizeRelV.empty()) { sXml += sSizeRelV; } sXml += L""; if (bGraphicFrameContent) sXml += L""; } } return sXml; } bool CWiterTblPr::IsEmpty() { return Style.empty() && Props.empty() && tblPrChange.empty() && Caption.empty() && Description.empty(); } std::wstring CWiterTblPr::Write() { std::wstring sRes; sRes += L""; sRes += Style; // first sRes += Props; if (!Caption.empty()) { sRes += L""; } if (!Description.empty()) { sRes += L""; } sRes += tblPrChange; sRes += L""; return sRes; } CHyperlink::CHyperlink() { bHistory = false; } void CHyperlink::Write(NSStringUtils::CStringBuilder& wr) { wr.WriteString(L""); wr.Write(writer); wr.WriteString(L""); } CFldSimple::CFldSimple() { } void CFldSimple::Write(NSStringUtils::CStringBuilder& wr) { if (false == sInstr.empty()) { std::wstring sCorrect_Instr = XmlUtils::EncodeXmlString(sInstr); std::wstring sStart(L""; wr.WriteString(sStart); wr.Write(writer); wr.WriteString(L""); } } TrackRevision::TrackRevision() { Id = NULL; vMerge = NULL; vMergeOrigin = NULL; tblPr = NULL; tblGridChange = NULL; trPr = NULL; tcPr = NULL; content = NULL; contentRun = NULL; } TrackRevision::~TrackRevision() { RELEASEOBJECT(Id); RELEASEOBJECT(vMerge); RELEASEOBJECT(vMergeOrigin); RELEASEOBJECT(tblPr); RELEASEOBJECT(tblGridChange); RELEASEOBJECT(trPr); RELEASEOBJECT(tcPr); RELEASEOBJECT(content); RELEASEOBJECT(contentRun); } void TrackRevision::Write(NSStringUtils::CStringBuilder* pCStringWriter, std::wstring sName) { if (IsNoEmpty()) { pCStringWriter->WriteString(L"<"); pCStringWriter->WriteString(sName); if (NULL != Id) { pCStringWriter->WriteString(L" w:id=\"" + std::to_wstring(*Id) + L"\""); } if (!Author.empty()) { pCStringWriter->WriteString(L" w:author=\""); pCStringWriter->WriteEncodeXmlString(Author); pCStringWriter->WriteString(L"\""); } if (!Date.empty()) { pCStringWriter->WriteString(L" w:date=\""); pCStringWriter->WriteEncodeXmlString(Date); pCStringWriter->WriteString(L"\""); } if (!UserId.empty()) { pCStringWriter->WriteString(L" oouserid=\""); pCStringWriter->WriteEncodeXmlString(UserId); pCStringWriter->WriteString(L"\""); } if (NULL != vMerge) { pCStringWriter->WriteString(L" w:vMerge=\"" + std::to_wstring(*vMerge) + L"\""); } if ( NULL != vMergeOrigin ) { pCStringWriter->WriteString(L" w:vMergeOrig=\"" + std::to_wstring(*vMergeOrigin) + L"\""); } if ( NULL != tblPr || NULL != tblGridChange || NULL != trPr || NULL != tcPr || NULL != content || NULL != contentRun) { pCStringWriter->WriteString(L">"); if (NULL != tblPr) { pCStringWriter->WriteString(tblPr->Write()); } if (NULL != tblGridChange) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*tblGridChange); pCStringWriter->WriteString(L""); } if (NULL != trPr) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*trPr); pCStringWriter->WriteString(L""); } if (NULL != tcPr) { pCStringWriter->WriteString(L""); pCStringWriter->Write(*tcPr); pCStringWriter->WriteString(L""); } if (NULL != content) { pCStringWriter->Write(*content); } if (NULL != contentRun) { pCStringWriter->Write(*contentRun); } pCStringWriter->WriteString(L"WriteString(sName); pCStringWriter->WriteString(L">"); } else { pCStringWriter->WriteString(L"/>"); } } } bool TrackRevision::IsNoEmpty() { return !Author.empty() || !Date.empty() || NULL != Id; } std::wstring TrackRevision::ToString(std::wstring sName) { NSStringUtils::CStringBuilder writer; Write(&writer, sName); return writer.GetData(); } }