diff --git a/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp b/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp index 9b1f76cf19..efcf81bf75 100644 --- a/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp +++ b/Common/3dParty/html/css/src/xhtml/CXmlElement.cpp @@ -395,8 +395,8 @@ std::wstring CXmlElement::ConvertPStyle() const } } - if (!sPBdr.empty()) - sPPr += L"" + sPBdr + L""; + //if (!sPBdr.empty()) + // sPPr += L"" + sPBdr + L""; return L"" + sPPr + L""; } diff --git a/Fb2File/Fb2File.cpp b/Fb2File/Fb2File.cpp index 6a2d0619b1..731d06ef3a 100644 --- a/Fb2File/Fb2File.cpp +++ b/Fb2File/Fb2File.cpp @@ -24,6 +24,21 @@ #define VALUE2STR(x) VALUE_TO_STRING(x) #endif +// Ячейка таблицы +struct CTc +{ + int i; + int j; + std::wstring sGridSpan = L"1"; + + CTc(int _i, int _j, const std::wstring& sColspan) : i(_i), j(_j), sGridSpan(sColspan) {} + + bool operator==(const CTc& c2) + { + return (i == c2.i && j == c2.j && sGridSpan == c2.sGridSpan); + } +}; + // Информация об авторе книги. Тэг author, translator struct SAuthor { @@ -582,7 +597,9 @@ public: oBuilder += L""; NSStringUtils::CStringBuilder oTmpBuilder; + std::vector mTable; int nGridCol = 0; + int i = 1; // Строка int nDeath = m_oLightReader.GetDepth(); while (m_oLightReader.ReadNextSiblingNode(nDeath)) { @@ -590,11 +607,55 @@ public: if (m_oLightReader.GetName() != L"tr" || m_oLightReader.IsEmptyNode()) continue; int nTCol = 0; + int j = 1; // Столбец oTmpBuilder += L""; int nTrDeath = m_oLightReader.GetDepth(); while (m_oLightReader.ReadNextSiblingNode(nTrDeath)) { - oTmpBuilder += L""; + int nColspan = 1; + int nRowspan = 1; + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"colspan") + nColspan = stoi(m_oLightReader.GetText()); + else if(m_oLightReader.GetName() == L"rowspan") + nRowspan = stoi(m_oLightReader.GetText()); + } + m_oLightReader.MoveToElement(); + + // Вставляем ячейки до + std::vector::iterator it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + std::vector::iterator it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + while(it1 != mTable.end() || it2 != mTable.end()) + { + oTmpBuilder.WriteString(L"sGridSpan : it2->sGridSpan); + oTmpBuilder.WriteString(sCol); + oTmpBuilder.WriteString(L"\"/>"); + j += stoi(sCol); + it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + } + + oTmpBuilder += L""; + if (nRowspan != 1) + { + oTmpBuilder.WriteString(L""); + std::wstring sColspan = std::to_wstring(nColspan); + if (nRowspan == 0) + mTable.push_back({0, j, sColspan}); + else + for (int k = i + 1; k < i + nRowspan; k++) + mTable.push_back({k, j, sColspan}); + } + if (nColspan != 1) + { + oTmpBuilder.WriteString(L""); + j += nColspan - 1; + } + oTmpBuilder.WriteString(L""); // Читаем th. Ячейка заголовка таблицы. Выравнивание посередине. Выделяется полужирным if (m_oLightReader.GetName() == L"th") { @@ -612,6 +673,21 @@ public: readP(L"", oTmpBuilder); } oTmpBuilder += L""; + j++; + + // Вставляем ячейки после + it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + while(it1 != mTable.end() || it2 != mTable.end()) + { + oTmpBuilder.WriteString(L"sGridSpan : it2->sGridSpan); + oTmpBuilder.WriteString(sCol); + oTmpBuilder.WriteString(L"\"/>"); + j += stoi(sCol); + it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + } } oTmpBuilder += L""; } @@ -1620,14 +1696,18 @@ void readStream(NSStringUtils::CStringBuilder& oXml, XmlUtils::CXmlLiteReader& o readStream(oXml, oIndexHtml, arrBinary, bWasP); oXml.WriteString(L""); } - else if (sName == L"th") - { - oXml.WriteString(L""); - readStream(oXml, oIndexHtml, arrBinary, true); - oXml.WriteString(L""); - } - else if (sName == L"td") + else if (sName == L"td" || sName == L"th") { + oXml.WriteString(L""); readStream(oXml, oIndexHtml, arrBinary, true); oXml.WriteString(L""); diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 431e43f286..70bfa9984f 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -1111,6 +1111,19 @@ private: NSStringUtils::CStringBuilder oBody; NSStringUtils::CStringBuilder oFoot; + // Начало таблицы + oXml->WriteString(L""); + NSCSS::CNode oLast = sSelectors.back(); + sSelectors.pop_back(); + NSCSS::CCompiledStyle oStyle = m_oStylesCalculator.GetCompiledStyle(sSelectors); + std::wstring sAlign = oStyle.m_pText.GetAlign(); + if(sAlign == L"left" || sAlign == L"center" || sAlign == L"right" || sAlign == L"both") + oXml->WriteString(L""); + oXml->WriteString(L""); + sSelectors.push_back(oLast); + if (!bNeedBorder && m_oStylesCalculator.GetCompiledStyle(sSelectors).m_pBorder.GetWidthBottomSideW() != L"0") + bNeedBorder = true; + int nDeath = m_oLightReader.GetDepth(); while(m_oLightReader.ReadNextSiblingNode(nDeath)) { @@ -1146,16 +1159,6 @@ private: sSelectors.pop_back(); } - // Начало таблицы - oXml->WriteString(L""); - NSCSS::CNode oLast = sSelectors.back(); - sSelectors.pop_back(); - NSCSS::CCompiledStyle oStyle = m_oStylesCalculator.GetCompiledStyle(sSelectors); - std::wstring sAlign = oStyle.m_pText.GetAlign(); - if(sAlign == L"left" || sAlign == L"center" || sAlign == L"right" || sAlign == L"both") - oXml->WriteString(L""); - oXml->WriteString(L""); - sSelectors.push_back(oLast); // Конец таблицы oXml->WriteString(oHead.GetData()); oXml->WriteString(oBody.GetData());