Fix bugs in HWPML conversion

This commit is contained in:
Green
2025-09-23 16:24:48 +03:00
parent 3a047cfab0
commit 9453e9c87d
7 changed files with 162 additions and 22 deletions

View File

@ -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)
{

View File

@ -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)
{}
}

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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();

View File

@ -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)
{