Fix bug 50229

Added conversion of the list to letters and roman numbers
This commit is contained in:
Kulikova Svetlana
2021-05-07 13:39:59 +03:00
parent 98d04eb7d7
commit ad8c163aca

View File

@ -1776,6 +1776,46 @@ void readStream(NSStringUtils::CStringBuilder& oXml, XmlUtils::CXmlLiteReader& o
} while (oIndexHtml.ReadNextSiblingNode2(nDeath));
}
std::wstring ToUpperRoman(int number)
{
if (number < 0 || number > 3999) return L"";
if (number < 1) return L"";
if (number >= 1000) return L"M" + ToUpperRoman(number - 1000);
if (number >= 900) return L"CM" + ToUpperRoman(number - 900);
if (number >= 500) return L"D" + ToUpperRoman(number - 500);
if (number >= 400) return L"CD" + ToUpperRoman(number - 400);
if (number >= 100) return L"C" + ToUpperRoman(number - 100);
if (number >= 90) return L"XC" + ToUpperRoman(number - 90);
if (number >= 50) return L"L" + ToUpperRoman(number - 50);
if (number >= 40) return L"XL" + ToUpperRoman(number - 40);
if (number >= 10) return L"X" + ToUpperRoman(number - 10);
if (number >= 9) return L"IX" + ToUpperRoman(number - 9);
if (number >= 5) return L"V" + ToUpperRoman(number - 5);
if (number >= 4) return L"IV" + ToUpperRoman(number - 4);
if (number >= 1) return L"I" + ToUpperRoman(number - 1);
return L"";
}
std::wstring ToLowerRoman(int number)
{
if (number < 0 || number > 3999) return L"";
if (number < 1) return L"";
if (number >= 1000) return L"m" + ToLowerRoman(number - 1000);
if (number >= 900) return L"cm" + ToLowerRoman(number - 900);
if (number >= 500) return L"d" + ToLowerRoman(number - 500);
if (number >= 400) return L"cd" + ToLowerRoman(number - 400);
if (number >= 100) return L"c" + ToLowerRoman(number - 100);
if (number >= 90) return L"xc" + ToLowerRoman(number - 90);
if (number >= 50) return L"l" + ToLowerRoman(number - 50);
if (number >= 40) return L"xl" + ToLowerRoman(number - 40);
if (number >= 10) return L"x" + ToLowerRoman(number - 10);
if (number >= 9) return L"ix" + ToLowerRoman(number - 9);
if (number >= 5) return L"v" + ToLowerRoman(number - 5);
if (number >= 4) return L"iv" + ToLowerRoman(number - 4);
if (number >= 1) return L"i" + ToLowerRoman(number - 1);
return L"";
}
void readLi(NSStringUtils::CStringBuilder& oXml, XmlUtils::CXmlLiteReader& oIndexHtml, std::vector<std::wstring>& arrBinary, bool bUl, bool bWasTable)
{
int nNum = 1;
@ -1787,7 +1827,41 @@ void readLi(NSStringUtils::CStringBuilder& oXml, XmlUtils::CXmlLiteReader& oInde
if (oIndexHtml.GetName() == L"li")
{
oXml.WriteString(L"<p>");
bUl ? oXml.AddCharSafe(183) : oXml.AddInt(nNum++);
if (bUl)
oXml.AddCharSafe(183);
else
{
std::wstring sPoint = std::to_wstring(nNum) + L'.';
while (oIndexHtml.MoveToNextAttribute())
{
if (oIndexHtml.GetName() == L"style")
{
std::wstring sText = oIndexHtml.GetText();
size_t nListType = sText.find(L"list-style-type: ");
if (nListType != std::wstring::npos)
{
nListType += 17;
size_t nListTypeEnd = sText.find(L';', nListType);
std::wstring sListType = sText.substr(nListType, nListTypeEnd - nListType);
if (sListType == L"decimal")
break;
else if (sListType == L"upper-alpha")
sPoint = std::wstring((nNum - 1) / 26 + 1, L'A' + (nNum - 1) % 26);
else if (sListType == L"lower-alpha")
sPoint = std::wstring((nNum - 1) / 26 + 1, L'a' + (nNum - 1) % 26);
else if (sListType == L"lower-roman")
sPoint = ToLowerRoman(nNum);
else if (sListType == L"upper-roman")
sPoint = ToUpperRoman(nNum);
sPoint += L'.';
}
}
}
oIndexHtml.MoveToElement();
nNum++;
oXml.WriteString(sPoint);
}
oXml.WriteString(L" ");
readStream(oXml, oIndexHtml, arrBinary, true, bWasTable);
oXml.WriteString(L"</p>");