sw/qa/extras/htmlexport/htmlexport.cxx | 31 ++++++++++++++ sw/source/filter/html/htmlnumwriter.cxx | 68 +++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-)
New commits: commit 013a4f1f5c9ea5fb511568c53a7e76d1b365a65d Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Thu May 13 11:45:37 2021 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Thu May 13 12:24:23 2021 +0200 sw XHTML export: fix handling of list labels This is building on top of commit 119b6876c92e4cdae44583c4b1b1419d3533e3ee (sw XHTML export: properly write <li>...</li> around multiple paragraphs, 2020-05-21), but the use-case here is a numbering with list labels only. The first problem was that the list label had its <li> suppressed, but not its </li>. The other problem is that <ul> can only have <li> child elements, so at least fix the case where the list only has list labels, in which case even <ul> and </ul> should be omitted. Change-Id: Id38978a40d8618f483e3e9d499f75838d5b2adb0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115543 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index 200aa3f9d3d9..1d56b2b23d3c 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -1386,6 +1386,37 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifObjdataPresentationDataSize) CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(565994), aOle1Reader.m_nPresentationDataSize); } +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testListHeading) +{ + // Given a document with a list heading: + loadURL("private:factory/swriter", nullptr); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("list header"); + SwDoc* pDoc = pWrtShell->GetDoc(); + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->nNode.GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + + // When exporting to ReqIF: + ExportToReqif(); + + // Then make sure the output is valid xhtml: + SvMemoryStream aStream; + HtmlExportTest::wrapFragment(maTempFile, aStream); + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aStream); + CPPUNIT_ASSERT(pDoc); + + // Without the accompanying fix in place, this test would have failed: + // - expected: <div><p>...</p></div> + // - actual : <div><ol><p>...</p></li></ol></div> + // because a </li> but no <li> is not well-formed and <ol> with a non-li children is invalid. + assertXPathContent(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p", "list header"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/html/htmlnumwriter.cxx b/sw/source/filter/html/htmlnumwriter.cxx index 6040dfecb14d..ddfedd760923 100644 --- a/sw/source/filter/html/htmlnumwriter.cxx +++ b/sw/source/filter/html/htmlnumwriter.cxx @@ -94,6 +94,39 @@ Writer& OutHTML_NumberBulletListStart( SwHTMLWriter& rWrt, return rWrt; } + if (rWrt.mbXHTML && !rInfo.IsNumbered()) + { + // If the list only consists of non-numbered text nodes, then don't start the list. + bool bAtLeastOneNumbered = false; + sal_uLong nPos = rWrt.m_pCurrentPam->GetPoint()->nNode.GetIndex() + 1; + while (true) + { + const SwNode* pNode = rWrt.m_pDoc->GetNodes()[nPos]; + if (!pNode->IsTextNode()) + { + break; + } + + const SwTextNode* pTextNode = pNode->GetTextNode(); + if (!pTextNode->GetNumRule()) + { + break; + } + + if (pTextNode->IsNumbered()) + { + bAtLeastOneNumbered = true; + break; + } + ++nPos; + } + + if (!bAtLeastOneNumbered) + { + return rWrt; + } + } + bool bStartValue = false; if( !bSameRule && rInfo.GetDepth() ) { @@ -283,7 +316,7 @@ Writer& OutHTML_NumberBulletListEnd( SwHTMLWriter& rWrt, if (rWrt.mbXHTML) { - if (bListEnd || (!bListEnd && rNextInfo.IsNumbered())) + if ((bListEnd && rInfo.IsNumbered()) || (!bListEnd && rNextInfo.IsNumbered())) { HTMLOutFuncs::Out_AsciiTag(rWrt.Strm(), OString(rWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_li), false); @@ -295,6 +328,39 @@ Writer& OutHTML_NumberBulletListEnd( SwHTMLWriter& rWrt, return rWrt; } + if (rWrt.mbXHTML && !rInfo.IsNumbered()) + { + // If the list only consisted of non-numbered text nodes, then don't end the list. + bool bAtLeastOneNumbered = false; + sal_uLong nPos = rWrt.m_pCurrentPam->GetPoint()->nNode.GetIndex() - 1; + while (true) + { + const SwNode* pNode = rWrt.m_pDoc->GetNodes()[nPos]; + if (!pNode->IsTextNode()) + { + break; + } + + const SwTextNode* pTextNode = pNode->GetTextNode(); + if (!pTextNode->GetNumRule()) + { + break; + } + + if (pTextNode->IsNumbered()) + { + bAtLeastOneNumbered = true; + break; + } + --nPos; + } + + if (!bAtLeastOneNumbered) + { + return rWrt; + } + } + OSL_ENSURE( rWrt.m_nLastParaToken == HtmlTokenId::NONE, "<PRE> was not closed before </OL>." ); sal_uInt16 nNextDepth = _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits