From 81ec569f598cc267f964983509256c81910aec41 Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 20 Feb 2026 03:55:40 +0300 Subject: [PATCH] Fix bug #80228 --- HtmlFile2/HTMLReader.cpp | 16 ++++++++++++++++ HtmlFile2/Tags/MDTags.cpp | 8 ++++---- HtmlFile2/Writers/IWriter.h | 3 +++ HtmlFile2/Writers/MDWriter.cpp | 11 ++++++++--- HtmlFile2/Writers/MDWriter.h | 8 +++++--- HtmlFile2/Writers/OOXMLWriter.cpp | 5 +++++ HtmlFile2/Writers/OOXMLWriter.h | 2 ++ 7 files changed, 43 insertions(+), 10 deletions(-) diff --git a/HtmlFile2/HTMLReader.cpp b/HtmlFile2/HTMLReader.cpp index e8be041ddb..d732b45121 100644 --- a/HtmlFile2/HTMLReader.cpp +++ b/HtmlFile2/HTMLReader.cpp @@ -1009,6 +1009,19 @@ bool CHTMLReader::ReadTable(std::vector& arSelectors) if(m_oLightReader.IsEmptyNode()) return false; + if (nullptr != m_pWriter && !m_pWriter->SupportNestedTables()) + { + //Временно разруливаем это тут, так как по текущей логике мы сначала + //читаем всю таблицу и её вложенные элементы, а потом приступаем к конвертации, + //поэтому конвертору уже приходят вложенные таблицы, что в MD запрещено + for (std::vector::const_reverse_iterator itElement{arSelectors.crbegin() + 1}; itElement < arSelectors.crend(); ++itElement) + if (L"table" == itElement->m_wsName) + return false; + + if (nullptr != dynamic_cast(m_pWriter)) + ((CMDWriter*)m_pWriter)->EnteredTable(); + } + CStorageTable oTable; NSCSS::CCompiledStyle *pStyle = arSelectors.back().m_pCompiledStyle; @@ -1100,6 +1113,9 @@ bool CHTMLReader::ReadTable(std::vector& arSelectors) oTable.SetAlign(pStyle->m_oDisplay.GetHAlign().ToWString()); //------ + //TODO:: переписать работу с таблицами без предварительной конвертации ячеек и хранения их внутренних данных + //Читаем содержимое таблицы -> считаем ячейки -> нормализуем таблицу -> конвертим таблицу + int nDeath = m_oLightReader.GetDepth(); while(m_oLightReader.ReadNextSiblingNode(nDeath)) { diff --git a/HtmlFile2/Tags/MDTags.cpp b/HtmlFile2/Tags/MDTags.cpp index bb0c4e16bb..f47aa2ed22 100644 --- a/HtmlFile2/Tags/MDTags.cpp +++ b/HtmlFile2/Tags/MDTags.cpp @@ -53,7 +53,7 @@ bool CBold::Open(const std::vector& arSelectors, const return true; m_pWriter->WriteOpenSpecialString(L"**"); - m_pWriter->EneteredBold(); + m_pWriter->EnteredBold(); return true; } @@ -97,7 +97,7 @@ bool CItalic::Open(const std::vector& arSelectors, cons return true; m_pWriter->WriteOpenSpecialString(L"*"); - m_pWriter->EneteredItalic(); + m_pWriter->EnteredItalic(); return true; } @@ -124,7 +124,7 @@ bool CStrike::Open(const std::vector& arSelectors, cons return true; m_pWriter->WriteOpenSpecialString(L"~~"); - m_pWriter->EneteredStrike(); + m_pWriter->EnteredStrike(); return true; } @@ -309,7 +309,7 @@ CTable::CTable(CMDWriter* pWriter) bool CTable::Open(const std::vector& arSelectors, const boost::any& oExtraData) { - if (!ValidWriter() || m_pWriter->InTable()) //В MD не поддерживаются вложенные таблицы + if (!ValidWriter() /*|| m_pWriter->InTable()*/) //В MD не поддерживаются вложенные таблицы (пока разруливаем в парсере) return false; m_pWriter->WriteBreakLine(); diff --git a/HtmlFile2/Writers/IWriter.h b/HtmlFile2/Writers/IWriter.h index 5b7fca25d7..efd46f749c 100644 --- a/HtmlFile2/Writers/IWriter.h +++ b/HtmlFile2/Writers/IWriter.h @@ -28,6 +28,9 @@ public: virtual void RevertDataOutput() = 0; // Возвращаем место вывода к исходному virtual XmlString* GetCurrentDocument() const = 0; + + //TODO:: перенести разруливание вложенных таблиц в конвертацию после изменения принципа работы с таблицами + virtual bool SupportNestedTables() const = 0; }; } diff --git a/HtmlFile2/Writers/MDWriter.cpp b/HtmlFile2/Writers/MDWriter.cpp index fdd0fccf45..99e95b4529 100644 --- a/HtmlFile2/Writers/MDWriter.cpp +++ b/HtmlFile2/Writers/MDWriter.cpp @@ -202,6 +202,11 @@ XmlString* CMDWriter::GetCurrentDocument() const return m_arStates.top().m_pCurrentDocument; } +bool CMDWriter::SupportNestedTables() const +{ + return false; +} + void CMDWriter::WriteBreakLine(bool bNeedChecked) { if (bNeedChecked && !m_arStates.top().m_bNeedBreakLine) @@ -229,7 +234,7 @@ void CMDWriter::WriteBreakLine(bool bNeedChecked) m_arStates.top().m_wsLastSpecialString.clear(); } -void CMDWriter::EneteredBold() +void CMDWriter::EnteredBold() { m_arStates.top().m_bBold = true; } @@ -244,7 +249,7 @@ bool CMDWriter::IsBold() return m_arStates.top().m_bBold; } -void CMDWriter::EneteredItalic() +void CMDWriter::EnteredItalic() { m_arStates.top().m_bItalic = true; } @@ -259,7 +264,7 @@ bool CMDWriter::IsItalic() return m_arStates.top().m_bItalic; } -void CMDWriter::EneteredStrike() +void CMDWriter::EnteredStrike() { m_arStates.top().m_bStrike = true; } diff --git a/HtmlFile2/Writers/MDWriter.h b/HtmlFile2/Writers/MDWriter.h index 6ce4c62da9..413fb77029 100644 --- a/HtmlFile2/Writers/MDWriter.h +++ b/HtmlFile2/Writers/MDWriter.h @@ -65,17 +65,19 @@ public: XmlString* GetCurrentDocument() const override; + bool SupportNestedTables() const override; + void WriteBreakLine(bool bNeedChecked = true); - void EneteredBold(); + void EnteredBold(); void OutBold(); bool IsBold(); - void EneteredItalic(); + void EnteredItalic(); void OutItalic(); bool IsItalic(); - void EneteredStrike(); + void EnteredStrike(); void OutStrike(); bool IsStrike(); diff --git a/HtmlFile2/Writers/OOXMLWriter.cpp b/HtmlFile2/Writers/OOXMLWriter.cpp index ba5ebead7f..5c1ec4379e 100644 --- a/HtmlFile2/Writers/OOXMLWriter.cpp +++ b/HtmlFile2/Writers/OOXMLWriter.cpp @@ -1261,6 +1261,11 @@ XmlString* COOXMLWriter::GetCurrentDocument() const return m_arStates.top().m_pCurrentDocument; } +bool COOXMLWriter::SupportNestedTables() const +{ + return true; +} + const NSCSS::NSProperties::CPage* COOXMLWriter::GetPageData() const { return &m_oPageData; diff --git a/HtmlFile2/Writers/OOXMLWriter.h b/HtmlFile2/Writers/OOXMLWriter.h index 0d092896ad..1f9bd20fa0 100644 --- a/HtmlFile2/Writers/OOXMLWriter.h +++ b/HtmlFile2/Writers/OOXMLWriter.h @@ -200,6 +200,8 @@ public: XmlString& GetWebSettingsXml(); XmlString* GetCurrentDocument() const override; + bool SupportNestedTables() const override; + const NSCSS::NSProperties::CPage* GetPageData() const; NSFonts::IApplicationFonts* GetFonts();