mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Fix bugs in HWPML conversion
This commit is contained in:
@ -2,6 +2,7 @@
|
||||
#define NODENAMES_H
|
||||
|
||||
#include "../HanType.h"
|
||||
#include <string>
|
||||
|
||||
namespace HWP
|
||||
{
|
||||
@ -398,7 +399,7 @@ inline const char* GetNodeName(ENode eNode, EHanType eType)
|
||||
}
|
||||
}
|
||||
|
||||
inline bool Equals(ENode eNode, EHanType eType, std::string sNodeName)
|
||||
inline bool Equals(ENode eNode, EHanType eType, const std::string& sNodeName)
|
||||
{
|
||||
switch (eType)
|
||||
{
|
||||
@ -411,7 +412,7 @@ inline bool Equals(ENode eNode, EHanType eType, std::string sNodeName)
|
||||
enum class EAttribute
|
||||
{
|
||||
ParaShape,
|
||||
Style,
|
||||
StyleId,
|
||||
CharShape,
|
||||
Href,
|
||||
SubPath,
|
||||
@ -584,12 +585,13 @@ enum class EAttribute
|
||||
FontType,
|
||||
TextShape,
|
||||
Spacing,
|
||||
Style,
|
||||
|
||||
PageBreak,
|
||||
ColumnBreak,
|
||||
};
|
||||
|
||||
#define MAX_ATTRIBUTES 176
|
||||
#define MAX_ATTRIBUTES 177
|
||||
|
||||
//TODO:: добавить все аргументы
|
||||
static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] =
|
||||
@ -770,6 +772,7 @@ static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] =
|
||||
"fontType",
|
||||
"textShape",
|
||||
"spacing",
|
||||
"style",
|
||||
|
||||
"pageBreak",
|
||||
"columnBreak",
|
||||
@ -950,6 +953,7 @@ static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] =
|
||||
"FontType",
|
||||
"TextShape",
|
||||
"Spacing",
|
||||
"Style",
|
||||
|
||||
"PageBreak",
|
||||
"ColumnBreak"
|
||||
@ -966,7 +970,7 @@ inline const char* GetAttributeName(EAttribute eNode, EHanType eType)
|
||||
}
|
||||
}
|
||||
|
||||
inline bool Equals(EAttribute eAttribute, EHanType eType, std::string sAttributeName)
|
||||
inline bool Equals(EAttribute eAttribute, EHanType eType, const std::string& sAttributeName)
|
||||
{
|
||||
switch (eType)
|
||||
{
|
||||
|
||||
@ -1903,25 +1903,63 @@ void CConverter2OOXML::WriteLineSettings(const CCtrlGeneralShape* pCtrlGeneralSh
|
||||
if (nullptr == pCtrlGeneralShape)
|
||||
return;
|
||||
|
||||
WriteLineSettings(pCtrlGeneralShape->GetLineStyle(), pCtrlGeneralShape->GetLineColor(), pCtrlGeneralShape->GetLineThick(), 1, oBuilder);
|
||||
WriteLineSettings({pCtrlGeneralShape->GetLineStyle(), pCtrlGeneralShape->GetLineColor(),
|
||||
pCtrlGeneralShape->GetLineThick(), 1,
|
||||
pCtrlGeneralShape->GetLineHeadStyle(), pCtrlGeneralShape->GetLineHeadSize(),
|
||||
pCtrlGeneralShape->GetLineTailStyle(), pCtrlGeneralShape->GetLineTailSize()}, oBuilder);
|
||||
|
||||
}
|
||||
|
||||
void CConverter2OOXML::WriteLineSettings(ELineStyle2 eLineStyle, int nColor, int nThick, HWP_BYTE nCompoundLineType, NSStringUtils::CStringBuilder& oBuilder)
|
||||
void WriteLineArrowStyles(ELineArrowStyle eArrowStyle, ELineArrowSize eArrowSize, NSStringUtils::CStringBuilder& oBuilder)
|
||||
{
|
||||
if (ELineStyle2::NONE == eLineStyle)
|
||||
switch (eArrowStyle)
|
||||
{
|
||||
case ELineArrowStyle::ARROW: oBuilder.WriteString(L" type=\"triangle\""); break;
|
||||
case ELineArrowStyle::SPEAR: oBuilder.WriteString(L" type=\"arrow\""); break;
|
||||
case ELineArrowStyle::CONCAVE_ARROW: oBuilder.WriteString(L" type=\"stealth\""); break;
|
||||
case ELineArrowStyle::DIAMOND:
|
||||
case ELineArrowStyle::EMPTY_DIAMOND:
|
||||
case ELineArrowStyle::BOX:
|
||||
case ELineArrowStyle::EMPTY_BOX: oBuilder.WriteString(L" type=\"diamond\""); break;
|
||||
case ELineArrowStyle::CIRCLE:
|
||||
case ELineArrowStyle::EMPTY_CIRCLE: oBuilder.WriteString(L" type=\"oval\""); break;
|
||||
case ELineArrowStyle::NORMAL:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (eArrowSize)
|
||||
{
|
||||
case ELineArrowSize::SMALL_SMALL: oBuilder.WriteString(L" w=\"sm\" len=\"sm\""); break;
|
||||
case ELineArrowSize::SMALL_MEDIUM: oBuilder.WriteString(L" w=\"sm\" len=\"med\""); break;
|
||||
case ELineArrowSize::SMALL_LARGE: oBuilder.WriteString(L" w=\"sm\" len=\"lg\""); break;
|
||||
case ELineArrowSize::MEDIUM_SMALL: oBuilder.WriteString(L" w=\"med\" len=\"sm\""); break;
|
||||
case ELineArrowSize::MEDIUM_MEDIUM: oBuilder.WriteString(L" w=\"med\" len=\"med\""); break;
|
||||
case ELineArrowSize::MEDIUM_LARGE: oBuilder.WriteString(L" w=\"med\" len=\"lg\""); break;
|
||||
case ELineArrowSize::LARGE_SMALL: oBuilder.WriteString(L" w=\"lg\" len=\"sm\""); break;
|
||||
case ELineArrowSize::LARGE_MEDIUM: oBuilder.WriteString(L" w=\"lg\" len=\"med\""); break;
|
||||
case ELineArrowSize::LARGE_LARGE: oBuilder.WriteString(L" w=\"lg\" len=\"lg\""); break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CConverter2OOXML::WriteLineSettings(const TLineData& oLineData, NSStringUtils::CStringBuilder& oBuilder)
|
||||
{
|
||||
if (ELineStyle2::NONE == oLineData.m_eStyle)
|
||||
{
|
||||
oBuilder.WriteString(L"<a:ln><a:noFill/></a:ln>");
|
||||
return;
|
||||
}
|
||||
|
||||
if (0 == nThick)
|
||||
int nThick{oLineData.m_nThick};
|
||||
|
||||
if (0 == oLineData.m_nThick)
|
||||
nThick = 100;
|
||||
|
||||
oBuilder.WriteString(L"<a:ln");
|
||||
|
||||
oBuilder.WriteString(L" w=\"" + std::to_wstring(Transform::HWPUINT2OOXML(nThick)) + L"\" cap=\"sq\"");
|
||||
|
||||
switch (eLineStyle)
|
||||
switch (oLineData.m_eStyle)
|
||||
{
|
||||
case ELineStyle2::DOUBLE_SLIM:
|
||||
{
|
||||
@ -1949,9 +1987,9 @@ void CConverter2OOXML::WriteLineSettings(ELineStyle2 eLineStyle, int nColor, int
|
||||
|
||||
oBuilder.WriteString(L">");
|
||||
|
||||
oBuilder.WriteString(L"<a:solidFill><a:srgbClr val=\"" + Transform::IntColorToHEX(nColor) + L"\"/></a:solidFill>");
|
||||
oBuilder.WriteString(L"<a:solidFill><a:srgbClr val=\"" + Transform::IntColorToHEX(oLineData.m_nColor) + L"\"/></a:solidFill>");
|
||||
|
||||
switch (eLineStyle)
|
||||
switch (oLineData.m_eStyle)
|
||||
{
|
||||
case ELineStyle2::DASH:
|
||||
{
|
||||
@ -1987,7 +2025,21 @@ void CConverter2OOXML::WriteLineSettings(ELineStyle2 eLineStyle, int nColor, int
|
||||
break;
|
||||
}
|
||||
|
||||
switch (nCompoundLineType)
|
||||
if (ELineArrowStyle::NORMAL != oLineData.m_eHeadStyle)
|
||||
{
|
||||
oBuilder.WriteString(L"<a:headEnd");
|
||||
WriteLineArrowStyles(oLineData.m_eHeadStyle, oLineData.m_eHeadSize, oBuilder);
|
||||
oBuilder.WriteString(L"/>");
|
||||
}
|
||||
|
||||
if (ELineArrowStyle::NORMAL != oLineData.m_eTailStyle)
|
||||
{
|
||||
oBuilder.WriteString(L"<a:tailEnd ");
|
||||
WriteLineArrowStyles(oLineData.m_eTailStyle, oLineData.m_eTailSize, oBuilder);
|
||||
oBuilder.WriteString(L"/>");
|
||||
}
|
||||
|
||||
switch (oLineData.m_nCompoundLineType)
|
||||
{
|
||||
case 0x00:
|
||||
{
|
||||
@ -2010,10 +2062,13 @@ void CConverter2OOXML::WriteBorderSettings(const CCtrlShapePic* pCtrlPic, NSStri
|
||||
return;
|
||||
|
||||
if (EHanType::HWP == m_pContext->GetType())
|
||||
WriteLineSettings(pCtrlPic->GetBorderLineStyle(), pCtrlPic->GetBorderColor(), pCtrlPic->GetBorderThick(), pCtrlPic->GetBorderCompoundLineType(), oBuilder);
|
||||
WriteLineSettings({pCtrlPic->GetBorderLineStyle(), pCtrlPic->GetBorderColor(),
|
||||
pCtrlPic->GetBorderThick(), pCtrlPic->GetBorderCompoundLineType()},
|
||||
oBuilder);
|
||||
else if (EHanType::HWPX == m_pContext->GetType() ||
|
||||
EHanType::HWPML == m_pContext->GetType())
|
||||
WriteLineSettings(pCtrlPic->GetLineStyle(), pCtrlPic->GetLineColor(), pCtrlPic->GetLineThick(), 1, oBuilder);
|
||||
WriteLineSettings({pCtrlPic->GetLineStyle(), pCtrlPic->GetLineColor(),
|
||||
pCtrlPic->GetLineThick(), 1}, oBuilder);
|
||||
}
|
||||
|
||||
void CConverter2OOXML::WriteAutoNumber(const CCtrlAutoNumber* pAutoNumber, short shParaShapeID, short shParaStyleID, short shCharShapeID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState)
|
||||
@ -2190,4 +2245,23 @@ HWP_STRING CConverter2OOXML::GetTempDirectory() const
|
||||
{
|
||||
return m_sTempDirectory;
|
||||
}
|
||||
|
||||
TLineData::TLineData(ELineStyle2 eStyle, int nColor,
|
||||
int nThick, HWP_BYTE nCompoundLineType,
|
||||
ELineArrowStyle eHeadStyle, ELineArrowSize eHeadSize,
|
||||
ELineArrowStyle eTailStyle, ELineArrowSize eTailSize)
|
||||
:m_eStyle(eStyle), m_nColor(nColor),
|
||||
m_nThick(nThick), m_nCompoundLineType(nCompoundLineType),
|
||||
m_eHeadStyle(eHeadStyle), m_eHeadSize(eHeadSize),
|
||||
m_eTailStyle(eTailStyle), m_eTailSize(eTailSize)
|
||||
{}
|
||||
|
||||
TLineData::TLineData(ELineStyle2 eStyle, int nColor,
|
||||
int nThick, HWP_BYTE nCompoundLineType)
|
||||
:m_eStyle(eStyle), m_nColor(nColor),
|
||||
m_nThick(nThick), m_nCompoundLineType(nCompoundLineType),
|
||||
m_eHeadStyle(ELineArrowStyle::NORMAL), m_eHeadSize(ELineArrowSize::SMALL_SMALL),
|
||||
m_eTailStyle(ELineArrowStyle::NORMAL), m_eTailSize(ELineArrowSize::SMALL_SMALL)
|
||||
{}
|
||||
|
||||
}
|
||||
|
||||
@ -30,6 +30,27 @@ struct TContentType
|
||||
HWP_STRING m_wsType;
|
||||
};
|
||||
|
||||
struct TLineData
|
||||
{
|
||||
ELineStyle2 m_eStyle;
|
||||
int m_nColor;
|
||||
int m_nThick;
|
||||
HWP_BYTE m_nCompoundLineType;
|
||||
|
||||
ELineArrowStyle m_eHeadStyle;
|
||||
ELineArrowSize m_eHeadSize;
|
||||
ELineArrowStyle m_eTailStyle;
|
||||
ELineArrowSize m_eTailSize;
|
||||
|
||||
TLineData(ELineStyle2 eStyle, int nColor,
|
||||
int nThick, HWP_BYTE nCompoundLineType,
|
||||
ELineArrowStyle eHeadStyle, ELineArrowSize eHeadSize,
|
||||
ELineArrowStyle eTailStyle, ELineArrowSize eTailSize);
|
||||
|
||||
TLineData(ELineStyle2 eStyle, int nColor,
|
||||
int nThick, HWP_BYTE nCompoundLineType);
|
||||
};
|
||||
|
||||
enum class ECellCreator
|
||||
{
|
||||
FILE,
|
||||
@ -108,7 +129,7 @@ class CConverter2OOXML
|
||||
void WriteText(const CParaText* pParaText, const VECTOR<TRangeTag>& arRangeTags, short shParaShapeID, short shParaStyleID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState);
|
||||
void WriteText(const HWP_STRING& wsText, short shParaShapeID, short shParaStyleID, short shCharShapeID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState, const CRunnerStyle& oExternalStyle = CRunnerStyle());
|
||||
void WriteLineSettings(const CCtrlGeneralShape* pCtrlGeneralShape, NSStringUtils::CStringBuilder& oBuilder);
|
||||
void WriteLineSettings(ELineStyle2 eLineStyle, int nColor, int nThick, HWP_BYTE nCompoundLineType, NSStringUtils::CStringBuilder& oBuilder);
|
||||
void WriteLineSettings(const TLineData& oLineData, NSStringUtils::CStringBuilder& oBuilder);
|
||||
void WriteBorderSettings(const CCtrlShapePic* pCtrlPic, NSStringUtils::CStringBuilder& oBuilder);
|
||||
|
||||
void WriteAutoNumber(const CCtrlAutoNumber* pAutoNumber, short shParaShapeID, short shParaStyleID, short shCharShapeID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState);
|
||||
|
||||
@ -91,8 +91,24 @@ void CCtrlGeneralShape::ParseChildren(CXMLReader& oReader, int nVersion, EHanTyp
|
||||
bool bHeadFill = false, bTailFill = false;
|
||||
|
||||
const std::string sNodeName{oReader.GetName()};
|
||||
const std::string sChildNodeName{oReader.GetName()};
|
||||
|
||||
if (GetNodeName(ENode::LineShape, eType) == sNodeName)
|
||||
//TODO:: выглядит не очень. Нужно вернуться и подумать как лучше иначе сделать
|
||||
if (EHanType::HWPML == eType && "DRAWINGOBJECT" == sChildNodeName)
|
||||
{
|
||||
WHILE_READ_NEXT_NODE_WITH_NAME(oReader)
|
||||
{
|
||||
if ("SHAPECOMPONENT" == sNodeName)
|
||||
CCtrlObjElement::ParseHWPMLElement(oReader);
|
||||
else
|
||||
ParseChildren(oReader, nVersion, EHanType::HWPML);
|
||||
}
|
||||
END_WHILE
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (GetNodeName(ENode::LineShape, eType) == sChildNodeName)
|
||||
{
|
||||
std::string sHeadStyle, sTailStyle;
|
||||
|
||||
@ -122,9 +138,9 @@ void CCtrlGeneralShape::ParseChildren(CXMLReader& oReader, int nVersion, EHanTyp
|
||||
m_eLineHead = ::HWP::GetLineArrowStyle(sHeadStyle, eType, bHeadFill);
|
||||
m_eLineTail = ::HWP::GetLineArrowStyle(sTailStyle, eType, bTailFill);
|
||||
}
|
||||
else if (GetNodeName(ENode::FillBrush, eType) == sNodeName)
|
||||
else if (GetNodeName(ENode::FillBrush, eType) == sChildNodeName)
|
||||
m_pFill = new CFill(oReader, eType);
|
||||
else if (GetNodeName(ENode::DrawText, eType) == sNodeName)
|
||||
else if (GetNodeName(ENode::DrawText, eType) == sChildNodeName)
|
||||
{
|
||||
m_nMaxTxtWidth = oReader.GetAttributeInt(GetAttributeName(EAttribute::LastWidth, eType));
|
||||
|
||||
@ -212,6 +228,26 @@ int CCtrlGeneralShape::GetLineThick() const
|
||||
return m_nLineThick;
|
||||
}
|
||||
|
||||
ELineArrowStyle CCtrlGeneralShape::GetLineHeadStyle() const
|
||||
{
|
||||
return m_eLineHead;
|
||||
}
|
||||
|
||||
ELineArrowSize CCtrlGeneralShape::GetLineHeadSize() const
|
||||
{
|
||||
return m_eLineHeadSz;
|
||||
}
|
||||
|
||||
ELineArrowStyle CCtrlGeneralShape::GetLineTailStyle() const
|
||||
{
|
||||
return m_eLineTail;
|
||||
}
|
||||
|
||||
ELineArrowSize CCtrlGeneralShape::GetLineTailSize() const
|
||||
{
|
||||
return m_eLineTailSz;
|
||||
}
|
||||
|
||||
CCtrlGeneralShape* CCtrlGeneralShape::Parse(CCtrlGeneralShape& oObj, int nSize, CHWPStream& oBuffer, int nOff, int nVersion)
|
||||
{
|
||||
oBuffer.SavePosition();
|
||||
|
||||
@ -76,6 +76,11 @@ public:
|
||||
int GetLineColor() const;
|
||||
int GetLineThick() const;
|
||||
|
||||
ELineArrowStyle GetLineHeadStyle() const;
|
||||
ELineArrowSize GetLineHeadSize () const;
|
||||
ELineArrowStyle GetLineTailStyle() const;
|
||||
ELineArrowSize GetLineTailSize () const;
|
||||
|
||||
static CCtrlGeneralShape* Parse(CCtrlGeneralShape& oObj, int nSize, CHWPStream& oBuffer, int nOff, int nVersion);
|
||||
static int ParseListHeaderApend(CCtrlGeneralShape& oObj, int nSize, CHWPStream& oBuffer, int nOff, int nVersion);
|
||||
static int ParseCtrl(CCtrlGeneralShape& oObj, int nSize, CHWPStream& oBuffer, int nOff, int nVersion);
|
||||
|
||||
@ -72,7 +72,7 @@ CShadow::CShadow(CXMLReader& oReader, EHanType eType)
|
||||
{
|
||||
START_READ_ATTRIBUTES(oReader)
|
||||
{
|
||||
if (GetAttributeName(EAttribute::Style, eType) == sAttributeName)
|
||||
if (GetAttributeName(EAttribute::StyleId, eType) == sAttributeName)
|
||||
m_nStyle = oReader.GetInt();
|
||||
else if (GetAttributeName(EAttribute::Alpha, eType) == sAttributeName)
|
||||
m_nTransparency = oReader.GetInt();
|
||||
|
||||
@ -26,17 +26,17 @@
|
||||
namespace HWP
|
||||
{
|
||||
CHWPPargraph::CHWPPargraph()
|
||||
: m_chBreakType(0), m_pLineSegs(nullptr), m_shParaShapeID(0), m_shParaStyleID(0)
|
||||
: m_shParaShapeID(0), m_shParaStyleID(0), m_chBreakType(0), m_pLineSegs(nullptr)
|
||||
{}
|
||||
|
||||
CHWPPargraph::CHWPPargraph(CXMLReader& oReader, int nVersion, EHanType eType)
|
||||
: m_chBreakType(0), m_pLineSegs(nullptr), m_shParaShapeID(0), m_shParaStyleID(0)
|
||||
: m_shParaShapeID(0), m_shParaStyleID(0), m_chBreakType(0), m_pLineSegs(nullptr)
|
||||
{
|
||||
START_READ_ATTRIBUTES(oReader)
|
||||
{
|
||||
if (GetAttributeName(EAttribute::ParaShape, eType) == sAttributeName)
|
||||
m_shParaShapeID = oReader.GetInt();
|
||||
else if (GetAttributeName(EAttribute::Style, eType) == sAttributeName)
|
||||
else if (GetAttributeName(EAttribute::StyleId, eType) == sAttributeName)
|
||||
m_shParaStyleID = oReader.GetInt();
|
||||
else if (GetAttributeName(EAttribute::PageBreak, eType) == sAttributeName)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user