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