summaryrefslogtreecommitdiff
path: root/sw/source/filter/html/htmlnumwriter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/html/htmlnumwriter.cxx')
-rw-r--r--sw/source/filter/html/htmlnumwriter.cxx50
1 files changed, 30 insertions, 20 deletions
diff --git a/sw/source/filter/html/htmlnumwriter.cxx b/sw/source/filter/html/htmlnumwriter.cxx
index 7df3402dda35..f41ac73929f9 100644
--- a/sw/source/filter/html/htmlnumwriter.cxx
+++ b/sw/source/filter/html/htmlnumwriter.cxx
@@ -84,7 +84,8 @@ void SwHTMLWriter::SetNextNumInfo( std::unique_ptr<SwHTMLNumRuleInfo> pNxt )
}
Writer& OutHTML_NumberBulletListStart( SwHTMLWriter& rWrt,
- const SwHTMLNumRuleInfo& rInfo )
+ const SwHTMLNumRuleInfo& rInfo,
+ bool& rAtLeastOneNumbered )
{
SwHTMLNumRuleInfo& rPrevInfo = rWrt.GetNumInfo();
bool bSameRule = rPrevInfo.GetNumRule() == rInfo.GetNumRule();
@@ -124,6 +125,7 @@ Writer& OutHTML_NumberBulletListStart( SwHTMLWriter& rWrt,
++nPos;
}
+ rAtLeastOneNumbered = bAtLeastOneNumbered;
if (!bAtLeastOneNumbered)
{
return rWrt;
@@ -321,25 +323,10 @@ Writer& OutHTML_NumberBulletListEnd( SwHTMLWriter& rWrt,
bool bSameRule = rNextInfo.GetNumRule() == rInfo.GetNumRule();
bool bListEnd = !bSameRule || rNextInfo.GetDepth() < rInfo.GetDepth() || rNextInfo.IsRestart();
- if (rWrt.mbXHTML)
- {
- // XHTML </li> for the list item content.
- if ((bListEnd && rInfo.IsNumbered()) || (!bListEnd && rNextInfo.IsNumbered()))
- {
- HTMLOutFuncs::Out_AsciiTag(rWrt.Strm(),
- OStringConcatenation(rWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_li), false);
- }
- }
-
- if (!bListEnd)
- {
- return rWrt;
- }
-
+ std::optional<bool> oAtLeastOneNumbered;
if (rWrt.mbXHTML && !rInfo.IsNumbered())
{
- // If the list only consisted of non-numbered text nodes, then don't end the list.
- bool bAtLeastOneNumbered = false;
+ oAtLeastOneNumbered = false;
SwNodeOffset nPos = rWrt.m_pCurrentPam->GetPoint()->nNode.GetIndex() - 1;
SwNumRule* pNumRule = nullptr;
while (true)
@@ -360,13 +347,36 @@ Writer& OutHTML_NumberBulletListEnd( SwHTMLWriter& rWrt,
pNumRule = pTextNode->GetNumRule();
if (pTextNode->IsNumbered())
{
- bAtLeastOneNumbered = true;
+ oAtLeastOneNumbered = true;
break;
}
--nPos;
}
+ }
- if (!bAtLeastOneNumbered)
+ if (rWrt.mbXHTML)
+ {
+ // The list is numbered if the previous text node is numbered or any other previous text
+ // node is numbered.
+ bool bPrevIsNumbered = rInfo.IsNumbered() || *oAtLeastOneNumbered;
+ // XHTML </li> for the list item content, if there is an open <li>.
+ if ((bListEnd && bPrevIsNumbered) || (!bListEnd && rNextInfo.IsNumbered()))
+ {
+ HTMLOutFuncs::Out_AsciiTag(
+ rWrt.Strm(), OStringConcatenation(rWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_li),
+ false);
+ }
+ }
+
+ if (!bListEnd)
+ {
+ return rWrt;
+ }
+
+ if (rWrt.mbXHTML && !rInfo.IsNumbered())
+ {
+ // If the list only consisted of non-numbered text nodes, then don't end the list.
+ if (!*oAtLeastOneNumbered)
{
return rWrt;
}