mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
fix bug #45121
This commit is contained in:
@ -1163,8 +1163,6 @@ bool RtfCharPropsCommand::ExecuteCommand(RtfDocument& oDocument, RtfReader& oRea
|
||||
COMMAND_RTF_INT ( "lang", charProps->m_nLanguage, sCommand, hasParameter, parameter)
|
||||
COMMAND_RTF_INT ( "langfe", charProps->m_nLanguageAsian,sCommand, hasParameter, parameter)
|
||||
|
||||
COMMAND_RTF_INT("alang", charProps->m_nLanguage, sCommand, hasParameter, parameter)
|
||||
|
||||
COMMAND_RTF_BOOL( "outl", charProps->m_bOutline, sCommand, hasParameter, parameter)
|
||||
COMMAND_RTF_BOOL( "scaps", charProps->m_bScaps, sCommand, hasParameter, parameter)
|
||||
COMMAND_RTF_BOOL( "shad", charProps->m_bShadow, sCommand, hasParameter, parameter)
|
||||
@ -1178,7 +1176,7 @@ bool RtfCharPropsCommand::ExecuteCommand(RtfDocument& oDocument, RtfReader& oRea
|
||||
if ( hasParameter )
|
||||
charProps->m_nForeColor = parameter;
|
||||
else
|
||||
charProps->m_nForeColor= PROP_DEF;
|
||||
charProps->m_nForeColor = PROP_DEF; //auto?
|
||||
}
|
||||
else if ( "ul" == sCommand )
|
||||
{
|
||||
@ -1432,8 +1430,7 @@ bool RtfTableCellPropsCommand::ExecuteCommand(RtfDocument& oDocument, RtfReader&
|
||||
COMMAND_RTF_BOOL( "clvmrg", cellProps->m_bMergeVertical, sCommand, hasParameter, parameter )
|
||||
COMMAND_RTF_BOOL( "clFitText", cellProps->m_bFitText, sCommand, hasParameter, parameter )
|
||||
COMMAND_RTF_BOOL( "clNoWrap", cellProps->m_bNoWrap, sCommand, hasParameter, parameter )
|
||||
|
||||
//https://www.office-forums.com/threads/rtf-file-weirdness-clpadt-vs-clpadl.2163500/
|
||||
//https://www.office-forums.com/threads/rtf-file-weirdness-clpadt-vs-clpadl.2163500/
|
||||
COMMAND_RTF_INT ( "clpadft", cellProps->m_ePaddingLeftUnit, sCommand, hasParameter, parameter ) //перепутаны top & left
|
||||
COMMAND_RTF_INT ( "clpadt", cellProps->m_nPaddingLeft, sCommand, hasParameter, parameter ) //перепутаны top & left
|
||||
COMMAND_RTF_INT ( "clpadfl", cellProps->m_ePaddingTopUnit, sCommand, hasParameter, parameter ) //перепутаны top & left
|
||||
@ -4055,7 +4052,7 @@ void RtfParagraphPropDestination::AddItem( RtfParagraphPtr oItem, RtfReader& oRe
|
||||
{
|
||||
if ( nCurItap > 0 ) //Если до этого были только параграфы в таблицах - завершаем таблицу
|
||||
{
|
||||
if (bEndRow) EndRows(oReader); //ê¡ñ¿ó¿ñπá½∞¡á∩ »α«úαá¼¼á.rtf
|
||||
if (bEndRow) EndRows(oReader);
|
||||
|
||||
RtfTablePtr oNewTable ( new RtfTable() );
|
||||
oNewTable->m_oProperty = oCurRowProperty;
|
||||
|
||||
@ -1002,6 +1002,54 @@ std::wstring RtfShading::RenderToOOX(RenderParameter oRenderParameter)
|
||||
m_nValue = 0;
|
||||
|
||||
std::wstring sShading;
|
||||
if (PROP_DEF != m_nValue)
|
||||
{
|
||||
std::wstring sValue;
|
||||
if (0 <= m_nValue && m_nValue <= 2) sShading += L" w:val=\"clear\"";
|
||||
else if (2 < m_nValue && m_nValue <= 7) sShading += L" w:val=\"pct5\"";
|
||||
else if (7 < m_nValue && m_nValue <= 11) sShading += L" w:val=\"pct10\"";
|
||||
else if (11 < m_nValue && m_nValue <= 13) sShading += L" w:val=\"pct12\"";
|
||||
else if (13 < m_nValue && m_nValue <= 17) sShading += L" w:val=\"pct15\"";
|
||||
else if (17 < m_nValue && m_nValue <= 22) sShading += L" w:val=\"pct20\"";
|
||||
else if (22 < m_nValue && m_nValue <= 27) sShading += L" w:val=\"pct25\"";
|
||||
else if (27 < m_nValue && m_nValue <= 32) sShading += L" w:val=\"pct30\"";
|
||||
else if (32 < m_nValue && m_nValue <= 36) sShading += L" w:val=\"pct35\"";
|
||||
else if (36 < m_nValue && m_nValue <= 38) sShading += L" w:val=\"pct37\"";
|
||||
else if (38 < m_nValue && m_nValue <= 42) sShading += L" w:val=\"pct40\"";
|
||||
else if (42 < m_nValue && m_nValue <= 47) sShading += L" w:val=\"pct45\"";
|
||||
else if (47 < m_nValue && m_nValue <= 52) sShading += L" w:val=\"pct50\"";
|
||||
else if (52 < m_nValue && m_nValue <= 57) sShading += L" w:val=\"pct55\"";
|
||||
else if (57 < m_nValue && m_nValue <= 61) sShading += L" w:val=\"pct60\"";
|
||||
else if (61 < m_nValue && m_nValue <= 63) sShading += L" w:val=\"pct62\"";
|
||||
else if (63 < m_nValue && m_nValue <= 70) sShading += L" w:val=\"pct65\"";
|
||||
else if (70 < m_nValue && m_nValue <= 80) sShading += L" w:val=\"pct75\"";
|
||||
else if (80 < m_nValue && m_nValue <= 86) sShading += L" w:val=\"pct85\"";
|
||||
else if (86 < m_nValue && m_nValue <= 88) sShading += L" w:val=\"pct87\"";
|
||||
else if (88 < m_nValue && m_nValue <= 92) sShading += L" w:val=\"pct90\"";
|
||||
else if (92 < m_nValue && m_nValue <= 97) sShading += L" w:val=\"pct95\"";
|
||||
else if (97 < m_nValue && m_nValue <= 100) sShading += L" w:val=\"solid\"";
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (m_eType)
|
||||
{
|
||||
case st_clshdrawnil: sShading += L" w:val=\"nil\""; break;
|
||||
case st_chbghoriz: sShading += L" w:val=\"thinHorzStripehorzStripe\""; break;
|
||||
case st_chbgvert: sShading += L" w:val=\"thinVertStripe\""; break;
|
||||
case st_chbgfdiag: sShading += L" w:val=\"thinReverseDiagStripe\""; break;
|
||||
case st_chbgbdiag: sShading += L" w:val=\"thinDiagStripe\""; break;
|
||||
case st_chbgcross: sShading += L" w:val=\"thinHorzCross\""; break;
|
||||
case st_chbgdcross: sShading += L" w:val=\"thinDiagCross\""; break;
|
||||
case st_chbgdkhoriz: sShading += L" w:val=\"horzStripe\""; break;
|
||||
case st_chbgdkvert: sShading += L" w:val=\"vertStripe\""; break;
|
||||
case st_chbgdkfdiag: sShading += L" w:val=\"reverseDiagStripe\""; break;
|
||||
case st_chbgdkbdiag: sShading += L" w:val=\"diagStripe\""; break;
|
||||
case st_chbgdkcross: sShading += L" w:val=\"horzCross\""; break;
|
||||
case st_chbgdkdcross: sShading += L" w:val=\"diagCross\""; break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( PROP_DEF != m_nForeColor )
|
||||
{
|
||||
RtfColor oForeColor;
|
||||
@ -1014,54 +1062,6 @@ std::wstring RtfShading::RenderToOOX(RenderParameter oRenderParameter)
|
||||
if( true == poRtfDocument->m_oColorTable.GetColor( m_nBackColor, oBackColor ) )
|
||||
sShading += L" w:fill=\"" + oBackColor.RenderToOOX(oNewParam) + L"\"";
|
||||
}
|
||||
if( PROP_DEF != m_nValue )
|
||||
{
|
||||
std::wstring sValue;
|
||||
if( 0 <= m_nValue && m_nValue <= 2 ) sShading += L" w:val=\"clear\"";
|
||||
else if( 2 < m_nValue && m_nValue <= 7 ) sShading += L" w:val=\"pct5\"";
|
||||
else if( 7 < m_nValue && m_nValue <= 11 ) sShading += L" w:val=\"pct10\"";
|
||||
else if( 11 < m_nValue && m_nValue <= 13 ) sShading += L" w:val=\"pct12\"";
|
||||
else if( 13 < m_nValue && m_nValue <= 17 ) sShading += L" w:val=\"pct15\"";
|
||||
else if( 17 < m_nValue && m_nValue <= 22 ) sShading += L" w:val=\"pct20\"";
|
||||
else if( 22 < m_nValue && m_nValue <= 27 ) sShading += L" w:val=\"pct25\"";
|
||||
else if( 27 < m_nValue && m_nValue <= 32 ) sShading += L" w:val=\"pct30\"";
|
||||
else if( 32 < m_nValue && m_nValue <= 36 ) sShading += L" w:val=\"pct35\"";
|
||||
else if( 36 < m_nValue && m_nValue <= 38 ) sShading += L" w:val=\"pct37\"";
|
||||
else if( 38 < m_nValue && m_nValue <= 42 ) sShading += L" w:val=\"pct40\"";
|
||||
else if( 42 < m_nValue && m_nValue <= 47 ) sShading += L" w:val=\"pct45\"";
|
||||
else if( 47 < m_nValue && m_nValue <= 52 ) sShading += L" w:val=\"pct50\"";
|
||||
else if( 52 < m_nValue && m_nValue <= 57 ) sShading += L" w:val=\"pct55\"";
|
||||
else if( 57 < m_nValue && m_nValue <= 61 ) sShading += L" w:val=\"pct60\"";
|
||||
else if( 61 < m_nValue && m_nValue <= 63 ) sShading += L" w:val=\"pct62\"";
|
||||
else if( 63 < m_nValue && m_nValue <= 70 ) sShading += L" w:val=\"pct65\"";
|
||||
else if( 70 < m_nValue && m_nValue <= 80 ) sShading += L" w:val=\"pct75\"";
|
||||
else if( 80 < m_nValue && m_nValue <= 86 ) sShading += L" w:val=\"pct85\"";
|
||||
else if( 86 < m_nValue && m_nValue <= 88 ) sShading += L" w:val=\"pct87\"";
|
||||
else if( 88 < m_nValue && m_nValue <= 92 ) sShading += L" w:val=\"pct90\"";
|
||||
else if( 92 < m_nValue && m_nValue <= 97 ) sShading += L" w:val=\"pct95\"";
|
||||
else if( 97 < m_nValue && m_nValue <= 100 ) sShading += L" w:val=\"solid\"";
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( m_eType )
|
||||
{
|
||||
case st_clshdrawnil: sShading += L" w:val=\"nil\""; break;
|
||||
case st_chbghoriz: sShading += L" w:val=\"thinHorzStripehorzStripe\""; break;
|
||||
case st_chbgvert: sShading += L" w:val=\"thinVertStripe\""; break;
|
||||
case st_chbgfdiag: sShading += L" w:val=\"thinReverseDiagStripe\""; break;
|
||||
case st_chbgbdiag: sShading += L" w:val=\"thinDiagStripe\""; break;
|
||||
case st_chbgcross: sShading += L" w:val=\"thinHorzCross\""; break;
|
||||
case st_chbgdcross: sShading += L" w:val=\"thinDiagCross\""; break;
|
||||
case st_chbgdkhoriz: sShading += L" w:val=\"horzStripe\""; break;
|
||||
case st_chbgdkvert: sShading += L" w:val=\"vertStripe\""; break;
|
||||
case st_chbgdkfdiag: sShading += L" w:val=\"reverseDiagStripe\""; break;
|
||||
case st_chbgdkbdiag: sShading += L" w:val=\"diagStripe\""; break;
|
||||
case st_chbgdkcross: sShading += L" w:val=\"horzCross\""; break;
|
||||
case st_chbgdkdcross: sShading += L" w:val=\"diagCross\""; break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( false == sShading.empty() )
|
||||
sResult = L"<w:shd " + sShading + L"/>";
|
||||
return sResult;
|
||||
@ -1077,7 +1077,7 @@ bool RtfBorder::operator==( const RtfBorder& oChar )
|
||||
}
|
||||
bool RtfBorder::IsValid()
|
||||
{
|
||||
return bt_none != m_eType;
|
||||
return PROP_DEF != m_eType;
|
||||
}
|
||||
int RtfBorder::GetType()
|
||||
{
|
||||
@ -1093,7 +1093,8 @@ void RtfBorder::SetDefaultOOX( )
|
||||
}
|
||||
void RtfBorder::SetDefault( )
|
||||
{
|
||||
DEFAULT_PROPERTY_DEF( m_eType, bt_none )
|
||||
DEFAULT_PROPERTY (m_eType)
|
||||
//DEFAULT_PROPERTY_DEF( m_eType, bt_none )
|
||||
DEFAULT_PROPERTY ( m_nWidth )
|
||||
DEFAULT_PROPERTY ( m_nSpace )
|
||||
DEFAULT_PROPERTY ( m_nColor )
|
||||
@ -1108,7 +1109,7 @@ void RtfBorder::SetEmpty( )
|
||||
void RtfBorder::Merge( RtfBorder& oBorPr )
|
||||
{
|
||||
//свойство должно быть как единое целое, поэтому если oBorPr задано, то переписыватся целиком
|
||||
if ( bt_none != oBorPr.m_eType || PROP_DEF != oBorPr.m_nWidth || PROP_DEF != oBorPr.m_nSpace || PROP_DEF != oBorPr.m_nColor )
|
||||
if (PROP_DEF != oBorPr.m_eType || PROP_DEF != oBorPr.m_nWidth || PROP_DEF != oBorPr.m_nSpace || PROP_DEF != oBorPr.m_nColor )
|
||||
{
|
||||
m_eType = oBorPr.m_eType;
|
||||
m_nWidth = oBorPr.m_nWidth;
|
||||
@ -4260,10 +4261,11 @@ std::wstring RtfCellProperty::RenderToOOX(RenderParameter oRenderParameter)
|
||||
if( PROP_DEF != m_nWidth )
|
||||
{
|
||||
if( mu_Percent == m_eWidthUnit )
|
||||
sResult += L"<w:tcW w:type=\"pct\" w:w=\"" + std::to_wstring(m_nWidth) + L"%\"/>";
|
||||
sResult += L"<w:tcW w:w=\"" + std::to_wstring(m_nWidth) + L"%\" w:type=\"pct\"/>";
|
||||
else if( mu_Twips == m_eWidthUnit )
|
||||
sResult += L"<w:tcW w:type=\"dxa\" w:w=\"" + std::to_wstring(m_nWidth) + L"\"/>";
|
||||
sResult += L"<w:tcW w:w=\"" + std::to_wstring(m_nWidth) + L"\" w:type=\"dxa\"/>";
|
||||
}
|
||||
RENDER_OOX_INT(m_nSpan, sResult, L"w:gridSpan");
|
||||
RENDER_OOX_BOOL( m_bHideMark, sResult, L"w:hideMark" )
|
||||
|
||||
RenderParameter oNewParam = oRenderParameter;
|
||||
@ -4280,26 +4282,26 @@ std::wstring RtfCellProperty::RenderToOOX(RenderParameter oRenderParameter)
|
||||
oNewParam.sValue = L"w:tr2bl";
|
||||
sBorder += m_oBorderDiagonalRL.RenderToOOX(oNewParam);
|
||||
}
|
||||
if( true == m_oBorderTop.IsValid() )
|
||||
{
|
||||
oNewParam.sValue = L"w:top";
|
||||
sBorder += m_oBorderTop.RenderToOOX(oNewParam);
|
||||
}
|
||||
if( true == m_oBorderLeft.IsValid() )
|
||||
{
|
||||
oNewParam.sValue = L"w:left";
|
||||
sBorder += m_oBorderLeft.RenderToOOX(oNewParam);
|
||||
}
|
||||
if( true == m_oBorderTop.IsValid() )
|
||||
if( true == m_oBorderBottom.IsValid() )
|
||||
{
|
||||
oNewParam.sValue = L"w:top";
|
||||
sBorder += m_oBorderTop.RenderToOOX(oNewParam);
|
||||
oNewParam.sValue = L"w:bottom";
|
||||
sBorder += m_oBorderBottom.RenderToOOX(oNewParam);
|
||||
}
|
||||
if( true == m_oBorderRight.IsValid() )
|
||||
{
|
||||
oNewParam.sValue = L"w:right";
|
||||
sBorder += m_oBorderRight.RenderToOOX(oNewParam);
|
||||
}
|
||||
if( true == m_oBorderBottom.IsValid() )
|
||||
{
|
||||
oNewParam.sValue = L"w:bottom";
|
||||
sBorder += m_oBorderBottom.RenderToOOX(oNewParam);
|
||||
}
|
||||
if( true == m_oBorderInsideH.IsValid() )
|
||||
{
|
||||
oNewParam.sValue = L"w:insideH";
|
||||
@ -4347,8 +4349,6 @@ std::wstring RtfCellProperty::RenderToOOX(RenderParameter oRenderParameter)
|
||||
break;
|
||||
}
|
||||
|
||||
RENDER_OOX_INT( m_nSpan, sResult, L"w:gridSpan" );
|
||||
|
||||
//std::wstring scnfStyle;
|
||||
//RENDER_OOX_BOOL_ATTRIBUTE( m_bStyleFirstRow, scnfStyle, L"w:firstRow" )
|
||||
//RENDER_OOX_BOOL_ATTRIBUTE( m_bStyleLastRow, scnfStyle, L"w:lastRow" )
|
||||
|
||||
@ -304,7 +304,7 @@ class RtfBorder
|
||||
{
|
||||
public:
|
||||
enum _BorderType
|
||||
{
|
||||
{
|
||||
bt_none,
|
||||
bt_brdrs, //brdrs Single-thickness border.
|
||||
bt_brdrth, //brdrth Double-thickness border.
|
||||
@ -335,8 +335,8 @@ public:
|
||||
bt_brdrdashdotstr, //brdrdashdotstr Striped border.
|
||||
bt_brdremboss, //brdremboss Embossed border.
|
||||
bt_brdrengrave, //brdrengrave Engraved border.
|
||||
} m_eType;
|
||||
|
||||
};
|
||||
_INT32 m_eType;
|
||||
_INT32 m_nWidth;
|
||||
_INT32 m_nSpace;
|
||||
_INT32 m_nColor;
|
||||
@ -425,17 +425,17 @@ public:
|
||||
_INT32 m_nAnimated; //animtextN Animated text properties (note: Word 2007 ignores this control word):
|
||||
|
||||
_INT32 m_bBold; //b* Bold.
|
||||
_INT32 m_bCaps; //caps* All capitals.
|
||||
_INT32 m_bCaps; //caps* All capitals.
|
||||
_INT32 m_nScalex; //charscalexN Character scaling value. The N argument is a value representing a percentage (default is 100).
|
||||
_INT32 m_nCharStyle; //csN Designates character style. If a character style is specified, style properties must be specified with the character run. N refers to an entry in the style table.
|
||||
_INT32 m_nDown; //dnN Move down N half-points (default is 6).
|
||||
_INT32 m_bEmbo; //embo* Emboss.
|
||||
_INT32 m_nCharacterSpacing;//expndtwN Expansion or compression of the space between characters in twips; a negative value compresses. For backward compatibility, both \expndtwN and \expndN should be emitted.
|
||||
_INT32 m_nDown; //dnN Move down N half-points (default is 6).
|
||||
_INT32 m_bEmbo; //embo* Emboss.
|
||||
_INT32 m_nCharacterSpacing; //expndtwN Expansion or compression of the space between characters in twips; a negative value compresses. For backward compatibility, both \expndtwN and \expndN should be emitted.
|
||||
_INT32 m_nFitText; //fittextN Fit the text in the current group in N twips. When N is set to -1 (\fittext-1), it indicates a continuation of the previous \fittextN run. In other words, {\fittext1000 Fit this} {\fittext-1 text} fits the string “Fit this text” in 1000 twips.
|
||||
_INT32 m_nFont; //fN Font number. N refers to an entry in the font table.
|
||||
_INT32 m_nFont; //fN Font number. N refers to an entry in the font table.
|
||||
_INT32 m_nFont2;
|
||||
_INT32 m_nFont3;
|
||||
_INT32 m_nFontSize; //fsN Font size in half-points (default is 24).
|
||||
_INT32 m_nFontSize; //fsN Font size in half-points (default is 24).
|
||||
_INT32 m_bItalic; //i* Italic.
|
||||
_INT32 m_bImprint; //impr* Engrave (imprint).
|
||||
_INT32 m_nKerning; //kerningN Point size (in half-points) above which to kern character pairs. \kerning0 turns off kerning.
|
||||
@ -875,10 +875,10 @@ public:
|
||||
_INT32 m_nSpacingBottom;
|
||||
_INT32 m_eSpacingBottomUnit;
|
||||
|
||||
_INT32 m_nWidth; //clwWidthN Preferred cell width. Overrides \trautofitN.
|
||||
_INT32 m_eWidthUnit; //clftsWidthN Units for \clwWidthN:
|
||||
_INT32 m_nWidth; //clwWidthN Preferred cell width. Overrides \trautofitN.
|
||||
_INT32 m_eWidthUnit; //clftsWidthN Units for \clwWidthN:
|
||||
|
||||
_INT32 m_bHideMark; //clhidemark This control word specifies whether the end of cell glyph shall influence the height of the given table row in the table. If it is specified, then only printing characters in this cell shall be used to determine the row height.
|
||||
_INT32 m_bHideMark; //clhidemark This control word specifies whether the end of cell glyph shall influence the height of the given table row in the table. If it is specified, then only printing characters in this cell shall be used to determine the row height.
|
||||
|
||||
RtfBorder m_oBorderDiagonalLR;
|
||||
RtfBorder m_oBorderDiagonalRL;
|
||||
@ -890,7 +890,7 @@ public:
|
||||
RtfBorder m_oBorderInsideV;
|
||||
|
||||
RtfShadingCell m_oShading;
|
||||
_INT32 m_nShadingPctFrom;
|
||||
_INT32 m_nShadingPctFrom;
|
||||
|
||||
typedef enum{ ca_none,
|
||||
ca_Top, //clvertalt Text is top-aligned in cell (the default).
|
||||
|
||||
@ -365,7 +365,7 @@ void RtfTable::AddToArray(std::vector<int>& aArray, int nValue)//todo можно
|
||||
bool bNeedAdd = true;
|
||||
for (size_t k = 0; k < aArray.size(); k++)
|
||||
{
|
||||
if (std::abs(aArray[k] - nValue) < 3)
|
||||
if (std::abs(aArray[k] - nValue) < 1)
|
||||
{
|
||||
bNeedAdd = false;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user