From ad8c163aca291a0998a5699d22634bdf0b32e1f1 Mon Sep 17 00:00:00 2001 From: Kulikova Svetlana Date: Fri, 7 May 2021 13:39:59 +0300 Subject: [PATCH] Fix bug 50229 Added conversion of the list to letters and roman numbers --- Fb2File/Fb2File.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/Fb2File/Fb2File.cpp b/Fb2File/Fb2File.cpp index be27dd0daa..bf607aafd6 100644 --- a/Fb2File/Fb2File.cpp +++ b/Fb2File/Fb2File.cpp @@ -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& 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"

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

");