/* * (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 #include "RtfField.h" #include "../OOXml/Writer/OOXWriter.h" #include "../OOXml/Writer/OOXRelsWriter.h" OOXFieldBegin::OOXFieldBegin() { SetDefault(); } int OOXFieldBegin::GetType() { return TYPE_OOX_FIELD; } void OOXFieldBegin::SetDefault() { m_bDirty = PROP_DEF; m_bLock = PROP_DEF; m_oCharProperty.SetDefault(); } std::wstring OOXFieldBegin::RenderToRtf(RenderParameter oRenderParameter) { std::wstring sResult; sResult += L"{\\field "; RENDER_RTF_BOOL( m_bDirty, sResult, L"flddirty" ) RENDER_RTF_BOOL( m_bLock, sResult, L"fldlock" ) sResult += L"{\\*\\fldinst"; sResult += m_oCharProperty.RenderToRtf(oRenderParameter); return sResult; } std::wstring OOXFieldBegin::RenderToOOX(RenderParameter oRenderParameter) { std::wstring sResult; sResult += L""; std::wstring props = m_oCharProperty.RenderToOOX(oRenderParameter); if (props.empty()) { sResult += L""; sResult += props; sResult += L""; } sResult += L""; sResult += L""; return sResult; } int OOXFieldInsertText::GetType() { return TYPE_OOX_FIELD; } std::wstring OOXFieldInsertText::RenderToRtf(RenderParameter oRenderParameter) { if( NULL != m_oText ) return m_oText->RenderToRtf( oRenderParameter ); else return L""; } std::wstring OOXFieldInsertText::RenderToOOX(RenderParameter oRenderParameter) { if( NULL != m_oText ) { std::wstring sResult; sResult += L""; sResult += L""; oRenderParameter.nType = RENDER_TO_RTF_PARAM_CHAR; oRenderParameter.nValue = RENDER_TO_RTF_PARAM_NO_PAR; sResult += m_oText->RenderToOOX( oRenderParameter ); sResult += L""; sResult += L""; return sResult; } else return L""; } int OOXFieldSeparate::GetType() { return TYPE_OOX_FIELD; } std::wstring OOXFieldSeparate::RenderToRtf(RenderParameter oRenderParameter) { std::wstring sResult; return L"}{\\fldrslt"; } std::wstring OOXFieldSeparate::RenderToOOX(RenderParameter oRenderParameter) { return L""; } int OOXFieldEnd::GetType() { return TYPE_OOX_FIELD; } std::wstring OOXFieldEnd::RenderToRtf(RenderParameter oRenderParameter) { std::wstring sResult; return L"}}"; } std::wstring OOXFieldEnd::RenderToOOX(RenderParameter oRenderParameter) { return L""; } RtfFormField::RtfFormField() { } int RtfFormField::GetType() { return TYPE_OOX_FORMFIELD; } std::wstring RtfFormField::RenderToRtf(RenderParameter oRenderParameter) { return L""; } std::wstring RtfFormField::RenderToOOX(RenderParameter oRenderParameter) { return L""; } RtfFieldInst::RtfFieldInst() { SetDefault(); } void RtfFieldInst::SetDefaultRtf() { SetDefault(); } void RtfFieldInst::SetDefaultOOX() { SetDefault(); } void RtfFieldInst::SetDefault() { m_pTextItems = TextItemContainerPtr( new TextItemContainer() ); } std::wstring RtfFieldInst::RenderToRtf(RenderParameter oRenderParameter) { return L""; } std::wstring RtfFieldInst::RenderToOOX(RenderParameter oRenderParameter) { RtfDocument* pRtfDocument = static_cast (oRenderParameter.poDocument); OOXWriter* pOOXWriter = static_cast (oRenderParameter.poWriter); if (m_pTextItems) return m_pTextItems->RenderToOOX(oRenderParameter); else return L""; } RtfField::RtfField() { SetDefault(); } int RtfField::GetType() { return TYPE_RTF_FIELD; } bool RtfField::IsValid() { return true; //return false == m_oInsert.IsValid() && false == m_oResult.IsValid(); } void RtfField::SetDefaultRtf() { SetDefault(); } void RtfField::SetDefaultOOX() { SetDefault(); } void RtfField::SetDefault() { m_eMode = fm_none; m_bReferenceToEndnote = false; m_bTextOnly = false; m_sData = L""; m_pResult = RtfFieldInstPtr(new RtfFieldInst()); m_pInsert = RtfFieldInstPtr(new RtfFieldInst()); m_oCharProperty.SetDefault(); } std::wstring RtfField::RenderToRtf(RenderParameter oRenderParameter) { std::wstring sResult; sResult += L"{\\field "; if( fm_none != m_eMode ) { switch( m_eMode ) { case fm_flddirty: sResult += L"{\\flddirty "; break; case fm_fldedit: sResult += L"{\\fldedit "; break; case fm_fldlock: sResult += L"{\\fldlock "; break; case fm_fldpriv: sResult += L"{\\fldpriv "; break; } } sResult += L"{\\*\\fldinst "; RenderParameter oNewParam = oRenderParameter; oNewParam.nType = RENDER_TO_RTF_PARAM_PLAIN;//RENDER_TO_RTF_PARAM_CHAR; oNewParam.nValue = RENDER_TO_RTF_PARAM_NO_PAR; sResult += m_pInsert->m_pTextItems->RenderToRtf( oNewParam ); if( true == m_bReferenceToEndnote ) sResult += L"\\fldalt"; if( !m_sData.empty() ) sResult += L"{\\*\\datafield " + m_sData + L"}"; sResult += L"}"; std::wstring str = m_pResult->m_pTextItems->RenderToRtf( oRenderParameter ) ; sResult += L"{\\fldrslt " + str + L"}"; sResult += L"}"; return sResult; } std::wstring RtfField::RenderToOOX(RenderParameter oRenderParameter) { RtfDocument* pRtfDocument = static_cast (oRenderParameter.poDocument); OOXWriter* pOOXWriter = static_cast (oRenderParameter.poWriter); std::wstring sResult; if( true == m_bTextOnly ) { RenderParameter oNewParam = oRenderParameter; oNewParam.nType = RENDER_TO_OOX_PARAM_RUN; sResult += m_pResult->m_pTextItems->RenderToOOX(oNewParam); } else { bool bInsert = false; bool bDelete = false; std::wstring sAuthor, sDate; if (m_pInsert->m_oCharProperty.m_nRevised != PROP_DEF) { bInsert = true; sAuthor = pRtfDocument->m_oRevisionTable.GetAuthor(m_pInsert->m_oCharProperty.m_nRevauth); sDate = std::wstring(RtfUtility::convertDateTime(m_pInsert->m_oCharProperty.m_nRevdttm).c_str()); sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_pInsert->m_oCharProperty.m_nRevised = PROP_DEF; } if (m_pInsert->m_oCharProperty.m_nDeleted != PROP_DEF) { bDelete = true; sAuthor = pRtfDocument->m_oRevisionTable.GetAuthor(m_pInsert->m_oCharProperty.m_nRevauthDel); sDate = std::wstring(RtfUtility::convertDateTime(m_pInsert->m_oCharProperty.m_nRevdttmDel).c_str()); sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_pInsert->m_oCharProperty.m_nDeleted = PROP_DEF; } //поверяем на наличие гиперссылки RenderParameter oNewParam = oRenderParameter; oNewParam.nType = RENDER_TO_OOX_PARAM_PLAIN; std::wstring sInsertText = m_pInsert->m_pTextItems->RenderToOOX( oNewParam ); size_t nIndex = sInsertText.find( L"HYPERLINK" ); if ( std::wstring::npos != nIndex && (m_pResult) && (m_pResult->m_pTextItems) && m_pResult->m_pTextItems->GetCount() < 2) { std::wstring sHyperlink = sInsertText; sHyperlink.erase( nIndex, 9/*(int)_tcslen( L"HYPERLINK" )*/ ); size_t nSplash = sHyperlink.find( L"\\" ); if (std::wstring::npos != nSplash) { sHyperlink = sHyperlink.substr(0, nSplash); } //оставляем только одну ссылку XmlUtils::replace_all(sHyperlink, L"\"", L"" ); boost::algorithm::trim(sHyperlink); //заменяем пробелы на %20 XmlUtils::replace_all(sHyperlink, L" ", L"%20" ); //добавляем в rels OOXRelsWriter* poRelsWriter = static_cast( oRenderParameter.poRels ); std::wstring sId = poRelsWriter->AddRelationship( L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", XmlUtils::EncodeXmlString( sHyperlink ), false ); //добавляем гиперссылку в документ sResult += L""; oNewParam.nType = RENDER_TO_OOX_PARAM_RUN; sResult += m_pResult->RenderToOOX(oNewParam); sResult += L""; } else if ((m_pInsert->m_pFormField) && (m_pInsert->m_pFormField->type == 2)) { _UINT32 id = 0x7fff + pOOXWriter->m_nFormFieldId++; std::wstring text_ = m_pInsert->m_pFormField->defres < m_pInsert->m_pFormField->list.size() ? m_pInsert->m_pFormField->list[m_pInsert->m_pFormField->defres] : L""; sResult += L""; for (size_t i = 0; i < m_pInsert->m_pFormField->list.size(); i++) { sResult += L"m_pFormField->list[i]) + L"\" w:displayText=\"" + m_pInsert->m_pFormField->list[i] + L"\"/>"; } sResult += L""; sResult += L"" + XmlUtils::EncodeXmlString(text_) + L""; sResult += L""; } else { RenderParameter oNewParametr = oRenderParameter; oNewParametr.nType = RENDER_TO_OOX_PARAM_FIELD; std::wstring props = m_pResult->m_oCharProperty.RenderToOOX(oRenderParameter); if (!props.empty()) props = L"" + props + L""; //начинаем Field sResult += L""; if (!props.empty()) sResult += props; sResult += L"m_pFormField) { sResult += L">"; sResult += L"m_pFormField->name) + L"\"/>"; sResult += L""; if (m_pInsert->m_pFormField->recalc == 1) sResult += L""; else sResult += L""; if (false == m_pInsert->m_pFormField->entrymcr.empty()) sResult += L"m_pFormField->entrymcr + L"\"/>"; if (false == m_pInsert->m_pFormField->exitmcr.empty()) sResult += L"m_pFormField->exitmcr + L"\"/>"; if (false == m_pInsert->m_pFormField->helptext.empty()) sResult += L"m_pFormField->helptext) + L"\"/>"; if (false == m_pInsert->m_pFormField->stattext.empty()) sResult += L"m_pFormField->stattext) + L"\"/>"; if (m_pInsert->m_pFormField->type == 0) { sResult += L""; switch (m_pInsert->m_pFormField->typetx) { case 1: sResult += L""; break; case 2: sResult += L""; break; case 3: sResult += L""; break; case 4: sResult += L""; break; case 5: sResult += L""; break; } if (false == m_pInsert->m_pFormField->deftext.empty()) sResult += L"m_pFormField->deftext) + L"\"/>"; if (false == m_pInsert->m_pFormField->format.empty()) sResult += L"m_pFormField->format) + L"\"/>"; if (m_pInsert->m_pFormField->maxlen > 0) sResult += L"m_pFormField->maxlen) + L"\"/>"; sResult += L""; } else if (m_pInsert->m_pFormField->type == 1) { sResult += L""; if (m_pInsert->m_pFormField->sizeCheckBox == 1) sResult += L"m_pFormField->hps) + L"\"/>"; else sResult += L""; sResult += L""; if (m_pInsert->m_pFormField->res == 1) { sResult += L""; } else { sResult += L""; } sResult += L""; } sResult += L""; } else sResult += L"/>"; sResult += L""; //----------- if ((m_pInsert->m_pTextItems) && (m_pInsert->m_pTextItems->GetCount() > 0)) { for (int i = 0; i < m_pInsert->m_pTextItems->GetCount(); i++) { sResult += m_pInsert->m_pTextItems->m_aArray[i]->RenderToOOX(oNewParametr); } } oNewParametr = oRenderParameter; // разделитель sResult += L""; sResult += L""; //пишем содержание-кэш if ((m_pResult->m_pTextItems) && (m_pResult->m_pTextItems->GetCount() > 0)) { sResult += m_pResult->m_pTextItems->m_aArray[0]->RenderToOOX(oNewParametr); for (int i = 1; i < m_pResult->m_pTextItems->GetCount(); i++) { RtfParagraph *paragraph = dynamic_cast(m_pResult->m_pTextItems->m_aArray[i].get()); if (paragraph) { if (bDelete) sResult += L""; if (bInsert) sResult += L""; bDelete = bInsert = false; sResult += L""; sResult += L""; sResult += L""; sResult += paragraph->m_oProperty.RenderToOOX(oRenderParameter); sResult += L""; } sResult += m_pResult->m_pTextItems->m_aArray[i]->RenderToOOX(oNewParametr); } } else { sResult += L""; if (!props.empty()) sResult += props; sResult += L""; } //заканчиваем Field sResult += L""; if (!props.empty()) sResult += props; sResult += L""; //sResult += L""; } if (bDelete) sResult += L""; if (bInsert) sResult += L""; } return sResult; }