mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 02:44:13 +08:00
125 lines
4.2 KiB
C++
125 lines
4.2 KiB
C++
#include "NumberingConverter.h"
|
|
|
|
namespace HWP
|
|
{
|
|
CNumberingConverter::CNumberingConverter()
|
|
{}
|
|
|
|
std::wstring HeadingTypeToWSTR(EHeadingType eHeadingType)
|
|
{
|
|
switch(eHeadingType)
|
|
{
|
|
case EHeadingType::NONE: return std::wstring();
|
|
case EHeadingType::OUTLINE: return std::wstring();
|
|
case EHeadingType::NUMBER: return std::wstring(L"decimal");
|
|
case EHeadingType::BULLET: return std::wstring(L"bullet");
|
|
}
|
|
}
|
|
|
|
int CNumberingConverter::CreateNumbering(const CHWPRecordNumbering* pNumbering, EHeadingType eHeadingType, NSStringUtils::CStringBuilder& oStringBuilder)
|
|
{
|
|
if (nullptr == pNumbering || eHeadingType == EHeadingType::NONE || EHeadingType::OUTLINE == eHeadingType)
|
|
return 0;
|
|
|
|
std::vector<const CHWPRecordNumbering*>::const_iterator itFound = std::find(m_arUsedNumbering.cbegin(), m_arUsedNumbering.cend(), pNumbering);
|
|
|
|
if (m_arUsedNumbering.cend() != itFound)
|
|
return itFound - m_arUsedNumbering.cbegin() + 1;
|
|
|
|
m_arUsedNumbering.push_back(pNumbering);
|
|
|
|
oStringBuilder.WriteString(L"<w:abstractNum w:abstractNumId=\"" + std::to_wstring(m_arUsedNumbering.size()) + L"\">");
|
|
|
|
const std::wstring wsNumFormat{HeadingTypeToWSTR(eHeadingType)};
|
|
|
|
std::wstring wsLvlText;
|
|
|
|
if (EHeadingType::NUMBER == eHeadingType)
|
|
{
|
|
for (short shIndex = 0; shIndex < 7; ++shIndex)
|
|
{
|
|
oStringBuilder.WriteString(L"<w:lvl w:ilvl=\"" + std::to_wstring(shIndex) + L"\">");
|
|
|
|
oStringBuilder.WriteString(L"<w:start w:val=\"" + std::to_wstring(pNumbering->GetStartNumber(shIndex)) + L"\"/>");
|
|
oStringBuilder.WriteString(L"<w:numFmt w:val=\"" + wsNumFormat + L"\"/>");
|
|
oStringBuilder.WriteString(L"<w:suff w:val=\"space\"/>");
|
|
|
|
wsLvlText = pNumbering->GetNumFormat(shIndex);
|
|
std::replace(wsLvlText.begin(), wsLvlText.end(), L'^', L'%');
|
|
oStringBuilder.WriteString(L"<w:lvlText w:val=\"" + wsLvlText + L"\"/>");
|
|
|
|
oStringBuilder.WriteString(L"<w:lvlJc w:val=\"");
|
|
switch(pNumbering->GetAlign(shIndex))
|
|
{
|
|
default:
|
|
case 0x0: oStringBuilder.WriteString(L"start"); break;
|
|
case 0x1: oStringBuilder.WriteString(L"center"); break;
|
|
case 0x2: oStringBuilder.WriteString(L"right"); break;
|
|
}
|
|
oStringBuilder.WriteString(L"\"/>");
|
|
|
|
oStringBuilder.WriteString(L"</w:lvl>");
|
|
}
|
|
}
|
|
else if (EHeadingType::BULLET == eHeadingType)
|
|
{
|
|
for (short shIndex = 0; shIndex < 9; ++shIndex)
|
|
{
|
|
oStringBuilder.WriteString(L"<w:lvl w:ilvl=\"" + std::to_wstring(shIndex) + L"\">");
|
|
|
|
oStringBuilder.WriteString(L"<w:numFmt w:val=\"" + wsNumFormat + L"\"/>");
|
|
oStringBuilder.WriteString(L"<w:suff w:val=\"space\"/>");
|
|
oStringBuilder.WriteString(L"<w:isLgl w:val=\"false\"/>");
|
|
|
|
oStringBuilder.WriteString(L"<w:lvlJc w:val=\"");
|
|
switch(pNumbering->GetAlign(shIndex))
|
|
{
|
|
default:
|
|
case 0x0: oStringBuilder.WriteString(L"start"); break;
|
|
case 0x1: oStringBuilder.WriteString(L"center"); break;
|
|
case 0x2: oStringBuilder.WriteString(L"right"); break;
|
|
}
|
|
oStringBuilder.WriteString(L"\"/>");
|
|
|
|
switch (shIndex % 3)
|
|
{
|
|
case 0:
|
|
{
|
|
oStringBuilder.WriteString(L"<w:lvlText w:val=\"");
|
|
oStringBuilder.AddCharSafe(0xF0B7);
|
|
oStringBuilder.WriteString(L"\"/>");
|
|
oStringBuilder.WriteString(L"<w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr>");
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
oStringBuilder.WriteString(L"<w:lvlText w:val=\"o\"/>");
|
|
oStringBuilder.WriteString(L"<w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/></w:rPr>");
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
oStringBuilder.WriteString(L"<w:lvlText w:val=\"");
|
|
oStringBuilder.AddCharSafe(0xF0A7);
|
|
oStringBuilder.WriteString(L"\"/>");
|
|
oStringBuilder.WriteString(L"<w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr>");
|
|
break;
|
|
}
|
|
}
|
|
|
|
oStringBuilder.WriteString(L"</w:lvl>");
|
|
}
|
|
}
|
|
|
|
oStringBuilder.WriteString(L"</w:abstractNum>");
|
|
|
|
return m_arUsedNumbering.size();
|
|
}
|
|
|
|
void CNumberingConverter::WriteEnding(NSStringUtils::CStringBuilder& oStringBuilder)
|
|
{
|
|
for (unsigned short ushIndex = 1; ushIndex <= m_arUsedNumbering.size(); ++ushIndex)
|
|
oStringBuilder.WriteString(L"<w:num w:numId=\"" + std::to_wstring(ushIndex) + L"\"><w:abstractNumId w:val=\"" + std::to_wstring(ushIndex) + L"\"/></w:num>");
|
|
}
|
|
}
|