[Libreoffice-commits] core.git: sw/qa sw/source
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Thu May 13 10:25:06 UTC 2021
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 <vmiklos at collabora.com>
AuthorDate: Thu May 13 11:45:37 2021 +0200
Commit: Miklos Vajna <vmiklos at 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 <vmiklos at 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 =
More information about the Libreoffice-commits
mailing list