1265 lines
46 KiB
C++
1265 lines
46 KiB
C++
/*
|
|
* (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 "../OOXml/Writer/OOXWriter.h"
|
|
#include "IdGenerator.h"
|
|
|
|
RtfDocumentProperty::RtfDocumentProperty()
|
|
{
|
|
SetDefault();
|
|
}
|
|
int RtfDocumentProperty::GetType()
|
|
{
|
|
return TYPE_RTF_PROPERTY_DOCUMENT;
|
|
}
|
|
bool RtfDocumentProperty::IsValid()
|
|
{
|
|
return true;
|
|
}
|
|
void RtfDocumentProperty::SetDefaultRtf()
|
|
{
|
|
SetDefault();
|
|
m_bUseTabAlignment = 0;
|
|
}
|
|
void RtfDocumentProperty::SetDefaultOOX()
|
|
{
|
|
SetDefault();
|
|
}
|
|
void RtfDocumentProperty::SetDefault()
|
|
{
|
|
m_sDefFontName = L"Times New Roman";
|
|
m_nDefFontSize = 24;
|
|
|
|
m_eCodePage = cp_ansi;
|
|
m_nTabWidth = 720; //todo -1
|
|
m_nDefFont = PROP_DEF;
|
|
m_nDefMathFont = PROP_DEF;
|
|
m_nDefLang = PROP_DEF;
|
|
m_nDefLangAsian = PROP_DEF;
|
|
m_bHypCaps = PROP_DEF;
|
|
m_bAutoHyp = PROP_DEF;
|
|
m_nMaxHypen = PROP_DEF;
|
|
m_nHyphenationRight = PROP_DEF;
|
|
m_nZoom = 100;
|
|
m_nAnsiCodePage = CP_ACP;
|
|
|
|
m_bDorderSurroundHeader = PROP_DEF;
|
|
m_bDorderSurroundFotter = PROP_DEF;
|
|
m_bAlignBordersAndEdges = PROP_DEF;
|
|
|
|
m_bRtlGutter = PROP_DEF;
|
|
m_bRtl = PROP_DEF;
|
|
|
|
m_nThemelang = PROP_DEF;
|
|
m_nThemelangfe = PROP_DEF;
|
|
m_nThemelangcs = PROP_DEF;
|
|
|
|
m_nPaperWidth = 11900;
|
|
m_nPaperHeight = 16840;
|
|
m_nMarginLeft = 1701;
|
|
m_nMarginRight = 850;
|
|
m_nMarginTop = 1134;
|
|
m_nMarginBottom = 1134;
|
|
m_bFacingPage = PROP_DEF;
|
|
m_nGutterWidth = 0;
|
|
m_nGutterWidthOutside = PROP_DEF;
|
|
m_bGutterAtTop = PROP_DEF;
|
|
m_bSwitchMargins = PROP_DEF;
|
|
m_bLandScape = PROP_DEF;
|
|
m_nBeginningPageNumber = PROP_DEF;
|
|
m_nDisplayBackground = PROP_DEF;
|
|
m_bUseTabAlignment = PROP_DEF;
|
|
|
|
m_nDrawingGridHorizontalSpacing = PROP_DEF;
|
|
m_nDrawingGridVerticalSpacing = PROP_DEF;
|
|
m_nDrawingGridHorizontalOrigin = PROP_DEF;
|
|
m_nDrawingGridVerticalOrigin = PROP_DEF;
|
|
m_nDisplayHorizontalDrawingGridEvery= PROP_DEF; //def = 3
|
|
m_nDisplayVerticalDrawingGridEvery = PROP_DEF; //def = 0
|
|
|
|
m_aSpecialFootnotes.clear();
|
|
m_nFootnoteNumberingFormat = PROP_DEF;
|
|
m_nFootnoteStart = PROP_DEF;
|
|
m_eFootnoteRestart = fr_None;
|
|
m_eFootnotePlacement = fp_None;
|
|
|
|
m_aSpecialEndnotes.clear();
|
|
m_nEndnoteNumberingFormat = PROP_DEF;
|
|
m_nEndnoteStart = PROP_DEF;
|
|
m_eEndnoteRestart = er_None;
|
|
m_eEndnotePlacement = ep_None;
|
|
|
|
m_bSplitPageBrake = 1;
|
|
m_bHtmlAutoSpace = PROP_DEF;
|
|
}
|
|
std::wstring RtfDocumentProperty::GetRtfFormat( int nFormat, bool bFootnote )
|
|
{
|
|
if( PROP_DEF == nFormat )
|
|
{
|
|
if( true == bFootnote ) return L"ftnnar";
|
|
else return L"aftnnar";
|
|
}
|
|
if( true == bFootnote )
|
|
{
|
|
switch( nFormat )
|
|
{
|
|
case 0: return L"ftnnar";
|
|
case 4: return L"ftnnalc";
|
|
case 3: return L"ftnnauc";
|
|
case 2: return L"ftnnrlc";
|
|
case 1: return L"ftnnruc";
|
|
case 70: return L"ftnnchi";
|
|
case 25: return L"ftnnchi";
|
|
case 18: return L"ftnncnum";
|
|
case 10: return L"ftnndbnum";
|
|
case 11: return L"ftnndbnumd";
|
|
case 16: return L"ftnndbnumt";
|
|
case 17: return L"ftnndbnumk";
|
|
case 20: return L"ftnndbar";
|
|
case 24: return L"ftnnganada";
|
|
case 26: return L"ftnngbnum";
|
|
case 27: return L"ftnngbnumd";
|
|
case 28: return L"ftnngbnuml";
|
|
case 29: return L"ftnngbnumk";
|
|
case 30: return L"ftnnzodiac";
|
|
case 31: return L"ftnnzodiacd";
|
|
case 32: return L"ftnnzodiacl";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch( nFormat )
|
|
{
|
|
case 0: return L"aftnnar";
|
|
case 4: return L"aftnnalc";
|
|
case 3: return L"aftnnauc";
|
|
case 2: return L"aftnnrlc";
|
|
case 1: return L"aftnnruc";
|
|
case 70: return L"aftnnchi";
|
|
case 25: return L"aftnnchi";
|
|
case 18: return L"aftnncnum";
|
|
case 10: return L"aftnndbnum";
|
|
case 11: return L"aftnndbnumd";
|
|
case 16: return L"aftnndbnumt";
|
|
case 17: return L"aftnndbnumk";
|
|
case 20: return L"aftnndbar";
|
|
case 24: return L"aftnnganada";
|
|
case 26: return L"aftnngbnum";
|
|
case 27: return L"aftnngbnumd";
|
|
case 28: return L"aftnngbnuml";
|
|
case 29: return L"aftnngbnumk";
|
|
case 30: return L"aftnnzodiac";
|
|
case 31: return L"aftnnzodiacd";
|
|
case 32: return L"aftnnzodiacl";
|
|
}
|
|
}
|
|
if( true == bFootnote ) return L"ftnnar";
|
|
else return L"aftnnar";
|
|
}
|
|
std::wstring RtfDocumentProperty::RenderToRtf(RenderParameter oRenderParameter)
|
|
{
|
|
std::wstring sResult;
|
|
switch( m_eCodePage )
|
|
{
|
|
case cp_ansi:
|
|
{
|
|
sResult += L"\\ansi";
|
|
if( PROP_DEF != m_nAnsiCodePage )
|
|
sResult += L"\\ansicpg" + std::to_wstring( m_nAnsiCodePage );
|
|
|
|
break;
|
|
}
|
|
case cp_mac: sResult += L"\\mac"; break;
|
|
case cp_pc: sResult += L"\\pc"; break;
|
|
case cp_pca: sResult += L"\\pca"; break;
|
|
}
|
|
RENDER_RTF_BOOL ( m_bHypCaps, sResult, L"hyphcaps" )
|
|
RENDER_RTF_BOOL ( m_bAutoHyp, sResult, L"hyphauto" )
|
|
RENDER_RTF_INT ( m_nMaxHypen, sResult, L"hyphconsec" )
|
|
RENDER_RTF_INT ( m_nHyphenationRight, sResult, L"hyphhotz" )
|
|
RENDER_RTF_INT ( m_nTabWidth, sResult, L"deftab" )
|
|
RENDER_RTF_INT ( m_nZoom, sResult, L"viewscale" )
|
|
|
|
//Page Borders
|
|
RENDER_RTF_BOOL ( m_bDorderSurroundHeader, sResult, L"pgbrdrhead" )
|
|
RENDER_RTF_BOOL ( m_bDorderSurroundFotter, sResult, L"pgbrdrfoot" )
|
|
|
|
RENDER_RTF_BOOL ( m_bAlignBordersAndEdges, sResult, L"pgbrdrsnap" )
|
|
|
|
//Page Information
|
|
//эти свойства пишутся в первой секции
|
|
//public: int m_nPaperWidth; // paperwN Paper width in twips (default is 12,240).
|
|
//public: int m_nPaperHeight; // paperhN Paper height in twips (default is 15,840).
|
|
//public: int m_nMarginLeft; // marglN Left margin in twips (default is 1800).
|
|
//public: int m_nMarginRight; // margrN Right margin in twips (default is 1800).
|
|
//public: int m_nMarginTop; // margtN Top margin in twips (default is 1440).
|
|
//public: int m_nMarginBottom; // margbN Bottom margin in twips (default is 1440).
|
|
//public: int m_bFacingPage; //(mirrorMargins)\facingp Facing pages (activates odd/even headers and gutters).
|
|
//public: int m_nGutterWidth; // gutterN Gutter width in twips (default is 0).
|
|
//public: int m_nGutterWidthOutside; // ogutterN Outside gutter width (default is 0; not used by Word, but in 1987 RTF Spec)
|
|
// RENDER_RTF_BOOL( m_bLandScape, sResult, L"landscape" )
|
|
|
|
RENDER_RTF_BOOL( m_bGutterAtTop, sResult, L"gutterprl" )
|
|
RENDER_RTF_BOOL( m_bSwitchMargins, sResult, L"margmirror" )
|
|
RENDER_RTF_BOOL( m_bFacingPage, sResult, L"facingp" )
|
|
|
|
//Compatibility Options
|
|
RENDER_RTF_INT( m_nDisplayBackground, sResult, L"viewbksp" )
|
|
RENDER_RTF_BOOL( m_bUseTabAlignment, sResult, L"useltbaln" )
|
|
|
|
//footnote, endnote property
|
|
if( PROP_DEF != m_nFootnoteNumberingFormat )
|
|
sResult += L"\\" + GetRtfFormat(m_nFootnoteNumberingFormat, true);
|
|
|
|
RENDER_RTF_INT( m_nFootnoteStart, sResult, L"ftnstart" )
|
|
|
|
if( PROP_DEF != m_eFootnoteRestart )
|
|
{
|
|
switch( m_eFootnoteRestart )
|
|
{
|
|
case fr_EachPage: sResult += L"\\ftnrstpg" ; break;
|
|
case fr_EachSection: sResult += L"\\ftnrestart"; break;
|
|
case fr_Continuous: sResult += L"\\ftnrstcont"; break;
|
|
}
|
|
}
|
|
|
|
if( PROP_DEF != m_eFootnotePlacement )
|
|
{
|
|
switch( m_eFootnoteRestart )
|
|
{
|
|
case fp_EndSection: sResult += L"\\endnotes"; break;
|
|
case fp_EndDocument: sResult += L"\\enddoc"; break;
|
|
case fp_BeneathText: sResult += L"\\ftntj"; break;
|
|
case fp_BottomPage: sResult += L"\\ftnbj"; break;
|
|
}
|
|
}
|
|
|
|
if( PROP_DEF != m_nEndnoteNumberingFormat )
|
|
sResult += L"\\" + GetRtfFormat(m_nEndnoteNumberingFormat, false);
|
|
|
|
RENDER_RTF_INT( m_nEndnoteStart, sResult, L"aftnstart" )
|
|
|
|
if( PROP_DEF != m_eEndnoteRestart )
|
|
{
|
|
switch( m_eEndnoteRestart )
|
|
{
|
|
case er_EachSection: sResult += L"\\aftnrestart"; break;
|
|
case er_Continuous: sResult += L"\\aftnrstcont"; break;
|
|
}
|
|
}
|
|
if( PROP_DEF != m_eEndnotePlacement )
|
|
{
|
|
switch( m_eEndnotePlacement )
|
|
{
|
|
case ep_EndSection: sResult += L"\\aendnotes"; break;
|
|
case ep_EndDocument: sResult += L"\\aenddoc"; break;
|
|
case ep_BeneathText: sResult += L"\\aftntj"; break;
|
|
case ep_BottomPage: sResult += L"\\aftnbj"; break;
|
|
}
|
|
}
|
|
|
|
//для схоранения в RTF
|
|
RENDER_RTF_INT( m_bSplitPageBrake, sResult, L"spltpgpar" )
|
|
|
|
if( 0 != m_bHtmlAutoSpace )
|
|
sResult += L"\\htmautsp";
|
|
|
|
return sResult;
|
|
}
|
|
std::wstring RtfDocumentProperty::RenderToOOX(RenderParameter oRenderParameter)
|
|
{
|
|
std::wstring sResult;
|
|
if( PROP_DEF != m_bHypCaps )
|
|
{
|
|
if( 0 == m_bHypCaps )
|
|
sResult += L"<w:doNotHyphenateCaps w:val=\"true\"/>";
|
|
else
|
|
sResult += L"<w:doNotHyphenateCaps w:val=\"false\"/>";
|
|
}
|
|
RENDER_OOX_BOOL( m_bAutoHyp, sResult, L"w:autoHyphenation" )
|
|
RENDER_OOX_INT( m_nMaxHypen, sResult, L"w:consecutiveHyphenLimit" )
|
|
RENDER_OOX_INT( m_nHyphenationRight, sResult, L"w:hyphenationZone" )
|
|
RENDER_OOX_INT( m_nTabWidth, sResult, L"w:defaultTabStop" )
|
|
|
|
RENDER_OOX_INT( m_nDrawingGridHorizontalSpacing, sResult, L"w:drawingGridHorizontalSpacing" )
|
|
RENDER_OOX_INT( m_nDrawingGridVerticalSpacing, sResult, L"w:drawingGridVerticalSpacing" )
|
|
RENDER_OOX_INT( m_nDrawingGridHorizontalOrigin, sResult, L"w:drawingGridVerticalOrigin" )
|
|
RENDER_OOX_INT( m_nDrawingGridVerticalOrigin, sResult, L"w:drawingGridVerticalOrigin" )
|
|
RENDER_OOX_INT( m_nDisplayHorizontalDrawingGridEvery, sResult, L"w:displayHorizontalDrawingGridEvery" )
|
|
RENDER_OOX_INT( m_nDisplayVerticalDrawingGridEvery, sResult, L"w:displayVerticalDrawingGridEvery" )
|
|
|
|
if( PROP_DEF != m_nZoom )
|
|
sResult += L"<w:zoom w:percent=\"" + std::to_wstring(m_nZoom) + L"\" />";
|
|
//Page Borders
|
|
if( PROP_DEF != m_bDorderSurroundHeader )
|
|
{
|
|
if( 0 == m_bDorderSurroundHeader )
|
|
sResult += L"<w:bordersDoNotSurroundHeader w:val=\"true\"/>";
|
|
else
|
|
sResult += L"<w:bordersDoNotSurroundHeader w:val=\"false\"/>";
|
|
}
|
|
if( PROP_DEF != m_bDorderSurroundFotter )
|
|
{
|
|
if( 0 == m_bDorderSurroundFotter )
|
|
sResult += L"<w:bordersDoNotSurroundFooter w:val=\"true\"/>";
|
|
else
|
|
sResult += L"<w:bordersDoNotSurroundFooter w:val=\"false\"/>";
|
|
}
|
|
RENDER_OOX_BOOL( m_bAlignBordersAndEdges, sResult, L"w:alignBordersAndEdges" )
|
|
|
|
//Page Information
|
|
RENDER_OOX_BOOL( m_bGutterAtTop, sResult, L"w:gutterAtTop" )
|
|
RENDER_OOX_BOOL( m_bSwitchMargins, sResult, L"w:mirrorMargins" )
|
|
RENDER_OOX_BOOL( m_bFacingPage, sResult, L"w:evenAndOddHeaders" )
|
|
|
|
//Compatibility Options
|
|
RENDER_OOX_BOOL( m_nDisplayBackground, sResult, L"w:displayBackgroundShape" );
|
|
|
|
//footnote, endnote property
|
|
std::wstring sFootnoteProp;
|
|
for (size_t i = 0; i < m_aSpecialFootnotes.size(); i++ )
|
|
{
|
|
sFootnoteProp += L"<w:footnote w:id=\"" + std::to_wstring(m_aSpecialFootnotes[i]) + L"\" />";
|
|
}
|
|
|
|
if( PROP_DEF != m_nFootnoteNumberingFormat )
|
|
{
|
|
sFootnoteProp += L"<w:numRestart w:val=\"";
|
|
sFootnoteProp += RtfListLevelProperty::GetFormat( m_nFootnoteNumberingFormat );
|
|
sFootnoteProp += L"\"/>";
|
|
}
|
|
RENDER_OOX_INT( m_nFootnoteStart, sFootnoteProp, L"w:numStart" );
|
|
|
|
if( PROP_DEF != m_eFootnoteRestart )
|
|
{
|
|
switch( m_eFootnoteRestart )
|
|
{
|
|
case fr_EachPage: sFootnoteProp += L"<w:numRestart w:val=\"eachPage\"/>"; break;
|
|
case fr_EachSection: sFootnoteProp += L"<w:numRestart w:val=\"eachSect\"/>"; break;
|
|
case fr_Continuous: sFootnoteProp += L"<w:numRestart w:val=\"continuous\"/>"; break;
|
|
}
|
|
}
|
|
if( PROP_DEF != m_eFootnotePlacement )
|
|
{
|
|
switch( m_eFootnotePlacement )
|
|
{
|
|
case fp_EndSection: sFootnoteProp += L"<w:pos w:val=\"sectEnd\"/>"; break;
|
|
case fp_EndDocument: sFootnoteProp += L"<w:pos w:val=\"docEnd\"/>"; break;
|
|
case fp_BeneathText: sFootnoteProp += L"<w:pos w:val=\"beneathText\"/>"; break;
|
|
case fp_BottomPage: sFootnoteProp += L"<w:pos w:val=\"pageBottom\"/>"; break;
|
|
}
|
|
}
|
|
if( !sFootnoteProp.empty() && !m_aSpecialFootnotes.empty())
|
|
sResult += L"<w:footnotePr>" + sFootnoteProp + L"</w:footnotePr>";
|
|
|
|
std::wstring sEndnoteProp;
|
|
//todooo проверить id
|
|
for (size_t i = 0; i < m_aSpecialEndnotes.size(); i++ )
|
|
{
|
|
sEndnoteProp += L"<w:endnote w:id=\"" + std::to_wstring(m_aSpecialEndnotes[i]) + L"\"/>";
|
|
}
|
|
if( PROP_DEF != m_nFootnoteNumberingFormat )
|
|
{
|
|
sFootnoteProp += L"<w:numRestart w:val=\"";
|
|
sFootnoteProp += RtfListLevelProperty::GetFormat( m_nFootnoteNumberingFormat );
|
|
sFootnoteProp += L"\"/>";
|
|
}
|
|
RENDER_OOX_INT( m_nEndnoteStart, sEndnoteProp, L"w:numStart" );
|
|
|
|
if( PROP_DEF != m_eEndnoteRestart )
|
|
{
|
|
switch( m_eEndnoteRestart )
|
|
{
|
|
case fr_EachSection: sEndnoteProp += L"<w:numRestart w:val=\"eachSect\"/>"; break;
|
|
case fr_Continuous: sEndnoteProp += L"<w:numRestart w:val=\"continuous\"/>"; break;
|
|
}
|
|
}
|
|
if( PROP_DEF != m_eEndnotePlacement )
|
|
{
|
|
switch( m_eEndnotePlacement )
|
|
{
|
|
case fp_EndSection: sEndnoteProp += L"<w:pos w:val=\"sectEnd\"/>"; break;
|
|
case fp_EndDocument: sEndnoteProp += L"<w:pos w:val=\"docEnd\"/>"; break;
|
|
case fp_BeneathText: sEndnoteProp += L"<w:pos w:val=\"beneathText\"/>"; break;
|
|
case fp_BottomPage: sEndnoteProp += L"<w:pos w:val=\"pageBottom\"/>"; break;
|
|
}
|
|
}
|
|
if( !sEndnoteProp.empty() && !m_aSpecialEndnotes.empty())
|
|
sResult += L"<w:endnotePr>" + sEndnoteProp + L"</w:endnotePr>";
|
|
|
|
std::wstring sCompat = L"<w:compatSetting w:name=\"compatibilityMode\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"11\"/>";
|
|
|
|
if( 1 != m_bHtmlAutoSpace )
|
|
sCompat += L"<w:doNotUseHTMLParagraphAutoSpacing/>";
|
|
if( 0 == m_bUseTabAlignment )
|
|
sCompat += L"<w:forgetLastTabAlignment/>";
|
|
|
|
if( !sCompat.empty() )
|
|
{
|
|
sResult += L"<w:compat>" + sCompat + L"</w:compat>";
|
|
}
|
|
|
|
return sResult;
|
|
}
|
|
std::wstring RtfSectionProperty::RenderToRtf(RenderParameter oRenderParameter)
|
|
{
|
|
std::wstring sResult;
|
|
|
|
if( RENDER_TO_OOX_PARAM_FIRST_SECTION == oRenderParameter.nType ) //Пишем как свойства документа
|
|
{
|
|
//Page Information
|
|
RENDER_RTF_INT ( m_nPageWidth, sResult, L"paperw" )
|
|
RENDER_RTF_INT ( m_nPageHeight, sResult, L"paperh" )
|
|
RENDER_RTF_INT ( m_nMarginLeft, sResult, L"margl" )
|
|
RENDER_RTF_INT ( m_nMarginRight, sResult, L"margr" )
|
|
RENDER_RTF_INT ( m_nMarginTop, sResult, L"margt" )
|
|
RENDER_RTF_INT ( m_nMarginBottom, sResult, L"margb" )
|
|
RENDER_RTF_INT ( m_nGutterMarginWidth, sResult, L"gutter" )
|
|
RENDER_RTF_BOOL ( m_bSwitchMargin, sResult, L"margmirror" )
|
|
RENDER_RTF_BOOL ( m_bLandscapeFormat, sResult, L"landscape" )
|
|
}
|
|
|
|
sResult += L"\\sectd";
|
|
RENDER_RTF_BOOL ( m_bBidi, sResult, L"endnhere" )
|
|
RENDER_RTF_INT ( m_nPaperSourceFirst, sResult, L"binfsxn" )
|
|
RENDER_RTF_INT ( m_nPaperSourceOther, sResult, L"binsxn" )
|
|
RENDER_RTF_BOOL ( m_bRtlGutter, sResult, L"rtlgutter" )
|
|
RENDER_RTF_BOOL ( m_bEndnotes, sResult, L"endnhere" )
|
|
RENDER_RTF_INT ( m_nStyle, sResult, L"ds" )
|
|
//Section Break
|
|
switch( m_eSectionBreak )
|
|
{
|
|
case sb_sbknone: sResult += L"\\sbknone"; break;
|
|
case sb_sbkcol: sResult += L"\\sbkcol"; break;
|
|
case sb_sbkpage: sResult += L"\\sbkpage"; break;
|
|
case sb_sbkeven: sResult += L"\\sbkeven"; break;
|
|
case sb_sbkodd: sResult += L"\\sbkodd"; break;
|
|
}
|
|
//Columns
|
|
RENDER_RTF_INT ( m_nColumnNumber, sResult, L"cols" )
|
|
RENDER_RTF_INT ( m_nColumnSpace, sResult, L"colsx" )
|
|
RENDER_RTF_BOOL ( m_bColumnLineBetween, sResult, L"linebetcol" )
|
|
|
|
if (m_nColumnNumber > 1)
|
|
{
|
|
for( size_t i = 0; i < m_oCollumnProperty.m_aCollumnProperty.size(); i++ )
|
|
{
|
|
sResult += L"\\colno" + std::to_wstring( (int)i + 1 );
|
|
RENDER_RTF_INT( m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnSpaceToRightOfCol, sResult, L"colsr" )
|
|
RENDER_RTF_INT( m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnWidth, sResult, L"colw" )
|
|
}
|
|
}
|
|
|
|
//Footnotes and Endnotes
|
|
switch( m_eFootnotesJust )
|
|
{
|
|
case fj_sftntj: sResult += L"\\sftntj"; break;
|
|
case fj_sftnbj: sResult += L"\\sftnbj"; break;
|
|
}
|
|
RENDER_RTF_INT( m_nFootnotesStart, sResult, L"sftnstart" )
|
|
|
|
switch( m_eFootnotesRestart )
|
|
{
|
|
case fr_sftnrstpg: sResult += L"\\sftnrstpg"; break;
|
|
case fr_sftnrestart: sResult += L"\\sftnrestart"; break;
|
|
case fr_sftnrstcont: sResult += L"\\sftnrstcont"; break;
|
|
}
|
|
switch( m_eFootnotesFormat )
|
|
{
|
|
case ff_sftnnar: sResult += L"\\sftnnar"; break;
|
|
case ff_sftnnalc: sResult += L"\\sftnnalc"; break;
|
|
case ff_sftnnauc: sResult += L"\\sftnnauc"; break;
|
|
case ff_sftnnrlc: sResult += L"\\sftnnrlc"; break;
|
|
case ff_sftnnruc: sResult += L"\\sftnnruc"; break;
|
|
case ff_sftnnchi: sResult += L"\\sftnnchi"; break;
|
|
case ff_sftnnchosung: sResult += L"\\sftnnchosung"; break;
|
|
case ff_sftnncnum: sResult += L"\\sftnncnum"; break;
|
|
case ff_sftnndbnum: sResult += L"\\sftnndbnum"; break;
|
|
case ff_sftnndbnumd: sResult += L"\\sftnndbnumd"; break;
|
|
case ff_sftnndbnumt: sResult += L"\\sftnndbnumt"; break;
|
|
case ff_sftnndbnumk: sResult += L"\\sftnndbnumk"; break;
|
|
case ff_sftnndbar: sResult += L"\\sftnndbar"; break;
|
|
case ff_sftnnganada: sResult += L"\\sftnnganada"; break;
|
|
case ff_sftnngbnum: sResult += L"\\sftnngbnum"; break;
|
|
case ff_sftnngbnumd: sResult += L"\\sftnngbnumd"; break;
|
|
case ff_sftnngbnuml: sResult += L"\\sftnngbnuml"; break;
|
|
case ff_sftnngbnumk: sResult += L"\\sftnngbnumk"; break;
|
|
case ff_sftnnzodiac: sResult += L"\\sftnnzodiac"; break;
|
|
case ff_sftnnzodiacd: sResult += L"\\sftnnzodiacd"; break;
|
|
case ff_sftnnzodiacl: sResult += L"\\sftnnzodiacl"; break;
|
|
}
|
|
RENDER_RTF_INT( m_nEndnotesStart, sResult, L"saftnstart" )
|
|
switch( m_eEndnotesRestart )
|
|
{
|
|
case er_saftnrestart: sResult += L"\\saftnrestart"; break;
|
|
case er_saftnrstcont: sResult += L"\\saftnrstcont"; break;
|
|
}
|
|
switch( m_eEndnotesFormat )
|
|
{
|
|
case ef_saftnnar: sResult += L"\\saftnnar"; break;
|
|
case ef_saftnnalc: sResult += L"\\saftnnalc"; break;
|
|
case ef_saftnnauc: sResult += L"\\saftnnauc"; break;
|
|
case ef_saftnnrlc: sResult += L"\\saftnnrlc"; break;
|
|
case ef_saftnnruc: sResult += L"\\saftnnruc"; break;
|
|
case ef_saftnnchi: sResult += L"\\saftnnchi"; break;
|
|
case ef_saftnnchosung: sResult += L"\\saftnnchosung"; break;
|
|
case ef_saftnncnum: sResult += L"\\saftnncnum"; break;
|
|
case ef_saftnndbnum: sResult += L"\\saftnndbnum"; break;
|
|
case ef_saftnndbnumd: sResult += L"\\saftnndbnumd"; break;
|
|
case ef_saftnndbnumt: sResult += L"\\saftnndbnumt"; break;
|
|
case ef_saftnndbnumk: sResult += L"\\saftnndbnumk"; break;
|
|
case ef_saftnndbar: sResult += L"\\saftnndbar"; break;
|
|
case ef_saftnnganada: sResult += L"\\saftnnganada"; break;
|
|
case ef_saftnngbnum: sResult += L"\\saftnngbnum"; break;
|
|
case ef_saftnngbnumd: sResult += L"\\saftnngbnumd"; break;
|
|
case ef_saftnngbnuml: sResult += L"\\saftnngbnuml"; break;
|
|
case ef_saftnngbnumk: sResult += L"\\saftnngbnumk"; break;
|
|
case ef_saftnnzodiac: sResult += L"\\saftnnzodiac"; break;
|
|
case ef_saftnnzodiacd: sResult += L"\\saftnnzodiacd"; break;
|
|
case ef_saftnnzodiacl: sResult += L"\\saftnnzodiacl"; break;
|
|
}
|
|
|
|
//Line Numbering
|
|
RENDER_RTF_INT( m_nLineModulus, sResult, L"linemod" )
|
|
RENDER_RTF_INT( m_nLineX, sResult, L"linex" )
|
|
RENDER_RTF_INT( m_nLineStart, sResult, L"linestarts" )
|
|
switch( m_eLineNumberRestart )
|
|
{
|
|
case lnr_linerestart: sResult += L"\\linerestart";break;
|
|
case lnr_lineppage: sResult += L"\\lineppage"; break;
|
|
case lnr_linecont: sResult += L"\\linecont"; break;
|
|
}
|
|
|
|
if( RENDER_TO_OOX_PARAM_FIRST_SECTION != oRenderParameter.nType )//Пишем как свойства секции
|
|
{
|
|
//Page Information
|
|
RENDER_RTF_INT( m_nPageWidth, sResult, L"pgwsxn" )
|
|
RENDER_RTF_INT( m_nPageHeight, sResult, L"pghsxn" )
|
|
RENDER_RTF_INT( m_nMarginLeft, sResult, L"marglsxn" )
|
|
RENDER_RTF_INT( m_nMarginRight, sResult, L"margrsxn" )
|
|
RENDER_RTF_INT( m_nMarginTop, sResult, L"margtsxn" )
|
|
RENDER_RTF_INT( m_nMarginBottom, sResult, L"margbsxn" )
|
|
RENDER_RTF_INT( m_nGutterMarginWidth, sResult, L"guttersxn" )
|
|
RENDER_RTF_BOOL( m_bSwitchMargin, sResult, L"margmirsxn" )
|
|
RENDER_RTF_BOOL( m_bLandscapeFormat, sResult, L"lndscpsxn" )
|
|
}
|
|
|
|
RENDER_RTF_BOOL ( m_bTitlePage, sResult, L"titlepg" )
|
|
RENDER_RTF_INT ( m_nHeaderTop, sResult, L"headery" )
|
|
RENDER_RTF_INT ( m_nFooterBottom, sResult, L"footery" )
|
|
|
|
//Page Numbers
|
|
RENDER_RTF_INT ( m_nPageNumberStart, sResult, L"pgnstarts" )
|
|
RENDER_RTF_BOOL ( m_bPageNumberContinuos, sResult, L"pgncont" )
|
|
RENDER_RTF_BOOL ( m_bPageNumberRestart, sResult, L"pgnrestart" )
|
|
RENDER_RTF_INT ( m_nPageNumberX, sResult, L"pgnx" )
|
|
RENDER_RTF_INT ( m_nPageNumberY, sResult, L"pgny" )
|
|
|
|
switch( m_ePageNumberFormat )
|
|
{
|
|
case pnf_pgndec: sResult += L"\\pgndec"; break;
|
|
case pnf_pgnucrm: sResult += L"\\pgnucrm"; break;
|
|
case pnf_pgnlcrm: sResult += L"\\pgnlcrm"; break;
|
|
}
|
|
//Vertical Alignment
|
|
switch( m_eVerticalAlignment )
|
|
{
|
|
case va_vertalt: sResult += L"\\vertalt"; break;
|
|
case va_vertalb: sResult += L"\\vertalb"; break;
|
|
case va_vertalc: sResult += L"\\vertalc"; break;
|
|
case va_vertalj: sResult += L"\\vertalj"; break;
|
|
|
|
}
|
|
//Text Flow
|
|
RENDER_RTF_INT( m_nTextFollow, sResult, L"stextflow" )
|
|
|
|
//Page Borders
|
|
if( true == m_oBorderLeft.IsValid() )
|
|
{
|
|
sResult += L"\\pgbrdrl";
|
|
sResult += m_oBorderLeft.RenderToRtf( oRenderParameter );
|
|
}
|
|
if( true == m_oBorderTop.IsValid() )
|
|
{
|
|
sResult += L"\\pgbrdrt";
|
|
sResult += m_oBorderTop.RenderToRtf( oRenderParameter );
|
|
}
|
|
|
|
if( true == m_oBorderRight.IsValid() )
|
|
{
|
|
sResult += L"\\pgbrdrr";
|
|
sResult += m_oBorderRight.RenderToRtf( oRenderParameter );
|
|
}
|
|
if( true == m_oBorderBottom.IsValid() )
|
|
{
|
|
sResult += L"\\pgbrdrb";
|
|
sResult += m_oBorderBottom.RenderToRtf( oRenderParameter );
|
|
}
|
|
RENDER_RTF_INT( m_nBorderArt, sResult, L"brdrart" )
|
|
RENDER_RTF_INT( m_nBorderMeasure, sResult, L"pgbrdropt" )
|
|
RENDER_RTF_INT( m_nBorderAlign, sResult, L"pgbrdrsnap" )
|
|
|
|
//footer - header
|
|
if( 0 != m_oHeaderRight )
|
|
{
|
|
sResult += L"{\\headerr";
|
|
sResult += m_oHeaderRight->RenderToRtf( oRenderParameter );
|
|
sResult += L"\\par";
|
|
sResult += L"}";
|
|
}
|
|
if( 0 != m_oHeaderLeft )
|
|
{
|
|
sResult += L"{\\headerl";
|
|
sResult += m_oHeaderLeft->RenderToRtf( oRenderParameter );
|
|
sResult += L"\\par";
|
|
sResult += L"}";
|
|
}
|
|
if( 0 != m_oHeaderFirst )
|
|
{
|
|
sResult += L"{\\headerf";
|
|
sResult += m_oHeaderFirst->RenderToRtf( oRenderParameter );
|
|
sResult += L"\\par";
|
|
sResult += L"}";
|
|
}
|
|
if( 0 != m_oFooterRight )
|
|
{
|
|
sResult += L"{\\footerr";
|
|
sResult += m_oFooterRight->RenderToRtf( oRenderParameter );
|
|
sResult += L"\\par";
|
|
sResult += L"}";
|
|
}
|
|
if( 0 != m_oFooterLeft )
|
|
{
|
|
sResult += L"{\\footerl";
|
|
sResult += m_oFooterLeft->RenderToRtf( oRenderParameter );
|
|
sResult += L"\\par";
|
|
sResult += L"}";
|
|
}
|
|
if( 0 != m_oFooterFirst )
|
|
{
|
|
sResult += L"{\\footerf";
|
|
sResult += m_oFooterFirst->RenderToRtf( oRenderParameter );
|
|
sResult += L"\\par";
|
|
sResult += L"}";
|
|
}
|
|
|
|
RENDER_RTF_INT( m_nSrAuth, sResult, L"srauth" )
|
|
RENDER_RTF_INT( m_nSrDate, sResult, L"srdate" )
|
|
|
|
if (m_pOldSectionProp)
|
|
{
|
|
sResult += L"{\\*\\oldpprops\\pard";
|
|
sResult += m_pOldSectionProp->RenderToRtf(oRenderParameter);
|
|
sResult += L"}";
|
|
}
|
|
return sResult;
|
|
}
|
|
std::wstring RtfSectionProperty::RenderToOOX(RenderParameter oRenderParameter)
|
|
{
|
|
RtfDocument* poRtfDocument = static_cast<RtfDocument*> (oRenderParameter.poDocument);
|
|
OOXWriter* poOOXWriter = static_cast<OOXWriter*> (oRenderParameter.poWriter);
|
|
|
|
std::wstring sResult;
|
|
sResult += L"<w:sectPr>";
|
|
|
|
if( 1 == m_bBidi )
|
|
sResult += L"<w:bidi/>";
|
|
|
|
std::wstring sPaperSource;
|
|
if( PROP_DEF != m_nPaperSourceFirst )
|
|
sPaperSource += L" w:first=\"" + std::to_wstring(m_nPaperSourceFirst) + L"\"";
|
|
if( PROP_DEF != m_nPaperSourceFirst )
|
|
sPaperSource += L" w:other=\"" + std::to_wstring(m_nPaperSourceOther) + L"\"";
|
|
|
|
if( !sPaperSource.empty() )
|
|
sResult += L"<w:paperSrc " + sPaperSource + L"/>";
|
|
|
|
if( 1 == m_bRtlGutter )
|
|
sResult += L"<w:rtlGutter/>";
|
|
|
|
//Section Break
|
|
switch( m_eSectionBreak )
|
|
{
|
|
case sb_sbkcol: sResult += L"<w:type w:val=\"nextColumn\"/>"; break;
|
|
case sb_sbkpage: sResult += L"<w:type w:val=\"nextPage\"/>"; break;
|
|
case sb_sbkeven: sResult += L"<w:type w:val=\"evenPage\"/>"; break;
|
|
case sb_sbkodd: sResult += L"<w:type w:val=\"oddPage\"/>"; break;
|
|
case sb_sbknone:
|
|
default:
|
|
sResult += L"<w:type w:val=\"continuous\"/>";
|
|
break;
|
|
}
|
|
//Columns
|
|
if( PROP_DEF != m_nColumnNumber )
|
|
{
|
|
std::wstring sCollumnFormating;
|
|
bool bEqualWidth = false;
|
|
if( m_nColumnNumber != m_oCollumnProperty.m_aCollumnProperty.size() )
|
|
bEqualWidth = true;
|
|
else
|
|
for (size_t i = 0; i < m_oCollumnProperty.m_aCollumnProperty.size(); i++ )
|
|
{
|
|
if( PROP_DEF == m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnWidth )
|
|
{
|
|
bEqualWidth = true;
|
|
break;
|
|
}
|
|
}
|
|
sCollumnFormating += L"<w:cols w:num=\"" + std::to_wstring(m_nColumnNumber) + L"\"";
|
|
|
|
if( PROP_DEF != m_nColumnSpace )
|
|
sCollumnFormating += L" w:space=\"" + std::to_wstring(m_nColumnSpace) + L"\"";
|
|
|
|
if (m_nColumnNumber > 1)
|
|
{
|
|
if (PROP_DEF != m_bColumnLineBetween)
|
|
sCollumnFormating += std::wstring(L" w:sep=\"") + (m_bColumnLineBetween ? L"1" : L"0") + L"\"";
|
|
|
|
if( true == bEqualWidth )
|
|
sCollumnFormating += L" w:equalWidth=\"true\"/>";
|
|
else
|
|
{
|
|
sCollumnFormating += L" w:equalWidth=\"false\">";
|
|
|
|
for (size_t i = 0; i < m_oCollumnProperty.m_aCollumnProperty.size(); i++ )
|
|
{
|
|
sCollumnFormating += L"<w:col";
|
|
if( PROP_DEF != m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnWidth )
|
|
sCollumnFormating += L" w:w=\"" + std::to_wstring(m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnWidth) + L"\"";
|
|
if( PROP_DEF != m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnSpaceToRightOfCol )
|
|
sCollumnFormating += L" w:space=\"" + std::to_wstring(m_oCollumnProperty.m_aCollumnProperty[i].m_nColumnSpaceToRightOfCol ) + L"\"";
|
|
sCollumnFormating += L"/>";
|
|
}
|
|
sCollumnFormating += L"</w:cols>";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sCollumnFormating += L"/>";
|
|
}
|
|
if( false == sCollumnFormating.empty() )
|
|
sResult += sCollumnFormating;
|
|
}
|
|
|
|
//Footnotes and Endnotes
|
|
std::wstring sFootnotesProp;
|
|
switch( m_eFootnotesJust )
|
|
{
|
|
case fj_sftntj: sFootnotesProp += L"<w:pos w:val=\"beneathText\"/>"; break;
|
|
case fj_sftnbj: sFootnotesProp += L"<w:pos w:val=\"pageBottom\"/>"; break;
|
|
}
|
|
RENDER_OOX_INT( m_nFootnotesStart, sFootnotesProp, L"w:numStart" )
|
|
switch( m_eFootnotesRestart )
|
|
{
|
|
case fr_sftnrstpg: sFootnotesProp += L"<w:numRestart w:val=\"eachPage\"/>"; break;
|
|
case fr_sftnrestart: sFootnotesProp += L"<w:numRestart w:val=\"eachSect\"/>"; break;
|
|
case fr_sftnrstcont: sFootnotesProp += L"<w:numRestart w:val=\"continuous\"/>"; break;
|
|
}
|
|
switch( m_eFootnotesFormat )
|
|
{
|
|
case ff_sftnnar: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnalc: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnauc: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnrlc: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnruc: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnchi: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnchosung: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnncnum: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnndbnum: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnndbnumd: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnndbnumt: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnndbnumk: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnndbar: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnganada: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnngbnum: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnngbnumd: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnngbnuml: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnngbnumk: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnzodiac: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnzodiacd: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ff_sftnnzodiacl: sFootnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
}
|
|
if(!sFootnotesProp.empty() )
|
|
sResult += L"<w:footnotePr>" + sFootnotesProp + L"</w:footnotePr>";
|
|
|
|
std::wstring sEndnotesProp;
|
|
RENDER_OOX_INT( m_nEndnotesStart, sEndnotesProp, L"w:numStart" )
|
|
|
|
switch( m_eEndnotesRestart )
|
|
{
|
|
case er_saftnrestart: sEndnotesProp += L"<w:numRestart w:val=\"eachPage\"/>"; break;
|
|
case er_saftnrstcont: sEndnotesProp += L"<w:numRestart w:val=\"continuous\"/>"; break;
|
|
}
|
|
switch( m_eEndnotesFormat )
|
|
{
|
|
case ef_saftnnar: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnalc: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnauc: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnrlc: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnruc: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnchi: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnchosung: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnncnum: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnndbnum: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnndbnumd: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnndbnumt: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnndbnumk: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnndbar: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnganada: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnngbnum: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnngbnumd: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnngbnuml: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnngbnumk: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnzodiac: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnzodiacd: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
case ef_saftnnzodiacl: sEndnotesProp += L"<w:numFmt w:val=\"upperLetter\" />"; break;
|
|
}
|
|
if(!sEndnotesProp.empty() )
|
|
sResult += L"<w:endnotePr>" + sEndnotesProp + L"</w:endnotePr>";
|
|
|
|
//Line Numbering
|
|
std::wstring sLineNumbering;
|
|
if( PROP_DEF != m_nLineModulus )
|
|
sLineNumbering += L" w:countBy=\"" + std::to_wstring(m_nLineModulus) + L"\"";
|
|
if( PROP_DEF != m_nLineX && 0 != m_nLineX)
|
|
sLineNumbering += L" w:distance=\"" + std::to_wstring(m_nLineX) + L"\"";
|
|
if( PROP_DEF != m_nLineStart )
|
|
sLineNumbering += L" w:start=\"" + std::to_wstring(m_nLineStart) + L"\"";
|
|
switch( m_eLineNumberRestart )
|
|
{
|
|
case lnr_linerestart: sLineNumbering += L" w:restart=\"newSection\""; break;
|
|
case lnr_lineppage: sLineNumbering += L" w:restart=\"newPage\""; break;
|
|
case lnr_linecont: sLineNumbering += L" w:restart=\"continuous\""; break;
|
|
}
|
|
if( false == sLineNumbering.empty() )
|
|
sResult += L"<w:lnNumType " + sLineNumbering+ L"/>";
|
|
|
|
//Page Information
|
|
std::wstring sPageSize;
|
|
if( PROP_DEF != m_nPageWidth )
|
|
sPageSize += L" w:w=\"" + std::to_wstring(m_nPageWidth) + L"\"";
|
|
if( PROP_DEF != m_nPageHeight )
|
|
sPageSize += L" w:h=\"" + std::to_wstring(m_nPageHeight) + L"\"";
|
|
if( 1 == m_bLandscapeFormat )
|
|
sPageSize += L" w:orient=\"landscape\"";
|
|
if( false == sPageSize.empty() )
|
|
sResult += L"<w:pgSz " + sPageSize + L"/>";
|
|
|
|
std::wstring sMargin;
|
|
if( PROP_DEF != m_nMarginLeft )
|
|
sMargin += L" w:left=\"" + std::to_wstring(m_nMarginLeft) + L"\"";
|
|
if( PROP_DEF != m_nMarginRight )
|
|
sMargin += L" w:right=\"" + std::to_wstring(m_nMarginRight) + L"\"";
|
|
if( PROP_DEF != m_nMarginTop )
|
|
sMargin += L" w:top=\"" + std::to_wstring(m_nMarginTop) + L"\"";
|
|
if( PROP_DEF != m_nMarginBottom )
|
|
sMargin += L" w:bottom=\"" + std::to_wstring(m_nMarginBottom) + L"\"";
|
|
if( PROP_DEF != m_nGutterMarginWidth )
|
|
sMargin += L" w:gutter=\"" + std::to_wstring(m_nGutterMarginWidth) + L"\"";
|
|
if( PROP_DEF != m_nHeaderTop )
|
|
sMargin += L" w:header=\"" + std::to_wstring(m_nHeaderTop) + L"\"";
|
|
if( PROP_DEF != m_nFooterBottom )
|
|
sMargin += L" w:footer=\"" + std::to_wstring(m_nFooterBottom) + L"\"";
|
|
if( false == sMargin.empty() )
|
|
sResult += L"<w:pgMar " + sMargin + L"/>";
|
|
if( 1 == m_bTitlePage )
|
|
sResult += L"<w:titlePg/>";
|
|
|
|
//Page Numbers
|
|
std::wstring sPageNumber;
|
|
if( PROP_DEF != m_nPageNumberStart )
|
|
sPageNumber += L" w:start=\"" + std::to_wstring(m_nPageNumberStart) + L"\"";
|
|
if( false == sPageNumber.empty() )
|
|
sResult += L"<w:pgNumType " + sPageNumber + L"/>";
|
|
//Vertical Alignment
|
|
switch( m_eVerticalAlignment )
|
|
{
|
|
case va_vertalt: sResult += L"<w:vAlign w:val=\"top\" />"; break;
|
|
case va_vertalb: sResult += L"<w:vAlign w:val=\"bottom\" />"; break;
|
|
case va_vertalc: sResult += L"<w:vAlign w:val=\"center\" />"; break;
|
|
case va_vertalj: sResult += L"<w:vAlign w:val=\"both\" />"; break;
|
|
}
|
|
//Text Flow
|
|
switch( m_nTextFollow )
|
|
{
|
|
case 0: sResult += L"<w:textDirection w:val=\"lrTb\" />"; break;
|
|
case 1: sResult += L"<w:textDirection w:val=\"tbRl\" />"; break;
|
|
case 2: sResult += L"<w:textDirection w:val=\"lrBt\" />"; break;
|
|
case 3: sResult += L"<w:textDirection w:val=\"rlTb\" />"; break;
|
|
case 4: sResult += L"<w:textDirection w:val=\"lrTbV\" />"; break;
|
|
case 5: sResult += L"<w:textDirection w:val=\"tbLrV\" />"; break;
|
|
}
|
|
//Page Borders
|
|
std::wstring sBorders;
|
|
RenderParameter oNewParam = oRenderParameter;
|
|
oNewParam.nType = RENDER_TO_OOX_PARAM_BORDER_TAG;
|
|
if( true == m_oBorderLeft.IsValid() )
|
|
{
|
|
oNewParam.sValue = L"w:left";
|
|
sBorders += m_oBorderLeft.RenderToOOX( oNewParam );
|
|
}
|
|
if( true == m_oBorderTop.IsValid() )
|
|
{
|
|
oNewParam.sValue = L"w:top";
|
|
sBorders += m_oBorderTop.RenderToOOX( oNewParam ) ;
|
|
}
|
|
if( true == m_oBorderRight.IsValid() )
|
|
{
|
|
oNewParam.sValue = L"w:right";
|
|
sBorders += m_oBorderRight.RenderToOOX( oNewParam );
|
|
}
|
|
if( true == m_oBorderBottom.IsValid() )
|
|
{
|
|
oNewParam.sValue = L"w:bottom";
|
|
sBorders += m_oBorderBottom.RenderToOOX( oNewParam );
|
|
}
|
|
if( false == sBorders.empty() )
|
|
{
|
|
sResult += L"<w:pgBorders";
|
|
if( PROP_DEF != m_nBorderMeasure )
|
|
{
|
|
switch( m_nBorderMeasure & 3 )
|
|
{
|
|
case 0: sResult += L" w:display=\"allPages\""; break;
|
|
case 1: sResult += L" w:display=\"firstPage\""; break;
|
|
case 2: sResult += L" w:display=\"notFirstPage\""; break;
|
|
}
|
|
if( 0 != (m_nBorderMeasure & 8) )
|
|
sResult += L" w:zOrder=\"back\"";
|
|
else
|
|
sResult += L" w:zOrder=\"front\"";
|
|
if( 0 != (m_nBorderMeasure & 32) )
|
|
sResult += L" w:offsetFrom=\"page\"";
|
|
else
|
|
sResult += L" w:offsetFrom=\"text\"";
|
|
}
|
|
sResult += L">";
|
|
sResult += sBorders;
|
|
sResult += L"</w:pgBorders>";
|
|
}
|
|
if( 0 != m_oHeaderLeft )
|
|
{
|
|
std::wstring sId = SaveFile(m_oHeaderLeft,oRenderParameter, true);
|
|
sResult += L"<w:headerReference w:type=\"even\" r:id=\"" + sId + L"\"/>";
|
|
}
|
|
if( 0 != m_oHeaderFirst )
|
|
{
|
|
std::wstring sId = SaveFile(m_oHeaderFirst,oRenderParameter, true);
|
|
sResult += L"<w:headerReference w:type=\"first\" r:id=\"" + sId + L"\"/>";
|
|
}
|
|
if( 0 != m_oHeaderRight )
|
|
{
|
|
std::wstring sId = SaveFile(m_oHeaderRight,oRenderParameter, true);
|
|
sResult += L"<w:headerReference w:type=\"default\" r:id=\"" + sId + L"\"/>";
|
|
}
|
|
if( 0 != m_oFooterLeft )
|
|
{
|
|
std::wstring sId = SaveFile(m_oFooterLeft,oRenderParameter, false);
|
|
sResult += L"<w:footerReference w:type=\"even\" r:id=\"" + sId + L"\"/>";
|
|
}
|
|
if( 0 != m_oFooterFirst )
|
|
{
|
|
std::wstring sId = SaveFile(m_oFooterFirst,oRenderParameter, false);
|
|
sResult += L"<w:footerReference w:type=\"first\" r:id=\"" + sId + L"\"/>";
|
|
}
|
|
if( 0 != m_oFooterRight )
|
|
{
|
|
std::wstring sId = SaveFile(m_oFooterRight,oRenderParameter, false);
|
|
sResult += L"<w:footerReference w:type=\"default\" r:id=\"" + sId + L"\"/>";
|
|
}
|
|
if (m_pOldSectionProp)
|
|
{
|
|
std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nSrAuth);
|
|
std::wstring sDate(RtfUtility::convertDateTime(m_nSrDate).c_str());
|
|
|
|
RenderParameter oRenderParameterNew = oRenderParameter;
|
|
oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN;
|
|
|
|
sResult += L"<w:sectPrChange w:date=\"" + sDate + L"\" w:author=\"" + XmlUtils::EncodeXmlString(sAuthor) + L"\" w:id=\"" + std::to_wstring(poOOXWriter->m_nCurTrackChangesId++).c_str() + L"\">";
|
|
sResult += m_pOldSectionProp->RenderToOOX(oRenderParameterNew);
|
|
sResult += L"</w:sectPrChange>";
|
|
}
|
|
sResult += L"</w:sectPr>";
|
|
return sResult;
|
|
}
|
|
std::wstring RtfSectionProperty::SaveFile( TextItemContainerPtr oTarget, RenderParameter oRenderParameter, bool bHeader)
|
|
{
|
|
OOXWriter* poOOXWriter = static_cast<OOXWriter*> ( oRenderParameter.poWriter );
|
|
RtfDocument* poRtfDocument = static_cast<RtfDocument*> ( oRenderParameter.poDocument );
|
|
|
|
std::wstring sFilename;
|
|
if ( true == bHeader )
|
|
sFilename += L"header" + std::to_wstring(poRtfDocument->m_oIdGenerator.Generate_HeaderNumber()) + L".xml";
|
|
else
|
|
sFilename += L"footer" + std::to_wstring(poRtfDocument->m_oIdGenerator.Generate_FooterNumber()) + L".xml";
|
|
|
|
std::wstring sContent;
|
|
std::wstring sRootName;
|
|
if( true == bHeader )
|
|
sRootName = L"w:hdr";
|
|
else
|
|
sRootName = L"w:ftr";
|
|
sContent += L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n";
|
|
sContent += L"<";
|
|
sContent += sRootName;
|
|
sContent += L" \
|
|
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
|
|
xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \
|
|
xmlns:v=\"urn:schemas-microsoft-com:vml\" \
|
|
xmlns:o=\"urn:schemas-microsoft-com:office:office\" \
|
|
xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" \
|
|
xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" \
|
|
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
|
|
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
|
|
xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" \
|
|
xmlns:cx=\"http://schemas.microsoft.com/office/drawing/2014/chartex\" \
|
|
xmlns:cx1=\"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex\" \
|
|
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \
|
|
xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" \
|
|
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
|
|
xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" \
|
|
xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\" \
|
|
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
|
|
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
|
|
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
|
|
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
|
|
mc:Ignorable=\"w14 w15 w16se wp14\">";
|
|
|
|
RenderParameter oNewParameter = oRenderParameter;
|
|
|
|
OOXRelsWriterPtr oNewRelsWr ( new OOXRelsWriter( sFilename, *poRtfDocument ) );
|
|
poOOXWriter->m_oCustomRelsWriter.push_back( oNewRelsWr );
|
|
oNewParameter.poRels = oNewRelsWr.get();
|
|
|
|
sContent += oTarget->RenderToOOX(oNewParameter);
|
|
sContent += L"</" + sRootName + L">";
|
|
|
|
std::string sXmlUTF = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(sContent);
|
|
|
|
std::wstring sFilePath = poOOXWriter->m_sTargetFolder + FILE_SEPARATOR_STR + L"word" + FILE_SEPARATOR_STR + sFilename;
|
|
|
|
NSFile::CFileBinary file;
|
|
|
|
if (file.CreateFile(sFilePath) == true)
|
|
{
|
|
file.WriteFile((void*)sXmlUTF.c_str(), (DWORD)sXmlUTF.length());
|
|
file.CloseFile();
|
|
}
|
|
|
|
std::wstring sContentTarget = L"/word/" + sFilename;
|
|
std::wstring srID;
|
|
if( true == bHeader )
|
|
{
|
|
poOOXWriter->m_oContentTypes.AddContent( L"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml", sContentTarget);
|
|
srID = poOOXWriter->m_oDocRels.AddRelationship( L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", sFilename );
|
|
}
|
|
else
|
|
{
|
|
poOOXWriter->m_oContentTypes.AddContent( L"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml", sContentTarget);
|
|
srID = poOOXWriter->m_oDocRels.AddRelationship( L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", sFilename );
|
|
}
|
|
return srID;
|
|
}
|
|
|
|
RtfSectionProperty::RtfSectionProperty()
|
|
{
|
|
SetDefault();
|
|
|
|
//footer - header
|
|
m_oHeaderLeft = TextItemContainerPtr();
|
|
m_oHeaderFirst = TextItemContainerPtr();
|
|
m_oHeaderRight = TextItemContainerPtr();
|
|
m_oFooterLeft = TextItemContainerPtr();
|
|
m_oFooterFirst = TextItemContainerPtr();
|
|
m_oFooterRight = TextItemContainerPtr();
|
|
}
|
|
int RtfSectionProperty::GetType()
|
|
{
|
|
return TYPE_RTF_PROPERTY_SECTION;
|
|
}
|
|
void RtfSectionProperty::SetDefaultRtf()
|
|
{
|
|
SetDefault();
|
|
|
|
DEFAULT_PROPERTY_DEF( m_eSectionBreak, sb_sbkpage )
|
|
DEFAULT_PROPERTY_DEF( m_nColumnSpace, 720);
|
|
}
|
|
void RtfSectionProperty::SetDefaultOOX()
|
|
{
|
|
SetDefault();
|
|
|
|
m_nPageWidth = 11906;
|
|
m_nPageHeight = 16838;
|
|
|
|
m_nMarginLeft = 210;
|
|
m_nMarginRight = 215;
|
|
m_nMarginTop = 204;
|
|
m_nMarginBottom = 204;
|
|
|
|
m_nHeaderTop = 709;
|
|
m_nFooterBottom = 709;
|
|
m_nGutterMarginWidth = 0;
|
|
|
|
m_nColumnSpace = 708;
|
|
}
|
|
void RtfSectionProperty::SetDefault()
|
|
{
|
|
DEFAULT_PROPERTY ( m_bBidi )
|
|
DEFAULT_PROPERTY ( m_nPaperSourceFirst )
|
|
DEFAULT_PROPERTY ( m_nPaperSourceOther )
|
|
DEFAULT_PROPERTY ( m_bRtlGutter )
|
|
DEFAULT_PROPERTY ( m_bEndnotes )
|
|
DEFAULT_PROPERTY ( m_nStyle )
|
|
DEFAULT_PROPERTY_DEF( m_eSectionBreak, sb_none )
|
|
|
|
//Columns
|
|
m_nColumnNumber = 1;
|
|
DEFAULT_PROPERTY ( m_nColumnSpace )
|
|
DEFAULT_PROPERTY ( m_bColumnLineBetween )
|
|
|
|
//Footnotes and Endnotes
|
|
DEFAULT_PROPERTY_DEF( m_eFootnotesJust, fj_none )
|
|
DEFAULT_PROPERTY ( m_nFootnotesStart )
|
|
DEFAULT_PROPERTY_DEF( m_eFootnotesRestart, fr_none )
|
|
DEFAULT_PROPERTY_DEF( m_eFootnotesFormat, ff_none )
|
|
DEFAULT_PROPERTY ( m_nEndnotesStart )
|
|
DEFAULT_PROPERTY_DEF( m_eEndnotesRestart, er_none )
|
|
DEFAULT_PROPERTY_DEF( m_eEndnotesFormat, ef_none )
|
|
|
|
//Line Numbering
|
|
DEFAULT_PROPERTY ( m_nLineModulus )
|
|
DEFAULT_PROPERTY ( m_nLineX )
|
|
DEFAULT_PROPERTY ( m_nLineStart )
|
|
DEFAULT_PROPERTY_DEF( m_eLineNumberRestart, lnr_none )
|
|
|
|
//Page Information
|
|
DEFAULT_PROPERTY ( m_nPageWidth )
|
|
DEFAULT_PROPERTY ( m_nPageHeight )
|
|
DEFAULT_PROPERTY ( m_nMarginLeft )
|
|
DEFAULT_PROPERTY ( m_nMarginRight )
|
|
DEFAULT_PROPERTY ( m_nMarginTop )
|
|
DEFAULT_PROPERTY ( m_nMarginBottom )
|
|
DEFAULT_PROPERTY ( m_nGutterMarginWidth )
|
|
DEFAULT_PROPERTY ( m_bSwitchMargin )
|
|
DEFAULT_PROPERTY ( m_bLandscapeFormat )
|
|
DEFAULT_PROPERTY ( m_bTitlePage )
|
|
DEFAULT_PROPERTY_DEF( m_nHeaderTop, 720 )
|
|
DEFAULT_PROPERTY_DEF( m_nFooterBottom, 720 )
|
|
|
|
//Page Numbers
|
|
DEFAULT_PROPERTY ( m_nPageNumberStart )
|
|
DEFAULT_PROPERTY ( m_bPageNumberContinuos )
|
|
DEFAULT_PROPERTY ( m_bPageNumberRestart )
|
|
DEFAULT_PROPERTY ( m_nPageNumberX )
|
|
DEFAULT_PROPERTY ( m_nPageNumberY )
|
|
DEFAULT_PROPERTY_DEF( m_ePageNumberFormat, pnf_none )
|
|
|
|
//Vertical Alignment
|
|
DEFAULT_PROPERTY_DEF( m_eVerticalAlignment, va_none )
|
|
|
|
//Text Flow
|
|
DEFAULT_PROPERTY ( m_nTextFollow )
|
|
|
|
//Page Borders
|
|
m_oBorderLeft.SetDefault();
|
|
m_oBorderTop.SetDefault();
|
|
m_oBorderRight.SetDefault();
|
|
m_oBorderBottom.SetDefault();
|
|
|
|
DEFAULT_PROPERTY ( m_nBorderArt )
|
|
DEFAULT_PROPERTY ( m_nBorderMeasure )
|
|
DEFAULT_PROPERTY ( m_nBorderAlign )
|
|
|
|
//footer - header надо обнулять вручную
|
|
//m_oHeaderLeft = TextItemContainerPtr();
|
|
//m_oHeaderFirst = TextItemContainerPtr();
|
|
//m_oHeaderRight = TextItemContainerPtr();
|
|
//m_oFooterLeft = TextItemContainerPtr();
|
|
//m_oFooterFirst = TextItemContainerPtr();
|
|
//m_oFooterRight = TextItemContainerPtr();
|
|
|
|
DEFAULT_PROPERTY( m_nSrAuth)
|
|
DEFAULT_PROPERTY( m_nSrDate)
|
|
|
|
m_pOldSectionProp = RtfSectionPropertyPtr();
|
|
}
|
|
|
|
RtfSectionProperty::ColumnProperty::ColumnProperty()
|
|
{
|
|
}
|
|
RtfSectionProperty::ColumnProperty::ColumnProperty( const RtfSectionProperty::ColumnProperty& oColumnProperty )
|
|
{
|
|
(*this) = oColumnProperty;
|
|
}
|
|
RtfSectionProperty::ColumnProperty& RtfSectionProperty::ColumnProperty::operator=( const RtfSectionProperty::ColumnProperty& oColumnProperty )
|
|
{
|
|
m_aCollumnProperty.clear();
|
|
m_aCollumnProperty = oColumnProperty.m_aCollumnProperty ;
|
|
return (*this);
|
|
}
|
|
void RtfSectionProperty::ColumnProperty::SetDefault()
|
|
{
|
|
m_aCollumnProperty.clear();
|
|
}
|
|
|
|
RtfSection::RtfSection()
|
|
{
|
|
m_bFinalize = false;
|
|
}
|
|
int RtfSection::GetType()
|
|
{
|
|
return TYPE_RTF_SECTION;
|
|
}
|
|
std::wstring RtfSection::RenderToRtf(RenderParameter oRenderParameter)
|
|
{
|
|
std::wstring sResult = m_oProperty.RenderToRtf( oRenderParameter );
|
|
|
|
if( RENDER_TO_RTF_PARAM_NO_SECT != oRenderParameter.nType )
|
|
sResult += L"\\sectd";
|
|
|
|
for( size_t i = 0; i < m_aArray.size(); i++ )
|
|
{
|
|
sResult += m_aArray[i]->RenderToRtf( oRenderParameter );
|
|
}
|
|
return sResult;
|
|
}
|
|
std::wstring RtfSection::RenderToOOX(RenderParameter oRenderParameter)
|
|
{
|
|
if (!m_bFinalize) return L"";
|
|
|
|
m_bFinalize = false; // тут .. чтобы не повторилось при конвертации колонтитулов
|
|
|
|
RenderParameter oNewParam = oRenderParameter;
|
|
oNewParam.nType = RENDER_TO_OOX_PARAM_UNKNOWN;
|
|
|
|
return m_oProperty.RenderToOOX(oNewParam);
|
|
}
|