Files
core/ASCOfficeRtfFile/RtfFormatLib/source/RtfMath.cpp
2016-08-26 16:52:41 +03:00

328 lines
14 KiB
C++

/*
* (c) Copyright Ascensio System SIA 2010-2016
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "RtfMath.h"
#include "../../../Common/DocxFormat/Source/DocxFormat/WritingElement.h"
bool RtfMath::IsRtfControlPropertyBool( CString sControlW )
{
const TCHAR* mc_aRtfControlWords[] = { L"maln", L"malnScr", L"mdegHide", L"mdiff", L"mdispDef",
L"mgrow", L"mhideBot", L"mhideLeft", L"mhideRight", L"mhideTop", L"mlit", L"mmaxDist", L"mnoBreak", L"mnor",
L"mobjDist", L"mopEmu", L"mplcHide", L"mshow", L"msmallFracN", L"mstrikeBLTR", L"mstrikeH", L"mstrikeTLBR",
L"mstrikeV", L"msubHide", L"msupHide", L"mtransp", L"mwrapRight", L"mzeroAsc", L"mzeroDesc", L"mzeroWid"};
int mc_nRtfControlWordsSize = sizeof( mc_aRtfControlWords ) / sizeof( TCHAR* );
//можно бинарный поиск вставить
for( int i = 0; i < mc_nRtfControlWordsSize; i++ )
if( mc_aRtfControlWords[ i ] == sControlW )
return true;
return false;
}
bool RtfMath::IsRtfControlProperty( CString sControlW )
{
const TCHAR* mc_aRtfControlWords[] = {L"margSz", L"mbaseJc", L"mbegChr", L"mbrkBin", L"mbrkBinSub", L"mcGp",
L"mcGpRule", L"mchr", L"mcount", L"mcSp", L"mdefJc", L"mendChr", L"minterSp", L"mintLim", L"mintraSp", L"mmJc",
L"mlimLoc", L"mlMargin", L"mmcJc", L"mnaryLim", L"mpos", L"mpostSp", L"mpreSp", L"mrMargin", L"mrSp", L"mrSpRule",
L"msepChr", L"mshp", L"mtype", L"mvertJc", L"mwrapIndent", L"mmathFont"};
int mc_nRtfControlWordsSize = sizeof( mc_aRtfControlWords ) / sizeof( TCHAR* );
//можно бинарный поиск вставить
for( int i = 0; i < mc_nRtfControlWordsSize; i++ )
if( mc_aRtfControlWords[ i ] == sControlW )
return true;
return false;
}
bool RtfMath::IsRtfControlWord( CString sControlW )
{
const TCHAR* mc_aRtfControlWords[] = { L"moMath", L"moMathPara", L"moMathParaPr", L"maccPr", L"macc",
L"me", L"mctrlPr", L"margPr", L"mbarPr", L"mbar", L"mborderBoxPr", L"mborderBox", L"mboxPr", L"mbox"/*, L"mbrk"*/,
L"mdPr", L"md", L"meqArrPr", L"meqArr", L"mfPr", L"mf", L"mfuncPr", L"mfunc",
L"mgroupChrPr", L"mgroupChr", L"mlimLowPr", L"mlimLow",L"mlimUppPr", L"mlimUpp", L"mmathPr", L"mmcPr", L"mmc",
L"mmcs", L"mmPr", L"mmr", L"mm", L"mnaryPr", L"mnary", L"mphantPr", L"mphant", L"mmRun", L"mmDel",
L"mmIns", L"mradPr", L"mrad", /*MRPr",*/ L"msPrePr", L"msPre", L"msSubPr", L"msSub", L"msSubSupPr",
L"msSubSup", L"msSupPr", L"msSup", L"msub", L"msup", L"mden", L"mlim", L"mnum", L"mdeg"/*mmText",*/, L"mfName", L"mscr", L"mrPr" };
int mc_nRtfControlWordsSize = sizeof( mc_aRtfControlWords ) / sizeof( TCHAR* );
//можно бинарный поиск вставить
for( int i = 0; i < mc_nRtfControlWordsSize; i++ )
if( mc_aRtfControlWords[ i ] == sControlW )
return true;
return false;
}
CString RtfMath::RenderToRtf(RenderParameter oRenderParameter)
{
if (m_sRtfName.IsEmpty())
return L"";
CString sResult;
if( RENDER_TO_RTF_PARAM_NESTED != oRenderParameter.nType )
sResult += _T("{\\mmath");
sResult += _T("{\\") + m_sRtfName;
RenderParameter oNewParameter = oRenderParameter;
CString sVal;
if (m_bIsVal)
{
oNewParameter.nType = RENDER_TO_RTF_PARAM_CHAR;
sVal = m_oVal.RenderToRtf( oNewParameter ) ;
}
else
{
oNewParameter.nType = RENDER_TO_RTF_PARAM_UNKNOWN;
for( int i = 0; i < m_oVal.GetCount(); i++ )
{
sVal += _T(" ") + m_oVal[i]->RenderToRtf( oNewParameter );
}
}
if (!sVal.IsEmpty())
{
sResult += sVal;
}
//else
{
oNewParameter.nType = RENDER_TO_RTF_PARAM_NESTED;
for( int i = 0; i < (int)m_aArray.size(); i++ )
sResult += m_aArray[i]->RenderToRtf( oNewParameter );
}
sResult += _T("}");
if( RENDER_TO_RTF_PARAM_NESTED != oRenderParameter.nType )
sResult += _T("}");// m_sRtfName
return sResult;
}
CString RtfMath::RenderToOOX(RenderParameter oRenderParameter)
{
if (m_sOOXName.IsEmpty()) return L"";
CString sResult;
CString sContent;
CString sProp;
CString sVal;
RenderParameter oNewParam = oRenderParameter;
if (m_bIsVal || m_bIsBool)
{
oNewParam.nType = RENDER_TO_OOX_PARAM_PLAIN;
for( int i = 0; i < (int)m_aArray.size(); i++ )
{
sVal += m_aArray[i]->RenderToOOX(oNewParam);
}
if (sVal.IsEmpty())
{
oNewParam.nType = RENDER_TO_OOX_PARAM_PLAIN;
sVal = m_oVal.RenderToOOX(oNewParam);
}
}
else
{
oNewParam.nType = RENDER_TO_OOX_PARAM_MATH;
for( int i = 0; i < (int)m_aArray.size(); i++ )
{
sContent += m_aArray[i]->RenderToOOX(oNewParam);
}
}
sResult += _T("<");
sResult += m_sOOXName;
if( false == sVal.IsEmpty() )
{
if (m_bIsBool)
{
if (sVal == L"on") sVal = L"1";
else sVal = L"0";
}
sResult += _T(" m:val=\"");
sResult += sVal;
sResult += _T("\"");
}
sResult += _T(">");
sResult += sProp;
sResult += sContent;
sResult += _T("</");
sResult += m_sOOXName;
sResult += _T(">");
//альтернативная картинка
// if( NULL != m_oPicture )
// sResult += m_oPicture->RenderToOOX(oRenderParameter);
return sResult;
}
void RtfMath::SetOOXType(int type)
{
OOX::EElementType type_ms = (OOX::EElementType)type;
switch(type_ms)
{
case OOX::et_m_acc: m_sRtfName = L"macc"; break;
case OOX::et_m_accPr: m_sRtfName = L"maccPr"; break;
case OOX::et_m_aln: m_sRtfName = L"maln"; break;
case OOX::et_m_alnScr: m_sRtfName = L"malnScr"; break;
case OOX::et_m_argPr: m_sRtfName = L"margPr"; break;
case OOX::et_m_argSz: m_sRtfName = L"margSz"; break;
case OOX::et_m_bar: m_sRtfName = L"mbar"; break;
case OOX::et_m_barPr: m_sRtfName = L"mbarPr"; break;
case OOX::et_m_baseJc: m_sRtfName = L"mbaseJc"; break;
case OOX::et_m_begChr: m_sRtfName = L"mbegChr"; break;
case OOX::et_m_borderBox: m_sRtfName = L"mborderBox"; break;
case OOX::et_m_borderBoxPr: m_sRtfName = L"mborderBoxPr"; break;
case OOX::et_m_box: m_sRtfName = L"mbox"; break;
case OOX::et_m_boxPr: m_sRtfName = L"mboxPr"; break;
case OOX::et_m_brk: m_sRtfName = L"mbrk"; break;
case OOX::et_m_brkBin: m_sRtfName = L"mbrkBin"; break;
case OOX::et_m_brkBinSub: m_sRtfName = L"mbrkBinSub"; break;
case OOX::et_m_cGp: m_sRtfName = L"mcGp"; break;
case OOX::et_m_cGpRule: m_sRtfName = L"mcGpRule"; break;
case OOX::et_m_chr: m_sRtfName = L"mchr"; break;
case OOX::et_m_count: m_sRtfName = L"mcount"; break;
case OOX::et_m_cSp: m_sRtfName = L"mcSp"; break;
case OOX::et_m_ctrlPr: m_sRtfName = L"mctrlPr"; break;
case OOX::et_m_d: m_sRtfName = L"md"; break;
case OOX::et_m_defJc: m_sRtfName = L"mdefJc"; break;
case OOX::et_m_deg: m_sRtfName = L"mdeg"; break;
case OOX::et_m_degHide: m_sRtfName = L"mdegHide"; break;
case OOX::et_m_den: m_sRtfName = L"mden"; break;
case OOX::et_m_diff: m_sRtfName = L"mdiff"; break;
case OOX::et_m_dispDef: m_sRtfName = L"mdispDef"; break;
case OOX::et_m_dPr: m_sRtfName = L"mdPr"; break;
case OOX::et_m_e: m_sRtfName = L"me"; break;
case OOX::et_m_endChr: m_sRtfName = L"mendChr"; break;
case OOX::et_m_eqArr: m_sRtfName = L"meqArr"; break;
case OOX::et_m_eqArrPr: m_sRtfName = L"meqArrPr"; break;
case OOX::et_m_f: m_sRtfName = L"mf"; break;
case OOX::et_m_fName: m_sRtfName = L"mfName"; break;
case OOX::et_m_fPr: m_sRtfName = L"mfPr"; break;
case OOX::et_m_func: m_sRtfName = L"mfunc"; break;
case OOX::et_m_funcPr: m_sRtfName = L"mfuncPr"; break;
case OOX::et_m_groupChr: m_sRtfName = L"mgroupChr"; break;
case OOX::et_m_groupChrPr: m_sRtfName = L"mgroupChrPr"; break;
case OOX::et_m_grow: m_sRtfName = L"mgrow"; break;
case OOX::et_m_hideBot: m_sRtfName = L"mhideBot"; break;
case OOX::et_m_hideLeft: m_sRtfName = L"mhideLeft"; break;
case OOX::et_m_hideRight: m_sRtfName = L"mhideRight"; break;
case OOX::et_m_hideTop: m_sRtfName = L"mhideTop"; break;
case OOX::et_m_interSp: m_sRtfName = L"minterSp"; break;
case OOX::et_m_intLim: m_sRtfName = L"mintLim"; break;
case OOX::et_m_intraSp: m_sRtfName = L"mintraSp"; break;
case OOX::et_m_jc: m_sRtfName = L"mjc"; break;
case OOX::et_m_lim: m_sRtfName = L"mlim"; break;
case OOX::et_m_limLoc: m_sRtfName = L"mlimLoc"; break;
case OOX::et_m_limLow: m_sRtfName = L"mlimLow"; break;
case OOX::et_m_limLowPr: m_sRtfName = L"mlimLowPr"; break;
case OOX::et_m_limUpp: m_sRtfName = L"mlimUpp"; break;
case OOX::et_m_limUppPr: m_sRtfName = L"mlimUppPr"; break;
case OOX::et_m_lit: m_sRtfName = L"mlit"; break;
case OOX::et_m_lMargin: m_sRtfName = L"mlMargin"; break;
case OOX::et_m_m: m_sRtfName = L"mm"; break;
case OOX::et_m_mathFont: m_sRtfName = L"mmathFont"; break;
case OOX::et_m_mathPr: m_sRtfName = L"mmathPr"; break;
case OOX::et_m_maxDist: m_sRtfName = L"mmaxDist"; break;
case OOX::et_m_mc: m_sRtfName = L"mmc"; break;
case OOX::et_m_mcJc: m_sRtfName = L"mmcJc"; break;
case OOX::et_m_mcPr: m_sRtfName = L"mmcPr"; break;
case OOX::et_m_mcs: m_sRtfName = L"mmcs"; break;
case OOX::et_m_mPr: m_sRtfName = L"mmPr"; break;
case OOX::et_m_mr: m_sRtfName = L"mmr"; break;
case OOX::et_m_nary: m_sRtfName = L"mnary"; break;
case OOX::et_m_naryLim: m_sRtfName = L"mnaryLim"; break;
case OOX::et_m_naryPr: m_sRtfName = L"mnaryPr"; break;
case OOX::et_m_noBreak: m_sRtfName = L"mnoBreak"; break;
case OOX::et_m_nor: m_sRtfName = L"mnor"; break;
case OOX::et_m_num: m_sRtfName = L"mnum"; break;
case OOX::et_m_objDist: m_sRtfName = L"mobjDist"; break;
case OOX::et_m_oMath: m_sRtfName = L"moMath"; break;
case OOX::et_m_oMathPara: m_sRtfName = L"moMathPara"; break;
case OOX::et_m_oMathParaPr: m_sRtfName = L"moMathParaPr"; break;
case OOX::et_m_opEmu: m_sRtfName = L"mopEmu"; break;
case OOX::et_m_phant: m_sRtfName = L"mphant"; break;
case OOX::et_m_phantPr: m_sRtfName = L"mphantPr"; break;
case OOX::et_m_plcHide: m_sRtfName = L"mplcHide"; break;
case OOX::et_m_pos: m_sRtfName = L"mpos"; break;
case OOX::et_m_postSp: m_sRtfName = L"mpostSp"; break;
case OOX::et_m_preSp: m_sRtfName = L"mpreSp"; break;
case OOX::et_m_r: m_sRtfName = L"mr"; break;
case OOX::et_m_rad: m_sRtfName = L"mrad"; break;
case OOX::et_m_radPr: m_sRtfName = L"mradPr"; break;
case OOX::et_m_rMargin: m_sRtfName = L"mrMargin"; break;
case OOX::et_m_rPr: m_sRtfName = L"mrPr"; break;
case OOX::et_m_rSp: m_sRtfName = L"mrSp"; break;
case OOX::et_m_rSpRule: m_sRtfName = L"mrSpRule"; break;
case OOX::et_m_scr: m_sRtfName = L"mscr"; break;
case OOX::et_m_sepChr: m_sRtfName = L"msepChr"; break;
case OOX::et_m_show: m_sRtfName = L"mshow"; break;
case OOX::et_m_shp: m_sRtfName = L"mshp"; break;
case OOX::et_m_smallFrac: m_sRtfName = L"msmallFrac"; break;
case OOX::et_m_sPre: m_sRtfName = L"msPre"; break;
case OOX::et_m_sPrePr: m_sRtfName = L"msPrePr"; break;
case OOX::et_m_sSub: m_sRtfName = L"msSub"; break;
case OOX::et_m_sSubPr: m_sRtfName = L"msSubPr"; break;
case OOX::et_m_sSubSup: m_sRtfName = L"msSubSup"; break;
case OOX::et_m_sSubSupPr: m_sRtfName = L"msSubSupPr"; break;
case OOX::et_m_sSup: m_sRtfName = L"msSup"; break;
case OOX::et_m_sSupPr: m_sRtfName = L"msSupPr"; break;
case OOX::et_m_strikeBLTR: m_sRtfName = L"mstrikeBLTR"; break;
case OOX::et_m_strikeH: m_sRtfName = L"mstrikeH"; break;
case OOX::et_m_strikeTLBR: m_sRtfName = L"mstrikeTLBR"; break;
case OOX::et_m_strikeV: m_sRtfName = L"mstrikeV"; break;
case OOX::et_m_sty: m_sRtfName = L"msty"; break;
case OOX::et_m_sub: m_sRtfName = L"msub"; break;
case OOX::et_m_subHide: m_sRtfName = L"msubHide"; break;
case OOX::et_m_sup: m_sRtfName = L"msup"; break;
case OOX::et_m_supHide: m_sRtfName = L"msupHide"; break;
case OOX::et_m_t: m_sRtfName = L"mt"; break;
case OOX::et_m_transp: m_sRtfName = L"mtransp"; break;
case OOX::et_m_type: m_sRtfName = L"mtype"; break;
case OOX::et_m_vertJc: m_sRtfName = L"mvertJc"; break;
case OOX::et_m_wrapIndent: m_sRtfName = L"mwrapIndent"; break;
case OOX::et_m_wrapRight: m_sRtfName = L"mwrapRight"; break;
case OOX::et_m_zeroAsc: m_sRtfName = L"mzeroAsc"; break;
case OOX::et_m_zeroDesc: m_sRtfName = L"mzeroDesc"; break;
case OOX::et_m_zeroWid: m_sRtfName = L"mzeroWid"; break;
default:
{
m_sRtfName = L"";
break;
}
}
}